diff --git a/src/main/java/io/wispforest/affinity/blockentity/impl/AffineInfuserBlockEntity.java b/src/main/java/io/wispforest/affinity/blockentity/impl/AffineInfuserBlockEntity.java index 592c4a5c..b5c71152 100644 --- a/src/main/java/io/wispforest/affinity/blockentity/impl/AffineInfuserBlockEntity.java +++ b/src/main/java/io/wispforest/affinity/blockentity/impl/AffineInfuserBlockEntity.java @@ -4,10 +4,12 @@ import io.wispforest.affinity.blockentity.template.TickedBlockEntity; import io.wispforest.affinity.object.AffinityBlocks; import io.wispforest.affinity.object.AffinityEnchantments; +import io.wispforest.affinity.object.AffinityStatusEffects; import net.minecraft.block.BlockState; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.ItemEntity; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.decoration.ItemFrameEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; @@ -38,6 +40,11 @@ public void tickServer() { for (var entity : this.world.getNonSpectatingEntities(Entity.class, searchArea)) { if (currentRepairCost.getValue() > this.flux() - REPAIR_COST_PER_ITEM) break; + if (entity instanceof LivingEntity living && living.hasStatusEffect(AffinityStatusEffects.AFFINE) && living.getMaxHealth() > living.getHealth()) { + ((LivingEntity) entity).heal(1); + currentRepairCost.add(REPAIR_COST_PER_ITEM); + } + if (entity instanceof PlayerEntity) { entity.getItemsEquipped().forEach(AffineInfuserBlockEntity::repairIfEnchanted); } else if (entity instanceof ItemFrameEntity frame) { diff --git a/src/main/java/io/wispforest/affinity/datagen/AffinityBlockStateDefinitionProvider.java b/src/main/java/io/wispforest/affinity/datagen/AffinityBlockStateDefinitionProvider.java index d1240858..f6a6fea2 100644 --- a/src/main/java/io/wispforest/affinity/datagen/AffinityBlockStateDefinitionProvider.java +++ b/src/main/java/io/wispforest/affinity/datagen/AffinityBlockStateDefinitionProvider.java @@ -51,7 +51,8 @@ public void generateItemModels(ItemModelGenerator generator) { generated(generator, AZALEA_FLOWERS, AETHUM_FLUX_BOTTLE, AZALEA_BOAT, MILDLY_ATTUNED_AMETHYST_SHARD, FAIRLY_ATTUNED_AMETHYST_SHARD, GREATLY_ATTUNED_AMETHYST_SHARD, STONE_SOCLE_ORNAMENT, PRISMARINE_SOCLE_ORNAMENT, PURPUR_SOCLE_ORNAMENT, - AETHUM_MAP_PROTOTYPE, REALIZED_AETHUM_MAP, ANTHRACITE_POWDER, RESPLENDENT_GEM, ECHO_SHARD); + AETHUM_MAP_PROTOTYPE, REALIZED_AETHUM_MAP, ANTHRACITE_POWDER, RESPLENDENT_GEM, ECHO_SHARD, + AFFINITEA); handheld(generator, COLLECTION_STAFF, WAND_OF_INQUIRY); diff --git a/src/main/java/io/wispforest/affinity/item/AffiniteaItem.java b/src/main/java/io/wispforest/affinity/item/AffiniteaItem.java new file mode 100644 index 00000000..415e0a0a --- /dev/null +++ b/src/main/java/io/wispforest/affinity/item/AffiniteaItem.java @@ -0,0 +1,30 @@ +package io.wispforest.affinity.item; + +import io.wispforest.affinity.object.AffinityItems; +import io.wispforest.affinity.object.AffinityStatusEffects; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.item.FoodComponent; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.sound.SoundEvent; +import net.minecraft.util.UseAction; + +public class AffiniteaItem extends Item { + public AffiniteaItem() { + super(AffinityItems.settings(0) + .food(new FoodComponent.Builder() + .statusEffect(new StatusEffectInstance(AffinityStatusEffects.AFFINE, 300 * 20), 1.0F) + .alwaysEdible() + .build())); + } + + @Override + public UseAction getUseAction(ItemStack stack) { + return UseAction.DRINK; + } + + @Override + public SoundEvent getEatSound() { + return getDrinkSound(); + } +} diff --git a/src/main/java/io/wispforest/affinity/object/AffinityItems.java b/src/main/java/io/wispforest/affinity/object/AffinityItems.java index d0136455..91e5fe83 100644 --- a/src/main/java/io/wispforest/affinity/object/AffinityItems.java +++ b/src/main/java/io/wispforest/affinity/object/AffinityItems.java @@ -48,6 +48,7 @@ public class AffinityItems implements ItemRegistryContainer { public static final Item AZALEA_BOAT = new BoatItem(AffinityBlocks.AZALEA_BOAT_TYPE, settings(AffinityItemGroup.NATURE).maxCount(1)); public static final Item ECHO_SHARD = new EchoShardItem(); + public static final Item AFFINITEA = new AffiniteaItem(); public static OwoItemSettings settings(int tab) { return new OwoItemSettings().tab(tab).group(Affinity.AFFINITY_GROUP); diff --git a/src/main/java/io/wispforest/affinity/object/AffinityStatusEffects.java b/src/main/java/io/wispforest/affinity/object/AffinityStatusEffects.java index 13d2ea25..6212139d 100644 --- a/src/main/java/io/wispforest/affinity/object/AffinityStatusEffects.java +++ b/src/main/java/io/wispforest/affinity/object/AffinityStatusEffects.java @@ -25,6 +25,7 @@ public class AffinityStatusEffects { public static final StatusEffect IMPENDING_DOOM = new ImpendingDoomStatusEffect(StatusEffectCategory.HARMFUL, 0x000000); public static final StatusEffect BASTION_REGENERATION = new BastionRegeneration(StatusEffectCategory.BENEFICIAL, 0xfd5c5b); public static final StatusEffect BANISHED = new BanishedStatusEffect(StatusEffectCategory.BENEFICIAL, 0xc9b6b3); + public static final StatusEffect AFFINE = new AffinityStatusEffect(StatusEffectCategory.BENEFICIAL, 0x0000ff); public static final StatusEffect STEADFAST = new AffinityStatusEffect(StatusEffectCategory.BENEFICIAL, 0x222222) .addAttributeModifier( @@ -49,6 +50,7 @@ public static void register() { Registry.register(Registry.STATUS_EFFECT, Affinity.id("dripping"), DRIPPING); Registry.register(Registry.STATUS_EFFECT, Affinity.id("bastion_regeneration"), BASTION_REGENERATION); + Registry.register(Registry.STATUS_EFFECT, Affinity.id("affine"), AFFINE); Registry.register(Registry.POTION, Affinity.id("dubious"), PotionMixture.DUBIOUS_POTION); Registry.register(Registry.RECIPE_SERIALIZER, Affinity.id("crafting_special_potiondye"), GlowingPotionDyeRecipe.SERIALIZER); diff --git a/src/main/java/io/wispforest/affinity/statuseffects/BanishedStatusEffect.java b/src/main/java/io/wispforest/affinity/statuseffects/BanishedStatusEffect.java index 8f802b7d..8f6bf52d 100644 --- a/src/main/java/io/wispforest/affinity/statuseffects/BanishedStatusEffect.java +++ b/src/main/java/io/wispforest/affinity/statuseffects/BanishedStatusEffect.java @@ -7,7 +7,9 @@ import io.wispforest.affinity.misc.potion.PotionMixture; import io.wispforest.affinity.object.AffinityParticleSystems; import io.wispforest.affinity.object.AffinityStatusEffects; +import net.fabricmc.api.EnvType; import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.attribute.AttributeContainer; import net.minecraft.entity.effect.StatusEffectCategory; @@ -27,12 +29,13 @@ public BanishedStatusEffect(StatusEffectCategory category, int color) { } static { - ItemTooltipCallback.EVENT.register((stack, context, lines) -> { - if (PotionUtil.getPotionEffects(stack).stream().noneMatch(x -> x.getEffectType() == AffinityStatusEffects.BANISHED)) return; - if (!stack.has(PotionMixture.EXTRA_DATA)) return; + if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) + ItemTooltipCallback.EVENT.register((stack, context, lines) -> { + if (PotionUtil.getPotionEffects(stack).stream().noneMatch(x -> x.getEffectType() == AffinityStatusEffects.BANISHED)) return; + if (!stack.has(PotionMixture.EXTRA_DATA)) return; - EchoShardItem.formatLocationTooltip(stack.get(PotionMixture.EXTRA_DATA), lines); - }); + EchoShardItem.formatLocationTooltip(stack.get(PotionMixture.EXTRA_DATA), lines); + }); } @Override diff --git a/src/main/resources/assets/affinity/lang/en_us.json b/src/main/resources/assets/affinity/lang/en_us.json index 961334a6..82dd9b89 100644 --- a/src/main/resources/assets/affinity/lang/en_us.json +++ b/src/main/resources/assets/affinity/lang/en_us.json @@ -69,6 +69,7 @@ "item.affinity.aethum_flux_bottle": "Bottle of Aethum Flux", "item.affinity.resplendent_gem": "Resplendent Gem", "item.affinity.echo_shard": "Echo Shard", + "item.affinity.affinitea": "Affinitea", "text.affinity.attuned_shard_range": "Range: ", "text.affinity.attuned_shard_range.value": "%d blocks", @@ -120,6 +121,7 @@ "effect.affinity.dripping": "Dripping", "effect.affinity.bastion_regeneration": "Bastion", + "effect.affinity.affine": "Affine", "effect.affinity.life_leech": "Life Leech", "item.minecraft.potion.effect.life_leech": "Potion of Life Leech", diff --git a/src/main/resources/assets/affinity/models/item/affinitea.json b/src/main/resources/assets/affinity/models/item/affinitea.json new file mode 100644 index 00000000..80bba3fd --- /dev/null +++ b/src/main/resources/assets/affinity/models/item/affinitea.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "affinity:item/affinitea" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/affinity/textures/item/affinitea.png b/src/main/resources/assets/affinity/textures/item/affinitea.png new file mode 100644 index 00000000..4ff9da9b Binary files /dev/null and b/src/main/resources/assets/affinity/textures/item/affinitea.png differ diff --git a/src/main/resources/assets/affinity/textures/mob_effect/affine.png b/src/main/resources/assets/affinity/textures/mob_effect/affine.png new file mode 100644 index 00000000..4ff9da9b Binary files /dev/null and b/src/main/resources/assets/affinity/textures/mob_effect/affine.png differ