From b033d1dc7a3015afdadf71aa842b867198fed0a5 Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 1 Oct 2024 02:45:58 +0100 Subject: [PATCH] Updating to 1.21 (part 6) --- .../ability/UnicornCastingAbility.java | 14 ++- .../magic/spell/effect/ShieldSpell.java | 4 +- .../unicopia/block/HiveBlock.java | 1 - .../unicopia/client/URenderers.java | 8 +- .../SpellbookProfilePageContent.java | 14 +-- .../render/entity/FairyEntityRenderer.java | 1 - .../client/sound/FadeOutSoundInstance.java | 7 ++ .../client/sound/MagicAuraSoundInstance.java | 12 +-- .../unicopia/entity/mob/ButterflyEntity.java | 1 + .../unicopia/entity/player/Acrobatics.java | 6 +- .../unicopia/entity/player/PlayerPhysics.java | 9 +- .../unicopia/item/AlicornAmuletItem.java | 17 +--- .../unicopia/item/AmuletItem.java | 24 ++--- .../unicopia/item/BellItem.java | 60 +++++------ .../unicopia/item/ChameleonItem.java | 58 ----------- .../unicopia/item/ChargeableItem.java | 64 ------------ .../unicopia/item/DamageChecker.java | 7 ++ .../unicopia/item/EnchantedStaffItem.java | 69 ++++++------- .../unicopia/item/FilledJarItem.java | 18 ++-- .../unicopia/item/PegasusAmuletItem.java | 23 +---- .../unicopia/item/ZapAppleItem.java | 21 ++-- .../unicopia/item/component/Appearance.java | 77 +++++++++++++++ .../unicopia/item/component/Charges.java | 99 +++++++++++++++++++ .../item/component/UDataComponentTypes.java | 2 + .../enchantment/GemFindingEnchantment.java | 2 - .../unicopia/item/group/UItemGroups.java | 6 +- .../unicopia/mixin/MixinItemStack.java | 11 +++ .../mixin/client/MixinItemModels.java | 9 +- .../sodium/MixinSodiumWorldRenderer.java | 1 - .../unicopia/recipe/JarExtractRecipe.java | 6 +- .../unicopia/recipe/JarInsertRecipe.java | 4 +- .../unicopia/recipe/ZapAppleRecipe.java | 6 +- .../unicopia/util/ColorHelper.java | 5 - .../unicopia/util/PsyFluidHelper.java | 52 ++++++---- 34 files changed, 382 insertions(+), 336 deletions(-) delete mode 100644 src/main/java/com/minelittlepony/unicopia/item/ChameleonItem.java delete mode 100644 src/main/java/com/minelittlepony/unicopia/item/ChargeableItem.java create mode 100644 src/main/java/com/minelittlepony/unicopia/item/DamageChecker.java create mode 100644 src/main/java/com/minelittlepony/unicopia/item/component/Appearance.java create mode 100644 src/main/java/com/minelittlepony/unicopia/item/component/Charges.java diff --git a/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java index 64f70d7c..782a8c65 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java @@ -12,7 +12,7 @@ import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.item.AmuletItem; -import com.minelittlepony.unicopia.item.ChargeableItem; +import com.minelittlepony.unicopia.item.component.Charges; import com.minelittlepony.unicopia.particle.MagicParticleEffect; import com.minelittlepony.unicopia.util.TraceHelper; import com.minelittlepony.unicopia.util.VecHelper; @@ -56,7 +56,7 @@ public class UnicornCastingAbility extends AbstractSpellCastingAbility { if (amulet.getResult().isAccepted()) { float manaLevel = player.getMagicalReserves().getMana().get(); - return Math.min(manaLevel, ((AmuletItem)amulet.getValue().getItem()).getChargeRemainder(amulet.getValue())); + return Math.min(manaLevel, Charges.of(amulet.getValue()).energy()); } TypedActionResult> spell = player.getCharms().getSpellInHand(false); @@ -84,13 +84,11 @@ public class UnicornCastingAbility extends AbstractSpellCastingAbility { if (amulet.getResult().isAccepted()) { ItemStack stack = amulet.getValue(); - ChargeableItem item = (ChargeableItem)stack.getItem(); - - if (item.canCharge(stack)) { - float amount = -Math.min(player.getMagicalReserves().getMana().get(), item.getChargeRemainder(stack)); + if (Charges.of(stack).canHoldCharge()) { + int amount = -(int)Math.min(player.getMagicalReserves().getMana().get(), Charges.of(stack).energy()); if (amount < 0) { - ChargeableItem.consumeEnergy(stack, amount); + Charges.discharge(stack, amount); player.getMagicalReserves().getMana().add(amount); player.asWorld().playSoundFromEntity(null, player.asEntity(), USounds.ITEM_AMULET_RECHARGE, SoundCategory.PLAYERS, 1, 1); } @@ -144,7 +142,7 @@ public class UnicornCastingAbility extends AbstractSpellCastingAbility { ItemStack stack = player.asEntity().getStackInHand(Hand.MAIN_HAND); if (stack.getItem() instanceof AmuletItem) { - if (((AmuletItem)stack.getItem()).isChargable()) { + if (Charges.of(stack).canHoldCharge()) { return TypedActionResult.consume(stack); } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/ShieldSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/ShieldSpell.java index 484e4473..6ed0cf65 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/ShieldSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/ShieldSpell.java @@ -23,7 +23,6 @@ import com.minelittlepony.unicopia.particle.MagicParticleEffect; import com.minelittlepony.unicopia.particle.ParticleUtils; import com.minelittlepony.unicopia.projectile.ProjectileUtil; import com.minelittlepony.unicopia.server.world.Ether; -import com.minelittlepony.unicopia.util.ColorHelper; import com.minelittlepony.unicopia.util.Lerp; import com.minelittlepony.unicopia.util.shape.Sphere; @@ -40,6 +39,7 @@ import net.minecraft.entity.passive.PassiveEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.vehicle.AbstractMinecartEntity; import net.minecraft.entity.vehicle.BoatEntity; +import net.minecraft.util.math.ColorHelper.Argb; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; @@ -91,7 +91,7 @@ public class ShieldSpell extends AbstractSpell { source.spawnParticles(origin, new Sphere(true, radius.getValue()), (int)(radius.getValue() * 2), pos -> { int hornColor = MineLPDelegate.getInstance().getMagicColor(source.getOriginatingCaster().asEntity()); - source.addParticle(new MagicParticleEffect(ColorHelper.lerp(0.6F, getType().getColor(), hornColor)), pos, Vec3d.ZERO); + source.addParticle(new MagicParticleEffect(Argb.lerp(0.6F, getType().getColor(), hornColor)), pos, Vec3d.ZERO); if (source.asWorld().random.nextInt(10) == 0 && source.asWorld().random.nextFloat() < source.getCorruption().getScaled(1)) { ParticleUtils.spawnParticle(source.asWorld(), new LightningBoltParticleEffect(true, 3, 2, 0.1F, Optional.empty()), pos, Vec3d.ZERO); diff --git a/src/main/java/com/minelittlepony/unicopia/block/HiveBlock.java b/src/main/java/com/minelittlepony/unicopia/block/HiveBlock.java index 844aea45..f55717c9 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/HiveBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/HiveBlock.java @@ -100,7 +100,6 @@ public class HiveBlock extends ConnectingBlock implements BlockEntityProvider { } } - @Deprecated @Override public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { if (state.get(CONSUMING)) { diff --git a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java index b77f9da8..92306528 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java +++ b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java @@ -31,10 +31,10 @@ import com.minelittlepony.unicopia.client.render.spell.SpellRendererFactory; import com.minelittlepony.unicopia.entity.mob.ButterflyEntity; import com.minelittlepony.unicopia.entity.mob.UEntities; import com.minelittlepony.unicopia.item.ButterflyItem; -import com.minelittlepony.unicopia.item.ChameleonItem; import com.minelittlepony.unicopia.item.EnchantableItem; import com.minelittlepony.unicopia.item.FancyBedItem; import com.minelittlepony.unicopia.item.UItems; +import com.minelittlepony.unicopia.item.component.Appearance; import com.minelittlepony.unicopia.particle.UParticles; import com.terraformersmc.terraform.boat.api.client.TerraformBoatClientHelper; @@ -207,7 +207,7 @@ public interface URenderers { VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); ClientWorld world = MinecraftClient.getInstance().world; - if (ChameleonItem.hasAppearance(stack)) { + if (Appearance.hasAppearance(stack)) { matrices.push(); if (mode.isFirstPerson()) { matrices.translate(0.05, 0.06, 0.06); @@ -221,9 +221,7 @@ public interface URenderers { float scale = 0.5F; matrices.scale(scale, scale, scale); - - ItemStack appearance = ChameleonItem.getAppearanceStack(stack); - renderer.renderItem(appearance, mode, light, overlay, matrices, immediate, world, 0); + renderer.renderItem(Appearance.upwrapAppearance(stack), mode, light, overlay, matrices, immediate, world, 0); matrices.pop(); } renderer.renderItem(UItems.EMPTY_JAR.getDefaultStack(), mode, light, overlay, matrices, vertices, world, 0); diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/spellbook/SpellbookProfilePageContent.java b/src/main/java/com/minelittlepony/unicopia/client/gui/spellbook/SpellbookProfilePageContent.java index 3578241d..ddf7cc6f 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/spellbook/SpellbookProfilePageContent.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/spellbook/SpellbookProfilePageContent.java @@ -8,7 +8,6 @@ import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.ability.magic.SpellPredicate; import com.minelittlepony.unicopia.client.gui.*; import com.minelittlepony.unicopia.entity.player.*; -import com.minelittlepony.unicopia.util.ColorHelper; import com.sollace.romanizer.api.Romanizer; import net.minecraft.client.MinecraftClient; @@ -17,6 +16,7 @@ import net.minecraft.client.gui.DrawContext; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; import net.minecraft.util.Identifier; +import net.minecraft.util.math.ColorHelper.Argb; import net.minecraft.util.math.MathHelper; public class SpellbookProfilePageContent implements SpellbookChapterList.Content { @@ -74,8 +74,8 @@ public class SpellbookProfilePageContent implements SpellbookChapterList.Content currentScaledLevel, currentCorruption ), SpellbookScreen.TITLE_X, y + 13, 0.8F, - ColorHelper.lerp(currentCorruption, - ColorHelper.lerp(currentScaledLevel, 0xAA0040FF, 0xAAA0AA40), + Argb.lerp(currentCorruption, + Argb.lerp(currentScaledLevel, 0xAA0040FF, 0xAAA0AA40), 0xAAFF0000 ) ); @@ -106,7 +106,7 @@ public class SpellbookProfilePageContent implements SpellbookChapterList.Content int xpColor = 0xAA0040FF | ((int)((0.3F + 0.7F * xpPercentage) * 0xFF) & 0xFF) << 16; int manaColor = 0xFF00F040; if (pony.getSpellSlot().get(SpellPredicate.IS_CORRUPTING).isPresent()) { - manaColor = ColorHelper.lerp(Math.abs(MathHelper.sin(pony.asEntity().age / 15F)), manaColor, 0xFF0030F0); + manaColor = Argb.lerp(Math.abs(MathHelper.sin(pony.asEntity().age / 15F)), manaColor, 0xFF0030F0); } manaColor |= (int)((0.3F + 0.7F * alphaF) * 0x40) << 16; @@ -120,10 +120,10 @@ public class SpellbookProfilePageContent implements SpellbookChapterList.Content growth = MathHelper.sin(delta / 10F) * 2; - int bandAColor = ColorHelper.lerp(currentCorruption, 0xAAFFAA60, 0xFF000030); - int bandBColor = ColorHelper.lerp(currentCorruption, 0xFFFFFF40, 0x00000020); + int bandAColor = Argb.lerp(currentCorruption, 0xAAFFAA60, 0xFF000030); + int bandBColor = Argb.lerp(currentCorruption, 0xFFFFFF40, 0x00000020); - float glowSize = ColorHelper.lerp(currentCorruption, 8, -8); + float glowSize = Argb.lerp(currentCorruption, 8, -8); for (int i = 0; i < rayCount; i++) { double rad = (radius + glowSize) * 0.8F + growth - (i % 2) * 5; diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/entity/FairyEntityRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/entity/FairyEntityRenderer.java index dea9dc81..8a20747c 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/entity/FairyEntityRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/entity/FairyEntityRenderer.java @@ -11,7 +11,6 @@ import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.screen.PlayerScreenHandler; import net.minecraft.util.Identifier; -import net.minecraft.util.math.ColorHelper; import net.minecraft.util.math.ColorHelper.Argb; public class FairyEntityRenderer extends MobEntityRenderer { diff --git a/src/main/java/com/minelittlepony/unicopia/client/sound/FadeOutSoundInstance.java b/src/main/java/com/minelittlepony/unicopia/client/sound/FadeOutSoundInstance.java index e9321445..85ee4a20 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/sound/FadeOutSoundInstance.java +++ b/src/main/java/com/minelittlepony/unicopia/client/sound/FadeOutSoundInstance.java @@ -5,6 +5,7 @@ import net.minecraft.client.sound.MovingSoundInstance; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvent; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.random.Random; public abstract class FadeOutSoundInstance extends MovingSoundInstance { @@ -30,6 +31,12 @@ public abstract class FadeOutSoundInstance extends MovingSoundInstance { setTargetVolume(volume); } + protected void setPosition(Vec3d pos) { + x = pos.x; + y = pos.y; + z = pos.z; + } + @Override public boolean shouldAlwaysPlay() { return true; diff --git a/src/main/java/com/minelittlepony/unicopia/client/sound/MagicAuraSoundInstance.java b/src/main/java/com/minelittlepony/unicopia/client/sound/MagicAuraSoundInstance.java index c1e595d2..ab81defd 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/sound/MagicAuraSoundInstance.java +++ b/src/main/java/com/minelittlepony/unicopia/client/sound/MagicAuraSoundInstance.java @@ -5,7 +5,6 @@ import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.item.enchantment.UEnchantments; import net.minecraft.sound.SoundCategory; -import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.random.Random; public class MagicAuraSoundInstance extends FadeOutSoundInstance { @@ -16,21 +15,14 @@ public class MagicAuraSoundInstance extends FadeOutSoundInstance { super(USounds.ITEM_MAGIC_AURA, category, 1, random); this.relative = false; this.living = living; - - Vec3d pos = living.getOriginVector(); - x = pos.x; - y = pos.y; - z = pos.z; + setPosition(living.getOriginVector()); } @Override protected boolean shouldKeepPlaying() { var data = living.getEnchants().getOrEmpty(UEnchantments.GEM_FINDER); - Vec3d pos = living.getOriginVector(); - x = pos.x; - y = pos.y; - z = pos.z; + setPosition(living.getOriginVector()); if (!living.asEntity().isRemoved() && data.isPresent()) { float level = data.get().level; diff --git a/src/main/java/com/minelittlepony/unicopia/entity/mob/ButterflyEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/mob/ButterflyEntity.java index ac9d2edf..490b33d5 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/mob/ButterflyEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/mob/ButterflyEntity.java @@ -389,6 +389,7 @@ public class ButterflyEntity extends AmbientEntity { public static final Variant[] VALUES = Variant.values(); + @SuppressWarnings("deprecation") public static final EnumCodec CODEC = StringIdentifiable.createCodec(Variant::values); public static final PacketCodec PACKET_CODEC = PacketCodecs.indexed(i -> VALUES[i], Variant::ordinal); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java index ba3b9a15..2c045abc 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java @@ -199,12 +199,14 @@ public class Acrobatics implements Tickable, NbtSerialisable { @Override public void toNBT(NbtCompound compound, WrapperLookup lookup) { compound.putInt("ticksHanging", ticksHanging); - BLOCK_POS.writeOptional("hangingPosition", compound, getHangingPosition(), lookup); + getHangingPosition().ifPresent(pos -> { + compound.put("hangingPosition", NbtSerialisable.encode(BlockPos.CODEC, pos)); + }); } @Override public void fromNBT(NbtCompound compound, WrapperLookup lookup) { ticksHanging = compound.getInt("ticksHanging"); - hangingPos.set(NbtSerialisable.BLOCK_POS.readOptional("hangingPosition", compound, lookup)); + hangingPos.set(NbtSerialisable.decode(BlockPos.CODEC, compound.get("hangingPosition"))); } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java index 67b932da..3a947793 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java @@ -21,8 +21,8 @@ import com.minelittlepony.unicopia.entity.effect.EffectUtils; import com.minelittlepony.unicopia.entity.player.MagicReserves.Bar; import com.minelittlepony.unicopia.input.Heuristic; import com.minelittlepony.unicopia.item.AmuletItem; -import com.minelittlepony.unicopia.item.ChargeableItem; import com.minelittlepony.unicopia.item.UItems; +import com.minelittlepony.unicopia.item.component.Charges; import com.minelittlepony.unicopia.item.enchantment.EnchantmentUtil; import com.minelittlepony.unicopia.item.enchantment.UEnchantments; import com.minelittlepony.unicopia.network.Channel; @@ -504,7 +504,8 @@ public class PlayerPhysics extends EntityPhysics implements Tickab private void tickArtificialFlight(MutableVector velocity) { if (ticksInAir % 10 == 0 && !entity.getWorld().isClient) { TrinketsDelegate.EquippedStack stack = AmuletItem.get(entity); - if (ChargeableItem.getEnergy(stack.stack()) < 9) { + Charges charges = Charges.of(stack.stack()); + if (charges.canHoldCharge() && charges.getPercentage() < 0.1F) { playSound(USounds.ITEM_ICARUS_WINGS_WARN, 0.13F, 0.5F); } @@ -521,7 +522,9 @@ public class PlayerPhysics extends EntityPhysics implements Tickab minDamage *= 3; } - ChargeableItem.consumeEnergy(stack.stack(), energyConsumed); + if (charges.canHoldCharge()) { + Charges.discharge(stack.stack(), (int)energyConsumed); + } if (entity.getWorld().random.nextInt(damageInterval) == 0) { stack.stack().damage(minDamage + entity.getWorld().random.nextInt(50), (ServerWorld)entity.getWorld(), (ServerPlayerEntity)entity, stack.breakStatusSender()); diff --git a/src/main/java/com/minelittlepony/unicopia/item/AlicornAmuletItem.java b/src/main/java/com/minelittlepony/unicopia/item/AlicornAmuletItem.java index 403f31c9..b622ba58 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/AlicornAmuletItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/AlicornAmuletItem.java @@ -2,10 +2,7 @@ package com.minelittlepony.unicopia.item; import java.util.*; -import org.jetbrains.annotations.Nullable; - import com.google.common.base.Predicates; -import com.google.common.collect.ImmutableMultimap; import com.minelittlepony.unicopia.InteractionManager; import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.Unicopia; @@ -17,6 +14,7 @@ import com.minelittlepony.unicopia.entity.effect.UEffects; import com.minelittlepony.unicopia.entity.mob.SombraEntity; import com.minelittlepony.unicopia.entity.mob.SpellbookEntity; import com.minelittlepony.unicopia.entity.player.*; +import com.minelittlepony.unicopia.item.component.Charges; import com.minelittlepony.unicopia.particle.FollowingParticleEffect; import com.minelittlepony.unicopia.particle.ParticleUtils; import com.minelittlepony.unicopia.particle.UParticles; @@ -30,9 +28,7 @@ import it.unimi.dsi.fastutil.objects.Object2FloatOpenHashMap; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; -import net.minecraft.component.DataComponentTypes; import net.minecraft.component.EnchantmentEffectComponentTypes; -import net.minecraft.component.type.ItemEnchantmentsComponent; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.*; @@ -49,7 +45,6 @@ import net.minecraft.item.tooltip.TooltipType; import net.minecraft.particle.ParticleEffect; import net.minecraft.particle.ParticleTypes; import net.minecraft.predicate.entity.EntityPredicates; -import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.tag.DamageTypeTags; import net.minecraft.server.world.ServerWorld; @@ -63,7 +58,7 @@ import net.minecraft.world.LocalDifficulty; import net.minecraft.world.World; import net.minecraft.world.World.ExplosionSourceType; -public class AlicornAmuletItem extends AmuletItem implements ItemTracker.Trackable, ItemImpl.ClingyItem, ItemImpl.GroundTickCallback { +public class AlicornAmuletItem extends AmuletItem implements ItemTracker.Trackable, ItemImpl.ClingyItem, ItemImpl.GroundTickCallback, DamageChecker { private static final Identifier EFFECT_ID = Unicopia.id("alicorn_amulet_modifiers"); private static final Object2FloatMap> EFFECT_SCALES = Object2FloatMaps.unmodifiable(new Object2FloatOpenHashMap<>(Map.of( EntityAttributes.GENERIC_ATTACK_DAMAGE, 0.2F, @@ -104,7 +99,7 @@ public class AlicornAmuletItem extends AmuletItem implements ItemTracker.Trackab } @Override - public boolean damage(DamageSource source) { + public boolean takesDamageFrom(DamageSource source) { return source.isIn(DamageTypeTags.BYPASSES_INVULNERABILITY); } @@ -338,10 +333,8 @@ public class AlicornAmuletItem extends AmuletItem implements ItemTracker.Trackab for (Entity target : VecHelper.findInRange(entity, entity.getWorld(), entity.getPos(), 10, EntityPredicates.EXCEPT_CREATIVE_OR_SPECTATOR)) { if (target instanceof LivingEntity l) { for (ItemStack equipment : l.getEquippedItems()) { - if (equipment.getItem() == UItems.GROGARS_BELL) { - ChargeableItem chargeable = (ChargeableItem)UItems.GROGARS_BELL; - if (chargeable.hasCharge(equipment)) { - ChargeableItem.consumeEnergy(equipment, 3); + if (equipment.isOf(UItems.GROGARS_BELL)) { + if (Charges.discharge(equipment, 3)) { ParticleUtils.spawnParticle(entity.getWorld(), new FollowingParticleEffect(UParticles.HEALTH_DRAIN, entity, 0.4F) .withChild(ParticleTypes.COMPOSTER), target.getEyePos(), Vec3d.ZERO); diff --git a/src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java b/src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java index 38e0aa45..f55a6850 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java @@ -4,6 +4,8 @@ import java.util.List; import java.util.Optional; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate; +import com.minelittlepony.unicopia.item.component.Charges; +import com.minelittlepony.unicopia.item.component.UDataComponentTypes; import net.minecraft.client.MinecraftClient; import net.minecraft.component.type.AttributeModifiersComponent; @@ -22,14 +24,15 @@ import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; -public class AmuletItem extends WearableItem implements ChargeableItem { +public class AmuletItem extends WearableItem { public static final Identifier AMULET_MODIFIERS_ID = Unicopia.id("amulet_modifiers"); - private final int maxEnergy; - public AmuletItem(Item.Settings settings, int maxEnergy) { + super(settings.component(UDataComponentTypes.CHARGES, Charges.of(maxEnergy, maxEnergy))); + } + + public AmuletItem(Item.Settings settings) { super(settings); - this.maxEnergy = maxEnergy; } public AmuletItem(Item.Settings settings, int maxEnergy, AttributeModifiersComponent modifiers) { @@ -49,9 +52,7 @@ public class AmuletItem extends WearableItem implements ChargeableItem { list.add(compiled); } - if (isChargable()) { - list.add(Text.translatable("item.unicopia.amulet.energy", (int)Math.floor(ChargeableItem.getEnergy(stack)), getMaxCharge())); - } + Charges.of(stack).appendTooltip(context, list::add, type); } @Override @@ -66,11 +67,11 @@ public class AmuletItem extends WearableItem implements ChargeableItem { @Override public boolean hasGlint(ItemStack stack) { - return !isChargable() || stack.hasEnchantments() || ChargeableItem.getEnergy(stack) > 0; + return stack.hasEnchantments() || Charges.of(stack).maximum() == 0 || Charges.of(stack).energy() > 0; } public boolean isApplicable(ItemStack stack) { - return stack.getItem() == this && (!isChargable() || ChargeableItem.getEnergy(stack) > 0); + return stack.getItem() == this && (Charges.of(stack).maximum() == 0 || Charges.of(stack).energy() > 0); } public final boolean isApplicable(LivingEntity entity) { @@ -83,11 +84,6 @@ public class AmuletItem extends WearableItem implements ChargeableItem { .orElse(TrinketsDelegate.EquippedStack.EMPTY); } - @Override - public int getMaxCharge() { - return maxEnergy; - } - public static TrinketsDelegate.EquippedStack get(LivingEntity entity) { return TrinketsDelegate.getInstance(entity).getEquipped(entity, TrinketsDelegate.NECKLACE, stack -> stack.getItem() instanceof AmuletItem) .findFirst() diff --git a/src/main/java/com/minelittlepony/unicopia/item/BellItem.java b/src/main/java/com/minelittlepony/unicopia/item/BellItem.java index 3bba2094..3d34c379 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/BellItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/BellItem.java @@ -7,6 +7,8 @@ import com.minelittlepony.unicopia.entity.Creature; import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.damage.UDamageTypes; import com.minelittlepony.unicopia.entity.player.Pony; +import com.minelittlepony.unicopia.item.component.Charges; +import com.minelittlepony.unicopia.item.component.UDataComponentTypes; import com.minelittlepony.unicopia.particle.FollowingParticleEffect; import com.minelittlepony.unicopia.particle.MagicParticleEffect; import com.minelittlepony.unicopia.particle.UParticles; @@ -31,9 +33,9 @@ import net.minecraft.util.UseAction; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -public class BellItem extends Item implements ChargeableItem { +public class BellItem extends Item { public BellItem(Settings settings) { - super(settings); + super(settings.component(UDataComponentTypes.CHARGES, Charges.of(1000, 1000))); } @Override @@ -43,7 +45,7 @@ public class BellItem extends Item implements ChargeableItem { @Override public void appendTooltip(ItemStack stack, TooltipContext context, List list, TooltipType type) { - list.add(Text.translatable(getTranslationKey() + ".charges", (int)Math.floor(ChargeableItem.getEnergy(stack)), getMaxCharge())); + Charges.of(stack).appendTooltip(context, list::add, type); } @Override @@ -69,23 +71,28 @@ public class BellItem extends Item implements ChargeableItem { ItemStack stack = player.getStackInHand(hand); ItemStack offhandStack = AmuletItem.get(player).stack(); - if (!(offhandStack.getItem() instanceof ChargeableItem)) { + if (!Charges.of(offhandStack).canHoldCharge()) { offhandStack = player.getStackInHand(hand == Hand.MAIN_HAND ? Hand.OFF_HAND : Hand.MAIN_HAND); } Pony pony = Pony.of(player); - if (hasCharge(stack)) { + Charges charges = Charges.of(stack); + + if (charges.energy() > 0) { pony.playSound(USounds.ITEM_GROGAR_BELL_CHARGE, 0.6F, 1); pony.getCorruption().add(player.getRandom().nextBetween(1, 10)); - if (offhandStack.getItem() instanceof ChargeableItem chargeable) { - float maxChargeBy = chargeable.getMaxCharge() - ChargeableItem.getEnergy(offhandStack); - float energyTransferred = Math.min(ChargeableItem.getEnergy(stack), maxChargeBy); - chargeable.recharge(offhandStack, energyTransferred); - ChargeableItem.consumeEnergy(stack, energyTransferred); + + Charges offhandCharges = Charges.of(offhandStack); + + if (offhandCharges.canHoldCharge()) { + int maxChargeBy = charges.maximum() - offhandCharges.energy(); + int energyTransferred = Math.min(charges.energy(), maxChargeBy); + Charges.recharge(offhandStack, energyTransferred); + Charges.discharge(stack, energyTransferred); } else { - pony.getMagicalReserves().getMana().add(ChargeableItem.getEnergy(stack)); - ChargeableItem.setEnergy(stack, 0); + pony.getMagicalReserves().getMana().add(charges.energy()); + stack.set(UDataComponentTypes.CHARGES, charges.withEnergy(0)); } pony.spawnParticles(pony.getPhysics().getHeadPosition().toCenterPos(), new Sphere(false, 0.5F), 7, p -> { @@ -166,18 +173,18 @@ public class BellItem extends Item implements ChargeableItem { return true; } } - ChargeableItem.consumeEnergy(stack, -amountDrawn); + if (Charges.discharge(stack, -(int)amountDrawn)) { + user.playSound(USounds.ITEM_GROGAR_BELL_DRAIN, 0.2F, progress); - user.playSound(USounds.ITEM_GROGAR_BELL_DRAIN, 0.2F, progress); - - for (int i = 0; i < 4; i++) { - living.addParticle( - new FollowingParticleEffect(UParticles.HEALTH_DRAIN, user.asEntity(), 0.4F) - .withChild(particleType), - living.getOriginVector().add(0, living.getPhysics().getGravitySignum() * living.asEntity().getHeight() / 2, 0) - .add(VecHelper.supply(() -> user.asWorld().random.nextTriangular(0, 0.2))), - Vec3d.ZERO - ); + for (int i = 0; i < 4; i++) { + living.addParticle( + new FollowingParticleEffect(UParticles.HEALTH_DRAIN, user.asEntity(), 0.4F) + .withChild(particleType), + living.getOriginVector().add(0, living.getPhysics().getGravitySignum() * living.asEntity().getHeight() / 2, 0) + .add(VecHelper.supply(() -> user.asWorld().random.nextTriangular(0, 0.2))), + Vec3d.ZERO + ); + } } return false; @@ -204,11 +211,6 @@ public class BellItem extends Item implements ChargeableItem { @Override public boolean hasGlint(ItemStack stack) { - return stack.hasEnchantments() || ChargeableItem.getEnergy(stack) > 0; - } - - @Override - public int getMaxCharge() { - return 1000; + return super.hasGlint(stack) || Charges.of(stack).energy() > 0; } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/ChameleonItem.java b/src/main/java/com/minelittlepony/unicopia/item/ChameleonItem.java deleted file mode 100644 index acd87977..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/ChameleonItem.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.minelittlepony.unicopia.item; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.util.Identifier; -import net.minecraft.registry.Registries; - -public interface ChameleonItem { - - default boolean isFullyDisguised() { - return true; - } - - static ItemStack getAppearanceStack(ItemStack stack) { - Item appearance = getAppearance(stack); - if (appearance != Items.AIR) { - return createAppearanceStack(stack, appearance); - } - return stack; - } - - static ItemStack createAppearanceStack(ItemStack stack, Item appearance) { - ItemStack newAppearance = appearance.getDefaultStack(); - if (stack.hasNbt()) { - newAppearance.setNbt(stack.getNbt().copy()); - } - newAppearance.setCount(stack.getCount()); - newAppearance.removeSubNbt("appearance"); - return newAppearance; - } - - static boolean hasAppearance(ItemStack stack) { - return getAppearance(stack) != Items.AIR; - } - - static Item getAppearance(ItemStack stack) { - if (stack.hasNbt() && stack.getNbt().contains("appearance")) { - return Registries.ITEM.get(new Identifier(stack.getNbt().getString("appearance"))); - } - - return Items.AIR; - } - - static ItemStack setAppearance(ItemStack stack, ItemStack appearance) { - ItemStack result = stack.copy(); - - if (appearance.hasNbt()) { - result.setNbt(appearance.getNbt().copy()); - result.removeCustomName(); - result.setDamage(stack.getDamage()); - result.setCount(stack.getCount()); - } - result.getOrCreateNbt().putString("appearance", Registries.ITEM.getId(appearance.getItem()).toString()); - - return result; - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/ChargeableItem.java b/src/main/java/com/minelittlepony/unicopia/item/ChargeableItem.java deleted file mode 100644 index 8d360bb8..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/ChargeableItem.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.minelittlepony.unicopia.item; - -import net.minecraft.item.ItemStack; - -public interface ChargeableItem { - - int getMaxCharge(); - - default int getDefaultCharge() { - return 0; - } - - default boolean isChargable() { - return getMaxCharge() > 0; - } - - default boolean hasCharge(ItemStack stack) { - return getEnergy(stack) > 0; - } - - default ItemStack recharge(ItemStack stack) { - return setEnergy(stack, getMaxCharge()); - } - - default ItemStack recharge(ItemStack stack, float amount) { - return setEnergy(stack, getEnergy(stack) + amount); - } - - default boolean canCharge(ItemStack stack) { - return isChargable() && getEnergy(stack) < getMaxCharge(); - } - - default float getChargeRemainder(ItemStack stack) { - return Math.max(0, getMaxCharge() - getEnergy(stack)); - } - - default void onDischarge(ItemStack stack) { - - } - - static void consumeEnergy(ItemStack stack, float amount) { - setEnergy(stack, getEnergy(stack) - amount); - if (stack.getItem() instanceof ChargeableItem c) { - c.onDischarge(stack); - } - } - - static int getDefaultCharge(ItemStack stack) { - return stack.getItem() instanceof ChargeableItem c ? c.getDefaultCharge() : 0; - } - - static float getEnergy(ItemStack stack) { - return stack.hasNbt() && stack.getNbt().contains("energy") ? Math.max(0, stack.getNbt().getFloat("energy")) : getDefaultCharge(stack); - } - - static ItemStack setEnergy(ItemStack stack, float energy) { - if (energy <= 0 && getDefaultCharge(stack) <= 0) { - stack.removeSubNbt("energy"); - } else { - stack.getOrCreateNbt().putFloat("energy", energy); - } - return stack; - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/DamageChecker.java b/src/main/java/com/minelittlepony/unicopia/item/DamageChecker.java new file mode 100644 index 00000000..853dfd0f --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/DamageChecker.java @@ -0,0 +1,7 @@ +package com.minelittlepony.unicopia.item; + +import net.minecraft.entity.damage.DamageSource; + +public interface DamageChecker { + boolean takesDamageFrom(DamageSource source); +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/EnchantedStaffItem.java b/src/main/java/com/minelittlepony/unicopia/item/EnchantedStaffItem.java index 99a7558b..79ed1415 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/EnchantedStaffItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/EnchantedStaffItem.java @@ -15,6 +15,8 @@ import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation; import com.minelittlepony.unicopia.entity.mob.CastSpellEntity; import com.minelittlepony.unicopia.entity.mob.UEntities; import com.minelittlepony.unicopia.entity.player.Pony; +import com.minelittlepony.unicopia.item.component.Charges; +import com.minelittlepony.unicopia.item.component.UDataComponentTypes; import com.minelittlepony.unicopia.item.group.MultiItem; import net.minecraft.entity.Entity; @@ -34,9 +36,9 @@ import net.minecraft.util.TypedActionResult; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -public class EnchantedStaffItem extends StaffItem implements EnchantableItem, ChargeableItem, MultiItem { - +public class EnchantedStaffItem extends StaffItem implements EnchantableItem, MultiItem, Charges.ChargeChangeCallback { private static final Map, SpellType> ENTITY_TYPE_TO_SPELL = new HashMap<>(); + public static SpellType register(EntityType entityType, SpellType spellType) { ENTITY_TYPE_TO_SPELL.put(entityType, spellType); return spellType; @@ -83,7 +85,7 @@ public class EnchantedStaffItem extends StaffItem implements EnchantableItem, Ch } public EnchantedStaffItem(Settings settings) { - super(settings.maxDamage(500)); + super(settings.component(UDataComponentTypes.CHARGES, new Charges(3, 3, 3, true)).maxDamage(500)); } @Override @@ -96,12 +98,11 @@ public class EnchantedStaffItem extends StaffItem implements EnchantableItem, Ch @Override public void appendTooltip(ItemStack stack, TooltipContext context, List lines, TooltipType type) { - if (EnchantableItem.isEnchanted(stack)) { SpellType key = EnchantableItem.getSpellKey(stack); lines.add(Text.translatable(key.getTranslationKey()).formatted(key.getAffinity().getColor())); - lines.add(Text.translatable(getTranslationKey(stack) + ".charges", (int)Math.floor(ChargeableItem.getEnergy(stack)), getMaxCharge())); } + Charges.of(stack).appendTooltip(context, lines::add, type); } @Override @@ -119,7 +120,9 @@ public class EnchantedStaffItem extends StaffItem implements EnchantableItem, Ch target.setHealth(1); target.setFrozenTicks(9000); } - player.setStackInHand(hand, recharge(EnchantableItem.enchant(stack, type))); + stack = EnchantableItem.enchant(stack, type); + Charges.recharge(stack); + player.setStackInHand(hand, stack); } return ActionResult.SUCCESS; } @@ -135,36 +138,35 @@ public class EnchantedStaffItem extends StaffItem implements EnchantableItem, Ch public void onStoppedUsing(ItemStack stack, World world, LivingEntity entity, int timeLeft) { int i = getMaxUseTime(stack, entity) - timeLeft; - if (EnchantableItem.isEnchanted(stack) && hasCharge(stack)) { + if (EnchantableItem.isEnchanted(stack)) { if (i > 20) { - Pony.of(entity).ifPresent(pony -> { - pony.subtractEnergyCost(4); - stack.damage(1, pony.asEntity(), EquipmentSlot.MAINHAND); - getSpellEffect(stack).create().toThrowable().throwProjectile(pony); - pony.setAnimation(Animation.ARMS_UP, Animation.Recipient.ANYONE, 10); - }); - ChargeableItem.consumeEnergy(stack, 1); + if (Charges.discharge(stack, 1)) { + Pony.of(entity).ifPresent(pony -> { + pony.subtractEnergyCost(4); + stack.damage(1, pony.asEntity(), EquipmentSlot.MAINHAND); + getSpellEffect(stack).create().toThrowable().throwProjectile(pony); + pony.setAnimation(Animation.ARMS_UP, Animation.Recipient.ANYONE, 10); + }); + } } else if (i > 5) { - Pony.of(entity).ifPresent(pony -> { - pony.subtractEnergyCost(4); - stack.damage(1, pony.asEntity(), EquipmentSlot.MAINHAND); - getSpellEffect(stack).create().toThrowable().throwProjectile(pony); - pony.setAnimation(Animation.ARMS_UP, Animation.Recipient.ANYONE, 10); - }); - ChargeableItem.consumeEnergy(stack, 1); + if (Charges.discharge(stack, 1)) { + Pony.of(entity).ifPresent(pony -> { + pony.subtractEnergyCost(4); + stack.damage(1, pony.asEntity(), EquipmentSlot.MAINHAND); + getSpellEffect(stack).create().toThrowable().throwProjectile(pony); + pony.setAnimation(Animation.ARMS_UP, Animation.Recipient.ANYONE, 10); + }); + } } } } @Override protected boolean castContainedEffect(ItemStack stack, LivingEntity target, LivingEntity attacker) { - if (attacker.isSneaking() && hasCharge(stack)) { + if (attacker.isSneaking() && Charges.discharge(stack, 1)) { stack.damage(50, attacker, EquipmentSlot.MAINHAND); Caster.of(attacker).ifPresent(c -> c.subtractEnergyCost(4)); Caster.of(target).ifPresent(c -> getSpellEffect(stack).apply(c, CastingMethod.STAFF)); - ChargeableItem.consumeEnergy(stack, 1); - - return true; } return false; @@ -190,9 +192,8 @@ public class EnchantedStaffItem extends StaffItem implements EnchantableItem, Ch if (i > 200) { living.clearActiveItem(); living.damage(entity.getDamageSources().magic(), 1); - if (EnchantableItem.isEnchanted(stack) && hasCharge(stack)) { + if (EnchantableItem.isEnchanted(stack) && Charges.discharge(stack, 1)) { Caster.of(entity).ifPresent(c -> getSpellEffect(stack).apply(c, CastingMethod.STAFF)); - ChargeableItem.consumeEnergy(stack, 1); } } } @@ -204,19 +205,9 @@ public class EnchantedStaffItem extends StaffItem implements EnchantableItem, Ch return 72000; } - @Override - public int getMaxCharge() { - return 3; - } - - @Override - public int getDefaultCharge() { - return 3; - } - @Override public Text getName(ItemStack stack) { - if (EnchantableItem.isEnchanted(stack) && hasCharge(stack)) { + if (EnchantableItem.isEnchanted(stack) && Charges.of(stack).energy() > 0) { return Text.translatable(this.getTranslationKey(stack) + ".enchanted", super.getName(stack), EnchantableItem.getSpellKey(stack).getName()); } return super.getName(stack); @@ -224,7 +215,7 @@ public class EnchantedStaffItem extends StaffItem implements EnchantableItem, Ch @Override public void onDischarge(ItemStack stack) { - if (ChargeableItem.getEnergy(stack) == 0) { + if (Charges.of(stack).energy() == 0) { EnchantableItem.unenchant(stack); } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/FilledJarItem.java b/src/main/java/com/minelittlepony/unicopia/item/FilledJarItem.java index 38272c3b..f86d58fd 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/FilledJarItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/FilledJarItem.java @@ -3,6 +3,8 @@ package com.minelittlepony.unicopia.item; import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.entity.mob.ButterflyEntity; import com.minelittlepony.unicopia.entity.mob.UEntities; +import com.minelittlepony.unicopia.item.component.Appearance; +import com.minelittlepony.unicopia.item.component.UDataComponentTypes; import com.minelittlepony.unicopia.projectile.MagicProjectileEntity; import com.minelittlepony.unicopia.projectile.ProjectileDelegate; @@ -22,7 +24,7 @@ import net.minecraft.text.Text; import net.minecraft.util.hit.EntityHitResult; import net.minecraft.world.WorldEvents; -public class FilledJarItem extends ProjectileItem implements ProjectileDelegate.HitListener, ChameleonItem { +public class FilledJarItem extends ProjectileItem implements ProjectileDelegate.HitListener { public FilledJarItem(Item.Settings settings) { super(settings, 0); } @@ -34,12 +36,8 @@ public class FilledJarItem extends ProjectileItem implements ProjectileDelegate. @Override public Text getName(ItemStack stack) { - return ChameleonItem.hasAppearance(stack) ? Text.translatable(getTranslationKey(stack), ChameleonItem.getAppearanceStack(stack).getName()) : UItems.EMPTY_JAR.getName(UItems.EMPTY_JAR.getDefaultStack()); - } - - @Override - public boolean isFullyDisguised() { - return false; + Appearance appearance = stack.get(UDataComponentTypes.APPEARANCE); + return appearance != null ? Text.translatable(getTranslationKey(stack), appearance.item().getName()) : UItems.EMPTY_JAR.getName(UItems.EMPTY_JAR.getDefaultStack()); } @Override @@ -50,7 +48,7 @@ public class FilledJarItem extends ProjectileItem implements ProjectileDelegate. return; } - ItemStack stack = ChameleonItem.getAppearanceStack(((FlyingItemEntity)projectile).getStack()); + ItemStack stack = Appearance.upwrapAppearance(((FlyingItemEntity)projectile).getStack()); boolean onFire = false; @@ -81,7 +79,7 @@ public class FilledJarItem extends ProjectileItem implements ProjectileDelegate. @Override public void onImpact(MagicProjectileEntity projectile) { - ItemStack stack = ChameleonItem.getAppearanceStack(projectile.getStack()); + ItemStack stack = Appearance.upwrapAppearance(projectile.getStack()); if (stack.isOf(UItems.BUTTERFLY)) { ButterflyEntity butterfly = UEntities.BUTTERFLY.create(projectile.getWorld()); @@ -98,6 +96,6 @@ public class FilledJarItem extends ProjectileItem implements ProjectileDelegate. } public ItemStack withContents(ItemStack contents) { - return ChameleonItem.setAppearance(getDefaultStack(), contents); + return Appearance.set(getDefaultStack(), contents); } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/PegasusAmuletItem.java b/src/main/java/com/minelittlepony/unicopia/item/PegasusAmuletItem.java index 5f0a2a4c..6900e2ce 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/PegasusAmuletItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/PegasusAmuletItem.java @@ -1,7 +1,7 @@ package com.minelittlepony.unicopia.item; -import com.minelittlepony.unicopia.entity.ItemTracker; -import com.minelittlepony.unicopia.entity.Living; +import com.minelittlepony.unicopia.item.component.Charges; +import com.minelittlepony.unicopia.item.component.UDataComponentTypes; import com.minelittlepony.unicopia.particle.ParticleUtils; import net.minecraft.entity.*; @@ -10,24 +10,9 @@ import net.minecraft.item.ItemStack; import net.minecraft.particle.ParticleTypes; import net.minecraft.world.World; -public class PegasusAmuletItem extends AmuletItem implements ItemTracker.Trackable { +public class PegasusAmuletItem extends AmuletItem { public PegasusAmuletItem(Item.Settings settings, int maxEnergy) { - super(settings, maxEnergy); - } - - @Override - public void onUnequipped(Living living, long timeWorn) { - - } - - @Override - public void onEquipped(Living living) { - - } - - @Override - public int getDefaultCharge() { - return getMaxCharge() / 2; + super(settings.component(UDataComponentTypes.CHARGES, Charges.of(maxEnergy / 2, maxEnergy))); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java b/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java index b18982cb..1f1e4b73 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java @@ -8,12 +8,15 @@ import com.minelittlepony.unicopia.advancement.UCriteria; import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.damage.UDamageTypes; import com.minelittlepony.unicopia.entity.player.Pony; +import com.minelittlepony.unicopia.item.component.Appearance; +import com.minelittlepony.unicopia.item.component.UDataComponentTypes; import com.minelittlepony.unicopia.item.group.MultiItem; import com.minelittlepony.unicopia.particle.LightningBoltParticleEffect; import com.minelittlepony.unicopia.particle.ParticleUtils; import com.minelittlepony.unicopia.util.TraceHelper; import com.minelittlepony.unicopia.util.RegistryUtils; +import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.LightningEntity; @@ -31,13 +34,12 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.util.Hand; import net.minecraft.util.Rarity; import net.minecraft.util.TypedActionResult; -import net.minecraft.registry.Registries; import net.minecraft.world.World; import net.minecraft.world.event.GameEvent; -public class ZapAppleItem extends Item implements ChameleonItem, MultiItem { +public class ZapAppleItem extends Item implements MultiItem, Appearance.AppearanceChangeCallback { public ZapAppleItem(Settings settings) { - super(settings.rarity(Rarity.RARE)); + super(settings.rarity(Rarity.RARE).component(UDataComponentTypes.APPEARANCE, Appearance.DEFAULT_FULLY_DISGUISED)); } @Override @@ -105,21 +107,18 @@ public class ZapAppleItem extends Item implements ChameleonItem, MultiItem { .stream() .flatMap(world -> RegistryUtils.valuesForTag(world, UConventionalTags.Items.APPLES)) .filter(a -> a != this).map(item -> { - return ChameleonItem.setAppearance(getDefaultStack(), item.getDefaultStack()); + return Appearance.set(getDefaultStack(), item.getDefaultStack()); }).toList(); } @Override public Text getName(ItemStack stack) { - return ChameleonItem.hasAppearance(stack) ? ChameleonItem.getAppearanceStack(stack).getName() : super.getName(stack); + Appearance appearance = stack.get(UDataComponentTypes.APPEARANCE); + return appearance != null ? appearance.item().getName() : super.getName(stack); } @Override - public Rarity getRarity(ItemStack stack) { - if (ChameleonItem.hasAppearance(stack)) { - return Rarity.EPIC; - } - - return Rarity.RARE; + public void onAppearanceSet(ItemStack stack, Appearance appearance) { + stack.set(DataComponentTypes.RARITY, appearance.item().isEmpty() ? stack.getDefaultComponents().get(DataComponentTypes.RARITY) : Rarity.EPIC); } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/component/Appearance.java b/src/main/java/com/minelittlepony/unicopia/item/component/Appearance.java new file mode 100644 index 00000000..4de4a98e --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/component/Appearance.java @@ -0,0 +1,77 @@ +package com.minelittlepony.unicopia.item.component; + +import com.minelittlepony.unicopia.util.CodecUtils; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.registry.Registries; + +public record Appearance(ItemStack item, boolean replaceFully) { + public static final Appearance DEFAULT = new Appearance(ItemStack.EMPTY, false); + public static final Appearance DEFAULT_FULLY_DISGUISED = new Appearance(ItemStack.EMPTY, true); + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + CodecUtils.xor( + ItemStack.CODEC, + Registries.ITEM.getCodec().xmap(Item::getDefaultStack, ItemStack::getItem) + ).fieldOf("stack").forGetter(Appearance::item), + Codec.BOOL.fieldOf("replace_fully").forGetter(Appearance::replaceFully) + ).apply(instance, Appearance::of)); + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + ItemStack.PACKET_CODEC, Appearance::item, + PacketCodecs.BOOL, Appearance::replaceFully, + Appearance::of + ); + + public Appearance { + item.remove(UDataComponentTypes.APPEARANCE); + } + + public ItemStack unwrap(ItemStack stack) { + return item().isEmpty() ? stack : item(); + } + + public static Appearance of(ItemStack stack, boolean complete) { + return stack.isEmpty() ? (complete ? DEFAULT_FULLY_DISGUISED : DEFAULT) : new Appearance(stack, complete); + } + + public static Appearance get(ItemStack stack) { + return stack.getOrDefault(UDataComponentTypes.APPEARANCE, DEFAULT); + } + + public static boolean hasAppearance(ItemStack stack) { + return !get(stack).item().isEmpty(); + } + + public static ItemStack upwrapAppearance(ItemStack stack) { + return get(stack).unwrap(stack); + } + + public static ItemStack set(ItemStack stack, ItemStack appearance) { + Appearance component = createAppearanceFor(stack, appearance); + stack.set(UDataComponentTypes.APPEARANCE, component); + if (stack.getItem() instanceof AppearanceChangeCallback callback) { + callback.onAppearanceSet(stack, component); + } + return stack; + } + + private static Appearance createAppearanceFor(ItemStack stack, ItemStack appearance) { + if (appearance.isEmpty()) { + return stack.getDefaultComponents().getOrDefault(UDataComponentTypes.APPEARANCE, DEFAULT); + } + + appearance = appearance.copy(); + appearance.setCount(stack.getCount()); + appearance.setDamage(stack.getDamage()); + return of(appearance, stack.getOrDefault(UDataComponentTypes.APPEARANCE, DEFAULT).replaceFully()); + } + + public interface AppearanceChangeCallback { + void onAppearanceSet(ItemStack stack, Appearance appearance); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/component/Charges.java b/src/main/java/com/minelittlepony/unicopia/item/component/Charges.java new file mode 100644 index 00000000..892755d3 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/component/Charges.java @@ -0,0 +1,99 @@ +package com.minelittlepony.unicopia.item.component; + +import java.util.function.Consumer; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import io.netty.buffer.ByteBuf; +import net.minecraft.item.Item.TooltipContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.tooltip.TooltipAppender; +import net.minecraft.item.tooltip.TooltipType; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.text.Text; +import net.minecraft.util.math.MathHelper; + +public record Charges(int energy, int maximum, int baseline, boolean showInTooltip) implements TooltipAppender { + public static final Charges DEFAULT = new Charges(0, 0, 0, false); + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.INT.fieldOf("energy").forGetter(Charges::energy), + Codec.INT.optionalFieldOf("maximum", 0).forGetter(Charges::maximum), + Codec.INT.optionalFieldOf("baseline", 0).forGetter(Charges::baseline), + Codec.BOOL.fieldOf("showInTooltip").forGetter(Charges::showInTooltip) + ).apply(instance, Charges::new)); + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + PacketCodecs.INTEGER, Charges::energy, + PacketCodecs.INTEGER, Charges::maximum, + PacketCodecs.INTEGER, Charges::baseline, + PacketCodecs.BOOL, Charges::showInTooltip, + Charges::new + ); + + public static Charges of(int initial, int maximum) { + return new Charges(initial, maximum, initial, true); + } + + public static Charges of(ItemStack stack) { + return stack.getOrDefault(UDataComponentTypes.CHARGES, DEFAULT); + } + + public static boolean discharge(ItemStack stack, int energy) { + Charges charges = of(stack); + if (charges.energy() < energy) { + return false; + } + stack.set(UDataComponentTypes.CHARGES, charges.withEnergy(charges.energy() - energy)); + if (stack.getItem() instanceof ChargeChangeCallback callback) { + callback.onDischarge(stack); + } + return true; + } + + public static boolean recharge(ItemStack stack, int energy) { + Charges charges = of(stack); + if (charges.energy() >= charges.maximum()) { + return false; + } + stack.set(UDataComponentTypes.CHARGES, charges.withEnergy(charges.energy() + energy)); + return true; + } + + public static boolean recharge(ItemStack stack) { + Charges charges = of(stack); + if (charges.energy() >= charges.maximum()) { + return false; + } + + stack.set(UDataComponentTypes.CHARGES, charges.ofDefault()); + return true; + } + + public boolean canHoldCharge() { + return maximum > 0; + } + + public float getPercentage() { + return canHoldCharge() ? energy() / (float)maximum() : 0; + } + + public Charges withEnergy(int energy) { + return new Charges(MathHelper.clamp(energy, 0, maximum), maximum, baseline, showInTooltip); + } + + public Charges ofDefault() { + return withEnergy(baseline); + } + + @Override + public void appendTooltip(TooltipContext context, Consumer tooltip, TooltipType type) { + if (showInTooltip() && maximum() > 0) { + tooltip.accept(Text.translatable("item.unicopia.amulet.energy", (int)Math.floor(energy()), maximum())); + } + } + + public interface ChargeChangeCallback { + void onDischarge(ItemStack stack); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/component/UDataComponentTypes.java b/src/main/java/com/minelittlepony/unicopia/item/component/UDataComponentTypes.java index 4364e893..099fce8c 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/component/UDataComponentTypes.java +++ b/src/main/java/com/minelittlepony/unicopia/item/component/UDataComponentTypes.java @@ -23,6 +23,8 @@ public interface UDataComponentTypes { ComponentType BUTTERFLY_VARIANT = register("butterfly_variant", builder -> builder.codec(ButterflyEntity.Variant.CODEC).packetCodec(ButterflyEntity.Variant.PACKET_CODEC)); ComponentType BALLOON_DESIGN = register("balloon_design", builder -> builder.codec(AirBalloonEntity.BalloonDesign.CODEC).packetCodec(AirBalloonEntity.BalloonDesign.PACKET_CODEC)); ComponentType ISSUER = register("issuer", builder -> builder.codec(Issuer.CODEC).packetCodec(Issuer.PACKET_CODEC).cache()); + ComponentType CHARGES = register("charges", builder -> builder.codec(Charges.CODEC).packetCodec(Charges.PACKET_CODEC)); + ComponentType APPEARANCE = register("appearance", builder -> builder.codec(Appearance.CODEC).packetCodec(Appearance.PACKET_CODEC)); private static ComponentType register(String name, UnaryOperator> builderOperator) { return Registry.register(Registries.DATA_COMPONENT_TYPE, Unicopia.id(name), builderOperator.apply(ComponentType.builder()).build()); diff --git a/src/main/java/com/minelittlepony/unicopia/item/enchantment/GemFindingEnchantment.java b/src/main/java/com/minelittlepony/unicopia/item/enchantment/GemFindingEnchantment.java index 809bba9d..db567fdc 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/enchantment/GemFindingEnchantment.java +++ b/src/main/java/com/minelittlepony/unicopia/item/enchantment/GemFindingEnchantment.java @@ -5,8 +5,6 @@ import com.minelittlepony.unicopia.client.sound.MagicAuraSoundInstance; import com.minelittlepony.unicopia.entity.Enchantments; import com.minelittlepony.unicopia.entity.Living; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/com/minelittlepony/unicopia/item/group/UItemGroups.java b/src/main/java/com/minelittlepony/unicopia/item/group/UItemGroups.java index a479fa90..89c6ce1a 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/group/UItemGroups.java +++ b/src/main/java/com/minelittlepony/unicopia/item/group/UItemGroups.java @@ -3,15 +3,17 @@ package com.minelittlepony.unicopia.item.group; import java.util.stream.Stream; import com.minelittlepony.unicopia.UTags; -import com.minelittlepony.unicopia.item.ChameleonItem; import com.minelittlepony.unicopia.item.UItems; +import com.minelittlepony.unicopia.item.component.Appearance; +import com.minelittlepony.unicopia.item.component.UDataComponentTypes; + import net.minecraft.item.*; import net.minecraft.registry.RegistryKey; public interface UItemGroups { RegistryKey ALL_ITEMS = ItemGroupRegistry.createDynamic("items", UItems.CRYSTAL_HEART::getDefaultStack, () -> { return Stream.concat(Stream.of(Items.APPLE), ItemGroupRegistry.ITEMS.stream() - .filter(item -> !(item instanceof ChameleonItem) || ((ChameleonItem)item).isFullyDisguised())); + .filter(item -> !item.getComponents().getOrDefault(UDataComponentTypes.APPEARANCE, Appearance.DEFAULT).replaceFully())); }); RegistryKey FORAGING_ITEMS = ItemGroupRegistry.createGroupFromTag("foraging", UTags.Items.GROUP_FORAGING, Items.HAY_BLOCK::getDefaultStack); RegistryKey EARTH_PONY_ITEMS = ItemGroupRegistry.createGroupFromTag("earth_pony", UTags.Items.GROUP_EARTH_PONY, UItems.EARTH_BADGE::getDefaultStack); diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemStack.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemStack.java index 35658fea..78ca2dde 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemStack.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemStack.java @@ -6,7 +6,10 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.minelittlepony.unicopia.diet.DietView; +import com.minelittlepony.unicopia.item.DamageChecker; + import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResult; @@ -30,4 +33,12 @@ abstract class MixinItemStack { ItemStack self = (ItemStack)(Object)this; ((DietView.Holder)self.getItem()).getDiets(self).finishUsing(self, world, user); } + + @Inject(method = "takesDamageFrom", at = @At("HEAD")) + private void onTakesDamageFrom(DamageSource source, CallbackInfoReturnable info) { + ItemStack self = (ItemStack)(Object)this; + if (self.getItem() instanceof DamageChecker checker) { + info.setReturnValue(checker.takesDamageFrom(source)); + } + } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItemModels.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItemModels.java index f98366bf..11164797 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItemModels.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItemModels.java @@ -4,7 +4,9 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; -import com.minelittlepony.unicopia.item.ChameleonItem; +import com.minelittlepony.unicopia.item.component.Appearance; +import com.minelittlepony.unicopia.item.component.UDataComponentTypes; + import net.minecraft.client.render.item.ItemModels; import net.minecraft.item.ItemStack; @@ -14,8 +16,9 @@ abstract class MixinItemModels { at = @At("HEAD"), index = 1) private ItemStack modifyStack(ItemStack stack) { - if (stack.getItem() instanceof ChameleonItem && ((ChameleonItem)stack.getItem()).isFullyDisguised()) { - return ChameleonItem.getAppearanceStack(stack); + Appearance appearance = stack.get(UDataComponentTypes.APPEARANCE); + if (appearance != null && appearance.replaceFully()) { + return Appearance.upwrapAppearance(stack); } return stack; } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/sodium/MixinSodiumWorldRenderer.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/sodium/MixinSodiumWorldRenderer.java index 847fe112..494913a4 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/sodium/MixinSodiumWorldRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/sodium/MixinSodiumWorldRenderer.java @@ -9,7 +9,6 @@ import com.minelittlepony.unicopia.client.ClientBlockDestructionManager; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.*; import net.minecraft.entity.player.BlockBreakingInfo; @Pseudo diff --git a/src/main/java/com/minelittlepony/unicopia/recipe/JarExtractRecipe.java b/src/main/java/com/minelittlepony/unicopia/recipe/JarExtractRecipe.java index 8022726d..41072228 100644 --- a/src/main/java/com/minelittlepony/unicopia/recipe/JarExtractRecipe.java +++ b/src/main/java/com/minelittlepony/unicopia/recipe/JarExtractRecipe.java @@ -2,8 +2,8 @@ package com.minelittlepony.unicopia.recipe; import org.jetbrains.annotations.Nullable; -import com.minelittlepony.unicopia.item.ChameleonItem; import com.minelittlepony.unicopia.item.UItems; +import com.minelittlepony.unicopia.item.component.Appearance; import net.minecraft.item.ItemStack; import net.minecraft.recipe.RecipeSerializer; @@ -45,14 +45,14 @@ public class JarExtractRecipe extends SpecialCraftingRecipe { return ItemStack.EMPTY; } - if (!ChameleonItem.hasAppearance(stack)) { + if (!Appearance.hasAppearance(stack)) { return ItemStack.EMPTY; } jar = stack; } - return ChameleonItem.getAppearanceStack(jar); + return Appearance.upwrapAppearance(jar); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/recipe/JarInsertRecipe.java b/src/main/java/com/minelittlepony/unicopia/recipe/JarInsertRecipe.java index d49b65cb..4a0f7300 100644 --- a/src/main/java/com/minelittlepony/unicopia/recipe/JarInsertRecipe.java +++ b/src/main/java/com/minelittlepony/unicopia/recipe/JarInsertRecipe.java @@ -1,8 +1,8 @@ package com.minelittlepony.unicopia.recipe; -import com.minelittlepony.unicopia.item.ChameleonItem; import com.minelittlepony.unicopia.item.EmptyJarItem; import com.minelittlepony.unicopia.item.UItems; +import com.minelittlepony.unicopia.item.component.Appearance; import net.minecraft.item.ItemStack; import net.minecraft.recipe.RecipeSerializer; @@ -19,7 +19,7 @@ public class JarInsertRecipe extends ItemCombinationRecipe { @Override public final ItemStack craft(CraftingRecipeInput inventory, WrapperLookup registries) { - return ChameleonItem.setAppearance(UItems.FILLED_JAR.getDefaultStack(), runMatch(inventory).getRight()); + return Appearance.set(UItems.FILLED_JAR.getDefaultStack(), runMatch(inventory).getRight()); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/recipe/ZapAppleRecipe.java b/src/main/java/com/minelittlepony/unicopia/recipe/ZapAppleRecipe.java index 23a849aa..b6a0c330 100644 --- a/src/main/java/com/minelittlepony/unicopia/recipe/ZapAppleRecipe.java +++ b/src/main/java/com/minelittlepony/unicopia/recipe/ZapAppleRecipe.java @@ -3,8 +3,8 @@ package com.minelittlepony.unicopia.recipe; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.minelittlepony.unicopia.item.ChameleonItem; import com.minelittlepony.unicopia.item.UItems; +import com.minelittlepony.unicopia.item.component.Appearance; import net.minecraft.item.ItemStack; import net.minecraft.network.RegistryByteBuf; @@ -21,8 +21,8 @@ public class ZapAppleRecipe extends ShapelessRecipe { Codec.STRING.optionalFieldOf("group", "").forGetter(ZapAppleRecipe::getGroup), CraftingRecipeCategory.CODEC.optionalFieldOf("category", CraftingRecipeCategory.MISC).forGetter(ZapAppleRecipe::getCategory), Registries.ITEM.getCodec().xmap( - item -> ChameleonItem.setAppearance(UItems.ZAP_APPLE.getDefaultStack(), item.getDefaultStack()), - stack -> ChameleonItem.getAppearance(stack) + item -> Appearance.set(UItems.ZAP_APPLE.getDefaultStack(), item.getDefaultStack()), + stack -> Appearance.upwrapAppearance(stack).getItem() ).fieldOf("appearance").forGetter(recipe -> recipe.getResult(null)), URecipes.SHAPELESS_RECIPE_INGREDIENTS_CODEC.fieldOf("ingredients").forGetter(ZapAppleRecipe::getIngredients) ).apply(instance, ZapAppleRecipe::new)); diff --git a/src/main/java/com/minelittlepony/unicopia/util/ColorHelper.java b/src/main/java/com/minelittlepony/unicopia/util/ColorHelper.java index c2e9db26..aa7e2854 100644 --- a/src/main/java/com/minelittlepony/unicopia/util/ColorHelper.java +++ b/src/main/java/com/minelittlepony/unicopia/util/ColorHelper.java @@ -70,9 +70,4 @@ public interface ColorHelper { return Argb.fromFloats(a, r, g, b); } - - @Deprecated - static int lerp(float delta, int fromColor, int toColor) { - return Argb.lerp(delta, fromColor, toColor); - } } diff --git a/src/main/java/com/minelittlepony/unicopia/util/PsyFluidHelper.java b/src/main/java/com/minelittlepony/unicopia/util/PsyFluidHelper.java index f83e44df..c3bd12c4 100644 --- a/src/main/java/com/minelittlepony/unicopia/util/PsyFluidHelper.java +++ b/src/main/java/com/minelittlepony/unicopia/util/PsyFluidHelper.java @@ -8,11 +8,10 @@ import java.util.function.Supplier; import com.google.common.base.Suppliers; import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant; +import net.minecraft.component.ComponentType; import net.minecraft.fluid.FluidState; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.nbt.NbtCompound; import net.minecraft.registry.Registries; +import net.minecraft.util.Identifier; final class PsyFluidHelper { private static final Supplier>> SIMPLE_FLUID_CLASS = Suppliers.memoize(() -> { @@ -22,24 +21,37 @@ final class PsyFluidHelper { return Optional.empty(); } }); + private static final Supplier>> ITEM_FLUIDS_CLASS = Suppliers.memoize(() -> { + try { + return Optional.ofNullable(Class.forName("ivorius.psychedelicraft.item.component.ItemFluids")); + } catch (Throwable t) { + return Optional.empty(); + } + }); private static final Function FALLBACK_METHOD = fluid -> fluid.getFluid().getDefaultState(); - private static final Supplier> GET_FULL_FLUID_STATE = Suppliers.memoize(() -> SIMPLE_FLUID_CLASS.get().>map(type -> { - try { - final Method method = type.getDeclaredMethod("getFluidState", ItemStack.class); - if (method != null) { - return fluid -> { - try { - ItemStack stack = Items.STONE.getDefaultStack(); - NbtCompound fluidTag = stack.getOrCreateSubNbt("fluid"); - fluidTag.putString("id", Registries.FLUID.getId(fluid.getFluid()).toString()); - fluidTag.put("attributes", fluid.getNbt()); - return FluidState.class.cast(method.invoke(type.cast(fluid), stack)); - } catch (Throwable tt) {} - return FALLBACK_METHOD.apply(fluid); - }; - } - } catch (Throwable t) {} - return FALLBACK_METHOD; + private static final Supplier> GET_FULL_FLUID_STATE = Suppliers.memoize( + () -> SIMPLE_FLUID_CLASS.get().>map(type -> { + return ITEM_FLUIDS_CLASS.get().>map(fluidsType -> { + try { + ComponentType fluidsComponentType = Registries.DATA_COMPONENT_TYPE.get(Identifier.of("psychedelicraft", "fluids")); + if (fluidsComponentType != null) { + final Method method = type.getDeclaredMethod("getFluidState", fluidsType); + if (method != null) { + return fluidVariant -> { + try { + Object fluids = fluidVariant.getComponents().get(fluidsComponentType).orElse(null); + if (fluids == null) { + return FALLBACK_METHOD.apply(fluidVariant); + } + return (FluidState)method.invoke(type.cast(fluidVariant), fluids); + } catch (Throwable tt) {} + return FALLBACK_METHOD.apply(fluidVariant); + }; + } + } + } catch (Throwable t) {} + return FALLBACK_METHOD; + }).orElse(FALLBACK_METHOD); }).orElse(FALLBACK_METHOD)); static FluidState getFullFluidState(FluidVariant variant) {