diff --git a/src/main/java/com/minelittlepony/unicopia/UConventionalTags.java b/src/main/java/com/minelittlepony/unicopia/UConventionalTags.java index ab8653b5..6b4775e9 100644 --- a/src/main/java/com/minelittlepony/unicopia/UConventionalTags.java +++ b/src/main/java/com/minelittlepony/unicopia/UConventionalTags.java @@ -1,5 +1,6 @@ package com.minelittlepony.unicopia; +import net.fabricmc.fabric.api.tag.convention.v2.ConventionalBlockTags; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.registry.RegistryKeys; @@ -9,8 +10,8 @@ import net.minecraft.util.Identifier; public interface UConventionalTags { interface Blocks { TagKey CONCRETE_POWDERS = block("concrete_powders"); - TagKey CONCRETES = block("concretes"); - TagKey GLAZED_TERRACOTTAS = block("glazed_terracottas"); + TagKey CONCRETES = ConventionalBlockTags.CONCRETES; + TagKey GLAZED_TERRACOTTAS = ConventionalBlockTags.GLAZED_TERRACOTTAS; TagKey CORAL_BLOCKS = block("coral_blocks"); TagKey CORAL_FANS = block("coral_fans"); TagKey CORALS = block("corals"); diff --git a/src/main/java/com/minelittlepony/unicopia/WorldConvertable.java b/src/main/java/com/minelittlepony/unicopia/WorldConvertable.java index 2fada4bd..0aa43e57 100644 --- a/src/main/java/com/minelittlepony/unicopia/WorldConvertable.java +++ b/src/main/java/com/minelittlepony/unicopia/WorldConvertable.java @@ -1,5 +1,7 @@ package com.minelittlepony.unicopia; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.world.World; public interface WorldConvertable { @@ -14,4 +16,8 @@ public interface WorldConvertable { default boolean isClient() { return asWorld().isClient(); } + + default RegistryEntry entryFor(RegistryKey key) { + return asWorld().getRegistryManager().get(key.getRegistryRef()).getEntry(key).orElseThrow(); + } } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/data/tree/TreeTypeLoader.java b/src/main/java/com/minelittlepony/unicopia/ability/data/tree/TreeTypeLoader.java index a2b2bcc9..b1561b2d 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/data/tree/TreeTypeLoader.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/data/tree/TreeTypeLoader.java @@ -2,20 +2,21 @@ package com.minelittlepony.unicopia.ability.data.tree; import java.util.*; import java.util.function.Supplier; -import java.util.stream.Collectors; - -import org.jetbrains.annotations.Nullable; - import com.google.gson.JsonElement; -import com.google.gson.JsonParseException; import com.minelittlepony.unicopia.Unicopia; +import com.minelittlepony.unicopia.util.CodecUtils; import com.minelittlepony.unicopia.util.Resources; import com.minelittlepony.unicopia.util.Weighted; +import com.mojang.serialization.Codec; +import com.mojang.serialization.JsonOps; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.resource.JsonDataLoader; import net.minecraft.resource.ResourceManager; import net.minecraft.util.Identifier; @@ -45,35 +46,47 @@ public class TreeTypeLoader extends JsonDataLoader implements IdentifiableResour return ID; } + @SuppressWarnings("unchecked") @Override protected void apply(Map resources, ResourceManager manager, Profiler profiler) { - entries = resources.entrySet().stream().filter(Objects::nonNull) - .collect(Collectors.toMap(Map.Entry::getKey, entry -> { - try { - return Resources.GSON.fromJson(entry.getValue(), TreeTypeDef.class); - } catch (IllegalArgumentException | JsonParseException e) { - return null; - } - })); + entries = Map.ofEntries(resources.entrySet().stream() + .filter(Objects::nonNull) + .map(entry -> TreeTypeDef.CODEC.decode(JsonOps.INSTANCE, entry.getValue()) + .result() + .map(p -> p.getFirst()) + .map(p -> Map.entry(entry.getKey(), p)) + .orElse(null)) + .filter(Objects::nonNull) + .toArray(Map.Entry[]::new)); + TreeTypes.load(entries); } - public static final class TreeTypeDef { - final Set logs; - final Set leaves; - final Set drops; - final boolean wideTrunk; - final int rarity; - final float leavesRatio; - - public TreeTypeDef(PacketByteBuf buffer) { - logs = new HashSet<>(buffer.readList(PacketByteBuf::readIdentifier)); - leaves = new HashSet<>(buffer.readList(PacketByteBuf::readIdentifier)); - drops = new HashSet<>(buffer.readList(Drop::new)); - wideTrunk = buffer.readBoolean(); - rarity = buffer.readInt(); - leavesRatio = buffer.readFloat(); - } + public record TreeTypeDef ( + Set logs, + Set leaves, + Set drops, + boolean wideTrunk, + int rarity, + float leavesRatio + ) { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + CodecUtils.setOf(Identifier.CODEC).fieldOf("logs").forGetter(TreeTypeDef::logs), + CodecUtils.setOf(Identifier.CODEC).fieldOf("leaves").forGetter(TreeTypeDef::leaves), + CodecUtils.setOf(Drop.CODEC).fieldOf("drops").forGetter(TreeTypeDef::drops), + Codec.BOOL.fieldOf("wideTrunk").forGetter(TreeTypeDef::wideTrunk), + Codec.INT.fieldOf("rarity").forGetter(TreeTypeDef::rarity), + Codec.FLOAT.fieldOf("leavesRatio").forGetter(TreeTypeDef::leavesRatio) + ).apply(instance, TreeTypeDef::new)); + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + Identifier.PACKET_CODEC.collect(PacketCodecs.toCollection(HashSet::new)), TreeTypeDef::logs, + Identifier.PACKET_CODEC.collect(PacketCodecs.toCollection(HashSet::new)), TreeTypeDef::leaves, + Drop.PACKET_CODEC.collect(PacketCodecs.toCollection(HashSet::new)), TreeTypeDef::drops, + PacketCodecs.BOOL, TreeTypeDef::wideTrunk, + PacketCodecs.INTEGER, TreeTypeDef::rarity, + PacketCodecs.FLOAT, TreeTypeDef::leavesRatio, + TreeTypeDef::new + ); public TreeType toTreeType(Identifier id) { return new TreeTypeImpl( @@ -87,35 +100,32 @@ public class TreeTypeLoader extends JsonDataLoader implements IdentifiableResour ); } - public void write(PacketByteBuf buffer) { - buffer.writeCollection(logs, PacketByteBuf::writeIdentifier); - buffer.writeCollection(leaves, PacketByteBuf::writeIdentifier); - buffer.writeCollection(drops, (a, b) -> b.write(a)); - buffer.writeBoolean(wideTrunk); - buffer.writeInt(rarity); - buffer.writeFloat(leavesRatio); - } - - static class Drop implements Weighted.Buildable> { - final int weight; - final @Nullable Identifier tag; - final @Nullable Identifier item; - - public Drop(PacketByteBuf buffer) { - weight = buffer.readInt(); - tag = buffer.readOptional(PacketByteBuf::readIdentifier).orElse(null); - item = buffer.readOptional(PacketByteBuf::readIdentifier).orElse(null); - } + static record Drop ( + int weight, + Optional tag, + Optional item + ) implements Weighted.Buildable> { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.INT.fieldOf("weight").forGetter(Drop::weight), + Identifier.CODEC.optionalFieldOf("tag").forGetter(Drop::tag), + Identifier.CODEC.optionalFieldOf("item").forGetter(Drop::item) + ).apply(instance, Drop::new)); + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + PacketCodecs.INTEGER, Drop::weight, + PacketCodecs.optional(Identifier.PACKET_CODEC), Drop::tag, + PacketCodecs.optional(Identifier.PACKET_CODEC), Drop::item, + Drop::new + ); @Override public void appendTo(Weighted.Builder> weighted) { - if (item != null) { - Registries.ITEM.getOrEmpty(item).ifPresent(item -> { + if (item.isPresent()) { + Registries.ITEM.getOrEmpty(item.get()).ifPresent(item -> { weighted.put(weight, item::getDefaultStack); }); } else { weighted.put(weight, () -> { - return Registries.ITEM.getOrCreateEntryList(TagKey.of(RegistryKeys.ITEM, tag)) + return Registries.ITEM.getOrCreateEntryList(TagKey.of(RegistryKeys.ITEM, tag.get())) .getRandom(Weighted.getRng()) .map(RegistryEntry::value) .map(Item::getDefaultStack) @@ -123,12 +133,6 @@ public class TreeTypeLoader extends JsonDataLoader implements IdentifiableResour }); } } - - public void write(PacketByteBuf buffer) { - buffer.writeInt(weight); - buffer.writeOptional(Optional.ofNullable(tag), PacketByteBuf::writeIdentifier); - buffer.writeOptional(Optional.ofNullable(item), PacketByteBuf::writeIdentifier); - } } } } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/MultiSpellSlot.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/MultiSpellSlot.java index 3dd698e5..7c1b5c83 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/MultiSpellSlot.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/MultiSpellSlot.java @@ -154,7 +154,7 @@ class MultiSpellSlot implements SpellSlots, NbtSerialisable { } else { T spell = this.spell.get(); if (spell != null) { - spell.getDataTracker().load(MsgTrackedValues.TrackerEntries.PACKET_CODEC.decode(buffer)); + spell.getDataTracker().load(MsgTrackedValues.TrackerEntries.PACKET_CODEC.decode(buffer), lookup); } } } @@ -171,7 +171,7 @@ class MultiSpellSlot implements SpellSlots, NbtSerialisable { if (spell == null) { return Optional.empty(); } - return spell.getDataTracker().getDirtyPairs().map(entries -> { + return spell.getDataTracker().getDirtyPairs(lookup).map(entries -> { PacketByteBuf buffer = new PacketByteBuf(Unpooled.buffer()); buffer.writeByte(0); TrackerEntries.PACKET_CODEC.encode(buffer, entries); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/Spell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/Spell.java index ac647fc7..76278fd1 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/Spell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/Spell.java @@ -138,7 +138,7 @@ public interface Spell extends NbtSerialisable, Affine { static T readNbt(@Nullable NbtCompound compound, WrapperLookup lookup) { try { if (compound != null) { - return CustomisedSpellType.fromNBT(compound).create(compound); + return CustomisedSpellType.fromNBT(compound).create(compound, lookup); } } catch (Exception e) { Unicopia.LOGGER.fatal("Invalid spell nbt {}", e); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/AttractiveSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/AttractiveSpell.java index 08b6e1a2..c075628a 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/AttractiveSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/AttractiveSpell.java @@ -18,6 +18,7 @@ import com.minelittlepony.unicopia.util.shape.Sphere; import net.minecraft.entity.Entity; import net.minecraft.nbt.NbtCompound; import net.minecraft.particle.ParticleTypes; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; import net.minecraft.util.hit.EntityHitResult; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; @@ -67,7 +68,7 @@ public class AttractiveSpell extends ShieldSpell implements HomingSpell, TimedSp source.spawnParticles(origin, new Sphere(false, range), 7, p -> { source.addParticle( new FollowingParticleEffect(UParticles.HEALTH_DRAIN, origin, 0.4F) - .withChild(ParticleTypes.AMBIENT_ENTITY_EFFECT), + .withChild(ParticleTypes.EFFECT), p, Vec3d.ZERO ); @@ -149,16 +150,16 @@ public class AttractiveSpell extends ShieldSpell implements HomingSpell, TimedSp } @Override - public void toNBT(NbtCompound compound) { - super.toNBT(compound); - compound.put("target", target.toNBT()); - timer.toNBT(compound); + public void toNBT(NbtCompound compound, WrapperLookup lookup) { + super.toNBT(compound, lookup); + compound.put("target", target.toNBT(lookup)); + timer.toNBT(compound, lookup); } @Override - public void fromNBT(NbtCompound compound) { - super.fromNBT(compound); - target.fromNBT(compound.getCompound("target")); - timer.fromNBT(compound); + public void fromNBT(NbtCompound compound, WrapperLookup lookup) { + super.fromNBT(compound, lookup); + target.fromNBT(compound.getCompound("target"), lookup); + timer.fromNBT(compound, lookup); } } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/AwkwardSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/AwkwardSpell.java index 7a9402c5..18fce601 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/AwkwardSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/AwkwardSpell.java @@ -16,6 +16,7 @@ import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; public class AwkwardSpell extends AbstractSpell implements TimedSpell { @@ -65,18 +66,20 @@ public class AwkwardSpell extends AbstractSpell implements TimedSpell { && type != ParticleTypes.SMOKE && type != ParticleTypes.EXPLOSION && type != ParticleTypes.EXPLOSION_EMITTER - && type != ParticleTypes.AMBIENT_ENTITY_EFFECT; + && type != ParticleTypes.ENTITY_EFFECT + && type != ParticleTypes.EFFECT + && type != ParticleTypes.INSTANT_EFFECT; } @Override - public void toNBT(NbtCompound compound) { - super.toNBT(compound); - timer.toNBT(compound); + public void toNBT(NbtCompound compound, WrapperLookup lookup) { + super.toNBT(compound, lookup); + timer.toNBT(compound, lookup); } @Override - public void fromNBT(NbtCompound compound) { - super.fromNBT(compound); - timer.fromNBT(compound); + public void fromNBT(NbtCompound compound, WrapperLookup lookup) { + super.fromNBT(compound, lookup); + timer.fromNBT(compound, lookup); } } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/BubbleSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/BubbleSpell.java index dfd6d601..3e48b811 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/BubbleSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/BubbleSpell.java @@ -1,9 +1,8 @@ package com.minelittlepony.unicopia.ability.magic.spell.effect; import java.util.Map; -import java.util.UUID; - import com.minelittlepony.unicopia.USounds; +import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.spell.*; import com.minelittlepony.unicopia.ability.magic.spell.attribute.AttributeFormat; @@ -28,18 +27,19 @@ import net.minecraft.entity.attribute.*; import net.minecraft.entity.attribute.EntityAttributeModifier.Operation; import net.minecraft.nbt.NbtCompound; import net.minecraft.particle.ParticleTypes; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.util.Identifier; import net.minecraft.util.hit.EntityHitResult; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; -public class BubbleSpell extends AbstractSpell implements TimedSpell, - ProjectileDelegate.EntityHitListener { - private static final EntityAttributeModifier GRAVITY_MODIFIER = - new EntityAttributeModifier(UUID.fromString("9dc7818b-927b-46e0-acbe-48d31a28128f"), "Bubble Floating", 0.02D - 1D, Operation.MULTIPLY_TOTAL); - private static final EntityAttributeModifier SPEED_MODIFIER = - new EntityAttributeModifier(UUID.fromString("9dc7818b-927b-46e0-acbe-48d31a28128f"), "Bubble Floating", 0.01D - 1D, Operation.MULTIPLY_TOTAL); +public class BubbleSpell extends AbstractSpell implements TimedSpell, ProjectileDelegate.EntityHitListener { + private static final Identifier EFFECT_ID = Unicopia.id("bubble_floating_modifier"); + private static final EntityAttributeModifier GRAVITY_MODIFIER = new EntityAttributeModifier(EFFECT_ID, 0.02D - 1D, Operation.ADD_MULTIPLIED_TOTAL); + private static final EntityAttributeModifier SPEED_MODIFIER = new EntityAttributeModifier(EFFECT_ID, 0.01D - 1D, Operation.ADD_MULTIPLIED_TOTAL); - private static final Map MODIFIERS = Map.of( + private static final Map, EntityAttributeModifier> MODIFIERS = Map.of( UEntityAttributes.ENTITY_GRAVITY_MODIFIER, GRAVITY_MODIFIER, UEntityAttributes.EXTENDED_REACH_DISTANCE, GRAVITY_MODIFIER, UEntityAttributes.EXTENDED_ATTACK_DISTANCE, GRAVITY_MODIFIER, @@ -157,18 +157,18 @@ public class BubbleSpell extends AbstractSpell implements TimedSpell, } @Override - public void toNBT(NbtCompound compound) { - super.toNBT(compound); + public void toNBT(NbtCompound compound, WrapperLookup lookup) { + super.toNBT(compound, lookup); compound.putInt("struggles", struggles.get()); compound.putFloat("radius", radius.get()); - timer.toNBT(compound); + timer.toNBT(compound, lookup); } @Override - public void fromNBT(NbtCompound compound) { - super.fromNBT(compound); + public void fromNBT(NbtCompound compound, WrapperLookup lookup) { + super.fromNBT(compound, lookup); struggles.set(compound.getInt("struggles")); radius.set(compound.getFloat("radius")); - timer.fromNBT(compound); + timer.fromNBT(compound, lookup); } } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/NecromancySpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/NecromancySpell.java index 36e00501..d5c799aa 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/NecromancySpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/NecromancySpell.java @@ -172,7 +172,7 @@ public class NecromancySpell extends AbstractAreaEffectSpell implements Projecti if (master != null) { master.applyDamageEffects(master, e); } - e.getWorld().sendEntityStatus(e, (byte)60); + e.getWorld().sendEntityStatus(e, EntityStatuses.ADD_DEATH_PARTICLES); e.discard(); }); }); @@ -199,7 +199,7 @@ public class NecromancySpell extends AbstractAreaEffectSpell implements Projecti for (int i = source.asWorld().random.nextInt(GEAR.length); i < GEAR.length; i++) { ItemStack pick = GEAR[i][(int)(powerScale * GEAR[i].length) % GEAR[i].length].getDefaultStack(); - minion.equipStack(LivingEntity.getPreferredEquipmentSlot(pick), pick); + minion.equipStack(minion.getPreferredEquipmentSlot(pick), pick); if (source.asWorld().random.nextFloat() > powerScale) { break; diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/SiphoningSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/SiphoningSpell.java index d844c066..5c11c39c 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/SiphoningSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/SiphoningSpell.java @@ -30,6 +30,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.NbtCompound; import net.minecraft.particle.ParticleTypes; import net.minecraft.predicate.entity.EntityPredicates; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -162,14 +163,14 @@ public class SiphoningSpell extends AbstractAreaEffectSpell { } @Override - public void toNBT(NbtCompound compound) { - super.toNBT(compound); + public void toNBT(NbtCompound compound, WrapperLookup lookup) { + super.toNBT(compound, lookup); compound.putInt("upset", ticksUpset); } @Override - public void fromNBT(NbtCompound compound) { - super.fromNBT(compound); + public void fromNBT(NbtCompound compound, WrapperLookup lookup) { + super.fromNBT(compound, lookup); ticksUpset = compound.getInt("upset"); if (ticksUpset > 0) { upset.set(true); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/SpellTraits.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/SpellTraits.java index 616c8341..63641e4b 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/SpellTraits.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/SpellTraits.java @@ -19,6 +19,7 @@ import java.util.stream.Stream; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.client.gui.ItemTraitsTooltipRenderer; +import com.minelittlepony.unicopia.item.component.UDataComponentTypes; import com.minelittlepony.unicopia.util.InventoryUtil; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Codec; @@ -32,10 +33,8 @@ import net.minecraft.item.Item; import net.minecraft.item.SpawnEggItem; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtOps; import net.minecraft.network.PacketByteBuf; -import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.codec.PacketCodec; import net.minecraft.text.Text; import net.minecraft.util.Identifier; @@ -248,19 +247,16 @@ public final class SpellTraits implements Iterable> { } public static Optional getEmbeddedTraits(ItemStack stack) { - if (!stack.hasNbt() || !stack.getNbt().contains("spell_traits", NbtElement.COMPOUND_TYPE)) { - return Optional.empty(); - } - return fromNbt(stack.getNbt().getCompound("spell_traits")); + return Optional.ofNullable(stack.get(UDataComponentTypes.SPELL_TRAITS)); } public ItemStack applyTo(ItemStack stack) { stack = stack.copy(); if (isEmpty()) { - stack.removeSubNbt("spell_traits"); + stack.remove(UDataComponentTypes.SPELL_TRAITS); return stack; } - stack.getOrCreateNbt().put("spell_traits", toNbt()); + stack.set(UDataComponentTypes.SPELL_TRAITS, this); return stack; } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/Trait.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/Trait.java index 6a7b2f34..3d7c6779 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/Trait.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/Trait.java @@ -9,8 +9,8 @@ import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.command.CommandArgumentEnum; import com.mojang.serialization.Codec; import net.minecraft.command.argument.EnumArgumentType; +import net.minecraft.component.type.AttributeModifiersComponent; import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtList; import net.minecraft.text.*; @@ -92,7 +92,7 @@ public enum Trait implements CommandArgumentEnum { Text.empty(), Text.translatable("trait." + getId().getNamespace() + "." + getId().getPath() + ".description").formatted(Formatting.GRAY), Text.empty(), - Text.translatable("gui.unicopia.trait.corruption", ItemStack.MODIFIER_FORMAT.format(getGroup().getCorruption())).formatted(Formatting.ITALIC, corruptionColor) + Text.translatable("gui.unicopia.trait.corruption", AttributeModifiersComponent.DECIMAL_FORMAT.format(getGroup().getCorruption())).formatted(Formatting.ITALIC, corruptionColor) ); MutableText tooltipText = getName().copy(); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitDiscovery.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitDiscovery.java index 29ce78d5..c5dd6b8a 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitDiscovery.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitDiscovery.java @@ -32,6 +32,7 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; import net.minecraft.util.Identifier; import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; import net.minecraft.world.World; public class TraitDiscovery implements NbtSerialisable, Copyable { @@ -120,7 +121,7 @@ public class TraitDiscovery implements NbtSerialisable, Copyable } @Override - public void toNBT(NbtCompound compound) { + public void toNBT(NbtCompound compound, WrapperLookup lookup) { NbtCompound disco = new NbtCompound(); items.forEach((key, val) -> { disco.put(key.toString(), val.toNbt()); @@ -137,7 +138,7 @@ public class TraitDiscovery implements NbtSerialisable, Copyable } @Override - public void fromNBT(NbtCompound compound) { + public void fromNBT(NbtCompound compound, WrapperLookup lookup) { clear(); NbtCompound disco = compound.getCompound("items"); disco.getKeys().forEach(key -> { diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitLoader.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitLoader.java index 28dc19df..0220d16f 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitLoader.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitLoader.java @@ -52,19 +52,19 @@ public class TraitLoader extends SinglePreparationResourceReloader lines) { + public void getTooltip(ItemStack stack, Item.TooltipContext tooltipContext, TooltipType tooltipType, List lines) { int flags = stack.hasNbt() && stack.getNbt().contains("HideFlags", 99) ? stack.getNbt().getInt("HideFlags") : 0; @@ -60,7 +62,7 @@ public class ModifierTooltipRenderer implements ItemTooltipCallback { if (!newLines.isEmpty()) { Text find = Text.translatable("item.modifiers." + slot.getName()).formatted(Formatting.GRAY); - int insertPosition = getInsertPosition(stack, find, flags, lines, context.isAdvanced()); + int insertPosition = getInsertPosition(stack, find, flags, lines, tooltipType.isAdvanced()); if (insertPosition == -1) { lines.add(ScreenTexts.EMPTY); lines.add(find); @@ -113,18 +115,18 @@ public class ModifierTooltipRenderer implements ItemTooltipCallback { return lines.indexOf(category); } - private void describeModifiers(EntityAttribute attribute, EntityAttributeModifier modifier, @Nullable PlayerEntity player, List lines) { - double value = modifier.getValue(); + private void describeModifiers(RegistryEntry attribute, EntityAttributeModifier modifier, @Nullable PlayerEntity player, List lines) { + double value = modifier.value(); boolean baseAdjusted = false; if (player != null) { value += player.getAttributeBaseValue(attribute); baseAdjusted = true; } - Operation op = modifier.getOperation(); + Operation op = modifier.operation(); double displayValue; - if (op != EntityAttributeModifier.Operation.MULTIPLY_BASE && op != EntityAttributeModifier.Operation.MULTIPLY_TOTAL) { + if (op != EntityAttributeModifier.Operation.ADD_MULTIPLIED_BASE && op != EntityAttributeModifier.Operation.ADD_MULTIPLIED_TOTAL) { displayValue = value; } else { displayValue = value * 100; diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/spellbook/element/Structure.java b/src/main/java/com/minelittlepony/unicopia/client/gui/spellbook/element/Structure.java index a4690b5b..0e66e009 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/spellbook/element/Structure.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/spellbook/element/Structure.java @@ -23,7 +23,7 @@ public record Structure(Bounds bounds, Schematic schematic) implements PageEleme Immediate immediate = context.getVertexConsumers(); MinecraftClient client = MinecraftClient.getInstance(); - float tickDelta = client.player.age + client.getTickDelta(); + float tickDelta = client.player.age + client.getRenderTickCounter().getTickDelta(false); float age = tickDelta % 360F; matrices.push(); diff --git a/src/main/java/com/minelittlepony/unicopia/client/minelittlepony/AmuletGear.java b/src/main/java/com/minelittlepony/unicopia/client/minelittlepony/AmuletGear.java index de89085e..6ef5b9aa 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/minelittlepony/AmuletGear.java +++ b/src/main/java/com/minelittlepony/unicopia/client/minelittlepony/AmuletGear.java @@ -40,7 +40,7 @@ class AmuletGear extends AmuletModel implements Gear { @Override public Identifier getTexture(T entity, Context context) { - return textures.computeIfAbsent(Registries.ITEM.getId(AmuletItem.get((LivingEntity)entity).stack().getItem()), id -> new Identifier(id.getNamespace(), "textures/models/armor/" + id.getPath() + ".png")); + return textures.computeIfAbsent(Registries.ITEM.getId(AmuletItem.get((LivingEntity)entity).stack().getItem()), id -> id.withPath(p -> "textures/models/armor/" + p + ".png")); } @Override @@ -58,7 +58,7 @@ class AmuletGear extends AmuletModel implements Gear { } @Override - public void render(MatrixStack stack, VertexConsumer consumer, int light, int overlay, float red, float green, float blue, float alpha, UUID interpolatorId) { - render(stack, consumer, light, overlay, red, green, blue, 1); + public void render(MatrixStack stack, VertexConsumer consumer, int light, int overlay, int color, UUID interpolatorId) { + render(stack, consumer, light, overlay, color); } } diff --git a/src/main/java/com/minelittlepony/unicopia/client/minelittlepony/BangleGear.java b/src/main/java/com/minelittlepony/unicopia/client/minelittlepony/BangleGear.java index d2c945a2..f46176d6 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/minelittlepony/BangleGear.java +++ b/src/main/java/com/minelittlepony/unicopia/client/minelittlepony/BangleGear.java @@ -5,7 +5,6 @@ import java.util.UUID; import com.minelittlepony.api.model.BodyPart; import com.minelittlepony.api.model.PonyModel; import com.minelittlepony.api.model.gear.Gear; -import com.minelittlepony.common.util.Color; import com.minelittlepony.unicopia.client.render.BraceletFeatureRenderer; import com.minelittlepony.unicopia.client.render.BraceletFeatureRenderer.BraceletModel; import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate; @@ -19,10 +18,11 @@ import net.minecraft.client.render.entity.model.BipedEntityModel; import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.util.SkinTextures.Model; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.component.type.DyedColorComponent; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; -import net.minecraft.item.DyeableItem; import net.minecraft.util.Arm; +import net.minecraft.util.Colors; import net.minecraft.util.Identifier; class BangleGear implements Gear { @@ -66,9 +66,11 @@ class BangleGear implements Gear { @Override public void pose(PonyModel model, Entity entity, boolean rainboom, UUID interpolatorId, float move, float swing, float bodySwing, float ticks) { alex = entity instanceof ClientPlayerEntity && ((ClientPlayerEntity)entity).getSkinTextures().model() == Model.SLIM; + color = Colors.WHITE; + glowing = false; FriendshipBraceletItem.getWornBangles((LivingEntity)entity, slot).findFirst().ifPresent(bracelet -> { - color = ((DyeableItem)bracelet.stack().getItem()).getColor(bracelet.stack()); - glowing = ((GlowableItem)bracelet.stack().getItem()).isGlowing(bracelet.stack()); + color = DyedColorComponent.getColor(bracelet.stack(), Colors.WHITE); + glowing = GlowableItem.isGlowing(bracelet.stack()); }); BraceletModel m = alex ? alexModel : steveModel; @@ -80,8 +82,8 @@ class BangleGear implements Gear { } @Override - public void render(MatrixStack stack, VertexConsumer consumer, int light, int overlay, float red, float green, float blue, float alpha, UUID interpolatorId) { + public void render(MatrixStack stack, VertexConsumer consumer, int light, int overlay, int color, UUID interpolatorId) { BraceletModel m = alex ? alexModel : steveModel; - m.render(stack, consumer, glowing ? 0x0F00F0 : light, overlay, Color.r(color), Color.g(color), Color.b(color), 1); + m.render(stack, consumer, glowing ? 0x0F00F0 : light, overlay, this.color); } } diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/AmuletFeatureRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/AmuletFeatureRenderer.java index d5a2ffbf..91b879ce 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/AmuletFeatureRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/AmuletFeatureRenderer.java @@ -23,6 +23,7 @@ import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.LivingEntity; import net.minecraft.item.ItemStack; +import net.minecraft.util.Colors; import net.minecraft.util.Identifier; import net.minecraft.registry.Registries; @@ -45,14 +46,14 @@ public class AmuletFeatureRenderer implements AccessoryF ItemStack stack = AmuletItem.get(entity).stack(); if (!stack.isEmpty()) { - Identifier texture = textures.computeIfAbsent(Registries.ITEM.getId(stack.getItem()), id -> new Identifier(id.getNamespace(), "textures/models/armor/" + id.getPath() + ".png")); + Identifier texture = textures.computeIfAbsent(Registries.ITEM.getId(stack.getItem()), id -> id.withPath(p -> "textures/models/armor/" + p + ".png")); - VertexConsumer consumer = ItemRenderer.getArmorGlintConsumer(renderContext, RenderLayer.getArmorCutoutNoCull(texture), false, false); + VertexConsumer consumer = ItemRenderer.getArmorGlintConsumer(renderContext, RenderLayer.getArmorCutoutNoCull(texture), false); if (context.getModel() instanceof BipedEntityModel) { model.setAngles(entity, context.getModel()); } - model.render(matrices, consumer, lightUv, OverlayTexture.DEFAULT_UV, 1, 1, 1, 1); + model.render(matrices, consumer, lightUv, OverlayTexture.DEFAULT_UV, Colors.WHITE); } } @@ -79,8 +80,8 @@ public class AmuletFeatureRenderer implements AccessoryF } @Override - public void render(MatrixStack matrices, VertexConsumer vertexConsumer, int i, int j, float f, float g, float h, float k) { - amulet.render(matrices, vertexConsumer, i, j, f, g, h, k); + public void render(MatrixStack matrices, VertexConsumer vertexConsumer, int i, int j, int color) { + amulet.render(matrices, vertexConsumer, i, j, color); } } } diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/BraceletFeatureRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/BraceletFeatureRenderer.java index 09a53fe6..2983bd63 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/BraceletFeatureRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/BraceletFeatureRenderer.java @@ -1,6 +1,5 @@ package com.minelittlepony.unicopia.client.render; -import com.minelittlepony.common.util.Color; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.client.minelittlepony.MineLPDelegate; import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate; @@ -15,6 +14,7 @@ import net.minecraft.client.model.ModelPartData; import net.minecraft.client.model.ModelTransform; import net.minecraft.client.model.TexturedModelData; import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.render.LightmapTextureManager; import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumer; @@ -25,9 +25,9 @@ import net.minecraft.client.render.entity.model.EntityModelPartNames; import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.util.SkinTextures; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.component.type.DyedColorComponent; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.decoration.ArmorStandEntity; -import net.minecraft.item.DyeableItem; import net.minecraft.item.ItemStack; import net.minecraft.util.*; @@ -58,7 +58,7 @@ public class BraceletFeatureRenderer implements Accessor } private void renderBangleThirdPerson(ItemStack item, MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, E entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch, Arm mainArm) { - int j = ((DyeableItem)item.getItem()).getColor(item); + int j = DyedColorComponent.getColor(item, Colors.WHITE); boolean alex = entity instanceof ClientPlayerEntity && ((ClientPlayerEntity)entity).getSkinTextures().model() == SkinTextures.Model.SLIM; @@ -69,40 +69,36 @@ public class BraceletFeatureRenderer implements Accessor ModelPart arm = isLeft ? context.getModel().leftArm : context.getModel().rightArm; arm.visible = true; VertexConsumer consumer = renderContext.getBuffer(context.getModel().getLayer(context.getTexture(entity))); - arm.render(stack, consumer, lightUv, OverlayTexture.DEFAULT_UV, 1, 1, 1, 1); + arm.render(stack, consumer, lightUv, OverlayTexture.DEFAULT_UV, Colors.WHITE); } - boolean glowing = ((GlowableItem)item.getItem()).isGlowing(item); - - VertexConsumer consumer = ItemRenderer.getArmorGlintConsumer(renderContext, RenderLayer.getArmorCutoutNoCull(TEXTURE), false, false); + VertexConsumer consumer = ItemRenderer.getArmorGlintConsumer(renderContext, RenderLayer.getArmorCutoutNoCull(TEXTURE), false); model.setAngles(context.getModel()); model.setVisible(mainArm); - model.render(stack, consumer, glowing ? 0x0F00F0 : lightUv, OverlayTexture.DEFAULT_UV, Color.r(j), Color.g(j), Color.b(j), 1); + model.render(stack, consumer, GlowableItem.isGlowing(item) ? LightmapTextureManager.MAX_LIGHT_COORDINATE : lightUv, OverlayTexture.DEFAULT_UV, j); } @Override public void renderArm(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, E entity, ModelPart armModel, Arm side) { FriendshipBraceletItem.getWornBangles(entity, side == entity.getMainArm() ? TrinketsDelegate.MAIN_GLOVE : TrinketsDelegate.SECONDARY_GLOVE).findFirst().ifPresent(item -> { - int j = ((DyeableItem)item.stack().getItem()).getColor(item.stack()); + int j = DyedColorComponent.getColor(item.stack(), Colors.WHITE); boolean alex = entity instanceof ClientPlayerEntity && ((ClientPlayerEntity)entity).getSkinTextures().model() == SkinTextures.Model.SLIM; BraceletModel model = alex ? alexModel : steveModel; - boolean glowing = ((GlowableItem)item.stack().getItem()).isGlowing(item.stack()); - if (MineLPDelegate.getInstance().getPlayerPonyRace((ClientPlayerEntity)entity).isEquine()) { stack.translate(side == Arm.LEFT ? 0.06 : -0.06, 0.3, 0); } else { stack.translate(0, -0.1, 0); } - VertexConsumer consumer = ItemRenderer.getArmorGlintConsumer(renderContext, RenderLayer.getArmorCutoutNoCull(TEXTURE), false, false); + VertexConsumer consumer = ItemRenderer.getArmorGlintConsumer(renderContext, RenderLayer.getArmorCutoutNoCull(TEXTURE), false); model.setAngles(context.getModel()); model.setVisible(side); - model.render(stack, consumer, glowing ? 0x0F00F0 : lightUv, OverlayTexture.DEFAULT_UV, Color.r(j), Color.g(j), Color.b(j), 1); + model.render(stack, consumer, GlowableItem.isGlowing(item.stack()) ? LightmapTextureManager.MAX_LIGHT_COORDINATE : lightUv, OverlayTexture.DEFAULT_UV, j); }); } @@ -144,9 +140,9 @@ public class BraceletFeatureRenderer implements Accessor } @Override - public void render(MatrixStack matrixStack, VertexConsumer vertexConsumer, int i, int j, float f, float g, float h, float k) { - leftArm.render(matrixStack, vertexConsumer, i, j, f, g, h, k); - rightArm.render(matrixStack, vertexConsumer, i, j, f, g, h, k); + public void render(MatrixStack matrixStack, VertexConsumer vertexConsumer, int i, int j, int color) { + leftArm.render(matrixStack, vertexConsumer, i, j, color); + rightArm.render(matrixStack, vertexConsumer, i, j, color); } } diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/shader/ViewportShader.java b/src/main/java/com/minelittlepony/unicopia/client/render/shader/ViewportShader.java index 0bda2eb9..68464ef2 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/shader/ViewportShader.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/shader/ViewportShader.java @@ -27,8 +27,8 @@ public class ViewportShader implements SynchronousResourceReloader, Identifiable public static final ViewportShader INSTANCE = new ViewportShader(); - public static final Identifier CREEPER_SHADER = new Identifier("shaders/post/invert.json"); - public static final Identifier DESATURATION_SHADER = new Identifier("shaders/post/desaturate.json"); + public static final Identifier CREEPER_SHADER = Identifier.ofVanilla("shaders/post/invert.json"); + public static final Identifier DESATURATION_SHADER = Identifier.ofVanilla("shaders/post/desaturate.json"); private final MinecraftClient client = MinecraftClient.getInstance(); @@ -112,8 +112,8 @@ public class ViewportShader implements SynchronousResourceReloader, Identifiable } @Override - public PostEffectPass addPass(String programName, Framebuffer source, Framebuffer dest) throws IOException { - PostEffectPass pass = super.addPass(programName, source, dest); + public PostEffectPass addPass(String programName, Framebuffer source, Framebuffer dest, boolean linear) throws IOException { + PostEffectPass pass = super.addPass(programName, source, dest, linear); if (programs == null) { programs = LinkedListMultimap.create(); } diff --git a/src/main/java/com/minelittlepony/unicopia/compat/trinkets/UnicopiaTrinket.java b/src/main/java/com/minelittlepony/unicopia/compat/trinkets/UnicopiaTrinket.java index 6b00ab7d..67bb489b 100644 --- a/src/main/java/com/minelittlepony/unicopia/compat/trinkets/UnicopiaTrinket.java +++ b/src/main/java/com/minelittlepony/unicopia/compat/trinkets/UnicopiaTrinket.java @@ -1,7 +1,5 @@ package com.minelittlepony.unicopia.compat.trinkets; -import java.util.UUID; - import com.google.common.collect.Multimap; import com.minelittlepony.unicopia.entity.ItemTracker; import com.minelittlepony.unicopia.entity.Living; @@ -9,16 +7,17 @@ import com.minelittlepony.unicopia.item.FriendshipBraceletItem; import com.minelittlepony.unicopia.item.WearableItem; import dev.emi.trinkets.api.*; -import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.attribute.EntityAttributeModifier; import net.minecraft.item.Equipment; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.predicate.entity.EntityPredicates; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.sound.SoundEvent; +import net.minecraft.util.Identifier; import net.minecraft.world.event.GameEvent; public class UnicopiaTrinket implements Trinket { @@ -74,21 +73,22 @@ public class UnicopiaTrinket implements Trinket { return slot.inventory().getStack(slot.index()).isEmpty(); } - @Override - public boolean canUnequip(ItemStack stack, SlotReference slot, LivingEntity entity) { - return !(EnchantmentHelper.hasBindingCurse(stack) && EntityPredicates.EXCEPT_CREATIVE_OR_SPECTATOR.test(entity)); - } - @Override public void tick(ItemStack stack, SlotReference slot, LivingEntity entity) { item.inventoryTick(stack, entity.getWorld(), entity, slot.index(), false); } @Override - public Multimap getModifiers(ItemStack stack, SlotReference slot, LivingEntity entity, UUID uuid) { - Multimap modifiers = Trinket.super.getModifiers(stack, slot, entity, uuid); + public Multimap, EntityAttributeModifier> getModifiers(ItemStack stack, SlotReference slot, LivingEntity entity, Identifier slotIdentifier) { + Multimap, EntityAttributeModifier> modifiers = Trinket.super.getModifiers(stack, slot, entity, slotIdentifier); + if (item instanceof WearableItem wearable) { - item.getAttributeModifiers(wearable.getSlotType(stack)); + EquipmentSlot es = wearable.getSlotType(stack); + stack.get(DataComponentTypes.ATTRIBUTE_MODIFIERS).modifiers().forEach(entry -> { + if (entry.slot().matches(es)) { + modifiers.put(entry.attribute(), entry.modifier()); + } + }); } return modifiers; } diff --git a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java index 56efccbf..2d571ffb 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java +++ b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java @@ -11,16 +11,15 @@ import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.recipe.URecipes; import com.mojang.datafixers.util.Pair; +import net.minecraft.component.EnchantmentEffectComponentTypes; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.CraftingResultInventory; import net.minecraft.inventory.Inventory; import net.minecraft.item.Equipment; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; import net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket; import net.minecraft.recipe.RecipeEntry; import net.minecraft.screen.PlayerScreenHandler; @@ -129,7 +128,7 @@ public class SpellbookScreenHandler extends ScreenHandler { @Override public boolean canTakeItems(PlayerEntity playerEntity) { ItemStack stack = getStack(); - if (!stack.isEmpty() && !playerEntity.isCreative() && EnchantmentHelper.hasBindingCurse(stack)) { + if (!stack.isEmpty() && !playerEntity.isCreative() && EnchantmentHelper.hasAnyEnchantmentsWith(stack, EnchantmentEffectComponentTypes.PREVENT_ARMOR_CHANGE)) { return false; } return super.canTakeItems(playerEntity); @@ -323,7 +322,7 @@ public class SpellbookScreenHandler extends ScreenHandler { Slot slot = getSlot(i); ItemStack current = slot.getStack(); - if (!current.isEmpty() && ItemStack.canCombine(stack, current)) { + if (!current.isEmpty() && ItemStack.areItemsAndComponentsEqual(stack, current)) { // abide by the slot's max item count when trying to insert stacks int available = Math.min(Math.min(current.getMaxCount(), slot.getMaxItemCount(stack)) - current.getCount(), stack.getCount()); diff --git a/src/main/java/com/minelittlepony/unicopia/container/SpellbookState.java b/src/main/java/com/minelittlepony/unicopia/container/SpellbookState.java index 727cf520..cbcfd467 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/SpellbookState.java +++ b/src/main/java/com/minelittlepony/unicopia/container/SpellbookState.java @@ -5,20 +5,26 @@ import java.util.function.Consumer; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.network.datasync.Synchronizable; -import com.minelittlepony.unicopia.util.NbtSerialisable; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.network.PacketByteBuf; +import io.netty.buffer.ByteBuf; import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.codec.PacketCodec; -import net.minecraft.registry.RegistryWrapper.WrapperLookup; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; -public class SpellbookState extends Synchronizable implements NbtSerialisable { - // TODO: SpellbookState needs a packet codec - public static final PacketCodec PACKET_CODEC = null; +public class SpellbookState extends Synchronizable { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Identifier.CODEC.optionalFieldOf("current_page").forGetter(i -> i.currentPageId), + Codec.unboundedMap(Identifier.CODEC, PageState.CODEC).fieldOf("states").forGetter(i -> i.states) + ).apply(instance, SpellbookState::new)); + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + PacketCodecs.optional(Identifier.PACKET_CODEC), SpellbookState::getCurrentPageId, + PacketCodecs.map(HashMap::new, Identifier.PACKET_CODEC, PageState.PACKET_CODEC), p -> p.states, + SpellbookState::new + ); public static final Identifier CRAFTING_ID = Unicopia.id("crafting"); public static final Identifier PROFILE_ID = Unicopia.id("profile"); @@ -30,6 +36,15 @@ public class SpellbookState extends Synchronizable implements Nb private final Map states = new HashMap<>(); + public SpellbookState() {} + + private SpellbookState(Optional currentPageId, Map states) { + this.currentPageId = currentPageId; + states.forEach((id, state) -> { + getState(id).offset = state.offset; + }); + } + public boolean isDirty() { boolean isDirty = dirty; dirty = false; @@ -56,42 +71,21 @@ public class SpellbookState extends Synchronizable implements Nb dirty = true; } - public void toPacket(PacketByteBuf buf) { - buf.writeOptional(currentPageId, PacketByteBuf::writeIdentifier); - buf.writeMap(states, PacketByteBuf::writeIdentifier, (b, v) -> v.toPacket(b)); - } - - public SpellbookState fromPacket(PacketByteBuf buf) { - currentPageId = buf.readOptional(PacketByteBuf::readIdentifier); - buf.readMap(PacketByteBuf::readIdentifier, b -> new PageState(page -> synchronize()).fromPacket(b)).forEach((id, state) -> { - getState(id).copyFrom(state); + public SpellbookState createCopy() { + SpellbookState copy = new SpellbookState(); + copy.currentPageId = currentPageId; + states.forEach((id, state) -> { + copy.getState(id).offset = state.offset; }); - return this; + return copy; } - @Override - public void toNBT(NbtCompound compound, WrapperLookup lookup) { - currentPageId.ifPresent(id -> compound.putString("current_page", id.toString())); - NbtCompound states = new NbtCompound(); - compound.put("states", states); - this.states.forEach((id, page) -> { - states.put(id.toString(), page.toNBT(lookup)); - }); - } + public static class PageState extends Synchronizable { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.INT.fieldOf("offset").forGetter(PageState::getOffset) + ).apply(instance, PageState::new)); + public static final PacketCodec PACKET_CODEC = PacketCodecs.INTEGER.xmap(PageState::new, PageState::getOffset); - @Override - public void fromNBT(NbtCompound compound, WrapperLookup lookup) { - currentPageId = compound.contains("current_page", NbtElement.STRING_TYPE) ? Optional.ofNullable(Identifier.tryParse(compound.getString("current_page"))) : Optional.empty(); - NbtCompound states = compound.getCompound("states"); - states.getKeys().stream().forEach(key -> { - Identifier id = Identifier.tryParse(key); - if (id != null) { - getState(id).fromNBT(states.getCompound(key), lookup); - } - }); - } - - public static class PageState extends Synchronizable implements NbtSerialisable { private int offset; public PageState() {} @@ -100,6 +94,10 @@ public class SpellbookState extends Synchronizable implements Nb setSynchronizer(synchronizer); } + public PageState(int offset) { + this.offset = offset; + } + @Override public void copyFrom(PageState other) { offset = other.offset; @@ -117,24 +115,5 @@ public class SpellbookState extends Synchronizable implements Nb public void swap(int incr, int max) { setOffset(MathHelper.clamp(getOffset() + incr, 0, max - 1)); } - - public void toPacket(PacketByteBuf buf) { - buf.writeInt(offset); - } - - public PageState fromPacket(PacketByteBuf buf) { - offset = buf.readInt(); - return this; - } - - @Override - public void toNBT(NbtCompound compound, WrapperLookup lookup) { - compound.putInt("offset", offset); - } - - @Override - public void fromNBT(NbtCompound compound, WrapperLookup lookup) { - offset = compound.getInt("offset"); - } } } diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/Datagen.java b/src/main/java/com/minelittlepony/unicopia/datagen/Datagen.java index d38469c4..94131585 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/Datagen.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/Datagen.java @@ -8,6 +8,7 @@ import com.minelittlepony.unicopia.datagen.providers.DietsProvider; import com.minelittlepony.unicopia.datagen.providers.SeasonsGrowthRatesProvider; import com.minelittlepony.unicopia.datagen.providers.UAdvancementsProvider; import com.minelittlepony.unicopia.datagen.providers.UModelProvider; +import com.minelittlepony.unicopia.datagen.providers.UPaintingVariantProvider; import com.minelittlepony.unicopia.datagen.providers.loot.UBlockAdditionsLootTableProvider; import com.minelittlepony.unicopia.datagen.providers.loot.UBlockLootTableProvider; import com.minelittlepony.unicopia.datagen.providers.loot.UChestAdditionsLootTableProvider; @@ -61,7 +62,9 @@ public class Datagen implements DataGeneratorEntrypoint { pack.addProvider(UEntityTypeTagProvider::new); pack.addProvider(UStatusEffectTagProvider::new); pack.addProvider(UDimensionTypeTagProvider::new); - pack.addProvider(UPaintingVariantTagProvider::new); + + final var paintingVariantProvider = pack.addProvider(UPaintingVariantProvider::new); + pack.addProvider((output, registries) -> new UPaintingVariantTagProvider(output, registries, paintingVariantProvider)); pack.addProvider(UModelProvider::new); pack.addProvider(URecipeProvider::new); diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/DietProfileGenerator.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/DietProfileGenerator.java index cfa28601..15ae63dc 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/DietProfileGenerator.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/DietProfileGenerator.java @@ -17,8 +17,8 @@ import com.minelittlepony.unicopia.diet.affliction.StatusEffectAffliction; import com.minelittlepony.unicopia.entity.effect.UEffects; import com.minelittlepony.unicopia.item.UFoodComponents; +import net.minecraft.component.type.FoodComponents; import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.item.FoodComponents; public class DietProfileGenerator { diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/DietsProvider.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/DietsProvider.java index 5b14e3dd..31bd7483 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/DietsProvider.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/DietsProvider.java @@ -55,7 +55,7 @@ public class DietsProvider implements DataProvider { } keyToGroupId.computeIfAbsent(key.id(), i -> new HashSet<>()).add(id); }); - diets.accept(id, () -> FoodGroup.CODEC.encode(attributes, JsonOps.INSTANCE, new JsonObject()).result().get()); + diets.accept(id, () -> FoodGroup.EFFECTS_CODEC.encode(attributes, JsonOps.INSTANCE, new JsonObject()).result().get()); }); var profiles = dietsCollector.prime(); new DietProfileGenerator().generate((race, profile) -> { diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/SeasonsModelGenerator.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/SeasonsModelGenerator.java index 5b5474bc..8f85d7bb 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/SeasonsModelGenerator.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/SeasonsModelGenerator.java @@ -34,7 +34,7 @@ public class SeasonsModelGenerator extends UBlockStateModelGenerator { private static JsonObject createTextures(String season, JsonObject input) { JsonObject textures = new JsonObject(); input.entrySet().forEach(entry -> { - textures.addProperty(entry.getKey(), new Identifier(entry.getValue().getAsString()).withPath(path -> path.replace("/", "/seasons/" + season + "/")).toString()); + textures.addProperty(entry.getKey(), Identifier.of(entry.getValue().getAsString()).withPath(path -> path.replace("/", "/seasons/" + season + "/")).toString()); }); return textures; } diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/UAdvancementsProvider.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/UAdvancementsProvider.java index d200f3c1..a1e0a933 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/UAdvancementsProvider.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/UAdvancementsProvider.java @@ -1,7 +1,9 @@ package com.minelittlepony.unicopia.datagen.providers; +import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.UTags; @@ -35,18 +37,23 @@ import net.minecraft.predicate.NumberRange; import net.minecraft.predicate.TagPredicate; import net.minecraft.predicate.entity.DamageSourcePredicate; import net.minecraft.predicate.item.EnchantmentPredicate; +import net.minecraft.predicate.item.EnchantmentsPredicate; import net.minecraft.predicate.item.ItemPredicate; +import net.minecraft.predicate.item.ItemSubPredicateTypes; import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryWrapper; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.tag.TagKey; import net.minecraft.util.Identifier; public class UAdvancementsProvider extends FabricAdvancementProvider { - public UAdvancementsProvider(FabricDataOutput output) { - super(output); + public UAdvancementsProvider(FabricDataOutput output, CompletableFuture registryLookup) { + super(output, registryLookup); } @Override - public void generateAdvancement(Consumer consumer) { + public void generateAdvancement(WrapperLookup registryLookup, Consumer consumer) { AdvancementDisplayBuilder.create(UItems.ALICORN_BADGE).criterion("crafting_table", hasItems(Items.CRAFTING_TABLE)).build(consumer, "root").children(root -> { createTribeRootAdvancement(consumer, root, Race.EARTH).children(consumer, this::generateEarthTribeAdvancementsTree); createTribeRootAdvancement(consumer, root, Race.BAT).children(consumer, this::generateBatTribeAdvancementsTree); @@ -195,7 +202,7 @@ public class UAdvancementsProvider extends FabricAdvancementProvider { AdvancementDisplayBuilder.create(Items.NETHERITE_SCRAP).showToast().announce() .criterion("enchant_with_consumption", enchant(UEnchantments.CONSUMPTION)) .rewards(AdvancementRewards.Builder.experience(120)) - .parent(new Identifier("story/enchant_item")) + .parent(Identifier.ofVanilla("story/enchant_item")) .group("enchanting") .build(consumer, "experimental") .child(Items.NETHERITE_PICKAXE) @@ -207,7 +214,7 @@ public class UAdvancementsProvider extends FabricAdvancementProvider { AdvancementDisplayBuilder.create(Items.GOLDEN_APPLE).showToast().announce() .criterion("enchant_with_heart_bound", enchant(UEnchantments.HEART_BOUND)) .rewards(AdvancementRewards.Builder.experience(120)) - .parent(new Identifier("story/enchant_item")) + .parent(Identifier.ofVanilla("story/enchant_item")) .group("enchanting") .build(consumer, "hearts_stronger_than_horses") .child(Items.GOLDEN_PICKAXE) @@ -218,11 +225,11 @@ public class UAdvancementsProvider extends FabricAdvancementProvider { .build(consumer, "soulmate"); } - public static AdvancementCriterion enchant(Enchantment enchantment) { + public static AdvancementCriterion enchant(RegistryEntry enchantment) { return Criteria.ENCHANTED_ITEM.create(new EnchantedItemCriterion.Conditions( Optional.empty(), Optional.of(ItemPredicate.Builder.create() - .enchantment(new EnchantmentPredicate(enchantment, NumberRange.IntRange.ANY)) + .subPredicate(ItemSubPredicateTypes.ENCHANTMENTS, EnchantmentsPredicate.enchantments(List.of(new EnchantmentPredicate(enchantment, NumberRange.IntRange.ANY)))) .build()), NumberRange.IntRange.ANY )); diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/UBlockStateModelGenerator.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/UBlockStateModelGenerator.java index 9821a4ca..2a74f4dd 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/UBlockStateModelGenerator.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/UBlockStateModelGenerator.java @@ -57,8 +57,8 @@ import static net.minecraft.data.client.VariantSettings.*; import static net.minecraft.data.client.VariantSettings.Rotation.*; public class UBlockStateModelGenerator extends BlockStateModelGenerator { - static final Identifier AIR_BLOCK_ID = new Identifier("block/air"); - static final Identifier AIR_ITEM_ID = new Identifier("item/air"); + static final Identifier AIR_BLOCK_ID = Identifier.ofVanilla("block/air"); + static final Identifier AIR_ITEM_ID = Identifier.ofVanilla("item/air"); static UBlockStateModelGenerator create(BlockStateModelGenerator modelGenerator) { return new UBlockStateModelGenerator(modelGenerator.blockStateCollector, modelGenerator.modelCollector, modelGenerator::excludeFromSimpleItemModelGeneration); @@ -166,9 +166,9 @@ public class UBlockStateModelGenerator extends BlockStateModelGenerator { // bales registerAll((g, block) -> g.registerBale(Unicopia.id(block.getLeft().getPath().replace("bale", "block")), block.getLeft(), block.getRight()), - new Pair<>(new Identifier("hay_block"), "_top"), - new Pair<>(new Identifier("farmersdelight", "rice_bale"), "_top"), - new Pair<>(new Identifier("farmersdelight", "straw_bale"), "_end") + new Pair<>(Identifier.ofVanilla("hay_block"), "_top"), + new Pair<>(Identifier.of("farmersdelight", "rice_bale"), "_top"), + new Pair<>(Identifier.of("farmersdelight", "straw_bale"), "_end") ); // shells registerAll(UBlockStateModelGenerator::registerShell, UBlocks.CLAM_SHELL, UBlocks.TURRET_SHELL, UBlocks.SCALLOP_SHELL); diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/UPaintingVariantProvider.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/UPaintingVariantProvider.java new file mode 100644 index 00000000..c76312df --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/UPaintingVariantProvider.java @@ -0,0 +1,60 @@ +package com.minelittlepony.unicopia.datagen.providers; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +import com.minelittlepony.unicopia.Unicopia; + +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricDynamicRegistryProvider; +import net.minecraft.entity.decoration.painting.PaintingVariant; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; + +public class UPaintingVariantProvider extends FabricDynamicRegistryProvider { + + private final List> keys = new ArrayList<>(); + + public UPaintingVariantProvider(FabricDataOutput output, CompletableFuture registriesFuture) { + super(output, registriesFuture); + } + + @Override + public String getName() { + return "Painting Variants"; + } + + public List> getKeys() { + return keys; + } + + @Override + protected void configure(WrapperLookup registries, Entries entries) { + register(entries, "bloom", 2, 1); + register(entries, "chicken", 2, 1); + register(entries, "bells", 2, 1); + + register(entries, "crystal", 3, 3); + register(entries, "harmony", 3, 3); + + register(entries, "equality", 2, 4); + register(entries, "solar", 2, 4); + register(entries, "lunar", 2, 4); + register(entries, "platinum", 2, 4); + register(entries, "hurricane", 2, 4); + register(entries, "pudding", 2, 4); + register(entries, "terra", 2, 4); + register(entries, "equestria", 2, 4); + + register(entries, "blossom", 2, 3); + register(entries, "shadow", 2, 3); + } + + private void register(Entries entries, String name, int width, int height) { + RegistryKey key = RegistryKey.of(RegistryKeys.PAINTING_VARIANT, Unicopia.id(name)); + keys.add(key); + entries.add(key, new PaintingVariant(width, height, key.getValue())); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/loot/UBlockAdditionsLootTableProvider.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/loot/UBlockAdditionsLootTableProvider.java index 08287291..cd374e14 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/loot/UBlockAdditionsLootTableProvider.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/loot/UBlockAdditionsLootTableProvider.java @@ -1,5 +1,6 @@ package com.minelittlepony.unicopia.datagen.providers.loot; +import java.util.concurrent.CompletableFuture; import java.util.function.Function; import com.minelittlepony.unicopia.UTags; @@ -31,6 +32,7 @@ import net.minecraft.predicate.NumberRange; import net.minecraft.predicate.entity.LocationPredicate; import net.minecraft.predicate.item.EnchantmentPredicate; import net.minecraft.predicate.item.ItemPredicate; +import net.minecraft.registry.RegistryWrapper; import net.minecraft.util.Identifier; import net.minecraft.world.biome.BiomeKeys; @@ -44,8 +46,8 @@ public class UBlockAdditionsLootTableProvider extends FabricBlockLootTableProvid LocationCheckLootCondition.builder(LocationPredicate.Builder.create().biome(BiomeKeys.OCEAN)) .or(LocationCheckLootCondition.builder(LocationPredicate.Builder.create().biome(BiomeKeys.BEACH))); - public UBlockAdditionsLootTableProvider(FabricDataOutput dataOutput) { - super(dataOutput); + public UBlockAdditionsLootTableProvider(FabricDataOutput dataOutput, CompletableFuture registryLookup) { + super(dataOutput, registryLookup); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/CraftingMaterialHelper.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/CraftingMaterialHelper.java index 3c19d467..4a165995 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/CraftingMaterialHelper.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/CraftingMaterialHelper.java @@ -7,11 +7,11 @@ import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.recipe.CloudShapingRecipe; import com.mojang.datafixers.util.Either; -import net.fabricmc.fabric.api.tag.convention.v1.ConventionalItemTags; +import net.fabricmc.fabric.api.tag.convention.v2.ConventionalItemTags; import net.minecraft.advancement.AdvancementCriterion; import net.minecraft.data.server.recipe.RecipeProvider; import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder; -import net.minecraft.data.server.recipe.SingleItemRecipeJsonBuilder; +import net.minecraft.data.server.recipe.StonecuttingRecipeJsonBuilder; import net.minecraft.data.server.recipe.VanillaRecipeProvider; import net.minecraft.item.Item; import net.minecraft.item.ItemConvertible; @@ -42,8 +42,8 @@ public interface CraftingMaterialHelper { } return Either.left( Registries.ITEM.getOrEmpty(id) - .or(() -> Registries.ITEM.getOrEmpty(new Identifier(Identifier.DEFAULT_NAMESPACE, id.getPath()))) - .or(() -> Registries.ITEM.getOrEmpty(new Identifier(Identifier.DEFAULT_NAMESPACE, id.getPath().replace(suffex, "")))) + .or(() -> Registries.ITEM.getOrEmpty(Identifier.ofVanilla(id.getPath()))) + .or(() -> Registries.ITEM.getOrEmpty(Identifier.ofVanilla(id.getPath().replace(suffex, "")))) .orElseThrow(() -> new NoSuchElementException("No item with id " + id)) ); } @@ -84,7 +84,7 @@ public interface CraftingMaterialHelper { return "has_" + spell.getId() + "_gemstone"; } - static SingleItemRecipeJsonBuilder createCloudShaping(Ingredient input, RecipeCategory category, ItemConvertible output, int count) { - return new SingleItemRecipeJsonBuilder(category, CloudShapingRecipe::new, input, output, count); + static StonecuttingRecipeJsonBuilder createCloudShaping(Ingredient input, RecipeCategory category, ItemConvertible output, int count) { + return new StonecuttingRecipeJsonBuilder(category, CloudShapingRecipe::new, input, output, count); } } diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/CuttingBoardRecipeJsonBuilder.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/CuttingBoardRecipeJsonBuilder.java index 79540359..05841cc2 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/CuttingBoardRecipeJsonBuilder.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/CuttingBoardRecipeJsonBuilder.java @@ -7,6 +7,7 @@ import java.util.Map; import org.spongepowered.include.com.google.common.base.Preconditions; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.advancement.Advancement; @@ -15,19 +16,21 @@ import net.minecraft.advancement.AdvancementRequirements; import net.minecraft.advancement.AdvancementRewards; import net.minecraft.advancement.criterion.RecipeUnlockedCriterion; import net.minecraft.data.server.recipe.RecipeExporter; -import net.minecraft.inventory.Inventory; import net.minecraft.item.Item; import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.recipe.Ingredient; import net.minecraft.recipe.Recipe; import net.minecraft.recipe.RecipeSerializer; import net.minecraft.recipe.RecipeType; -import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.recipe.input.CraftingRecipeInput; +import net.minecraft.recipe.input.RecipeInput; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; import net.minecraft.registry.tag.TagKey; import net.minecraft.sound.SoundEvent; import net.minecraft.util.Identifier; @@ -43,7 +46,7 @@ public class CuttingBoardRecipeJsonBuilder { private final List results = new ArrayList<>(); private final List ingredients = new ArrayList<>(); - private Identifier sound = new Identifier("minecraft:item.axe.strip"); + private Identifier sound = Identifier.ofVanilla("item.axe.strip"); public static CuttingBoardRecipeJsonBuilder create(ItemConvertible output, TagKey tool) { return new CuttingBoardRecipeJsonBuilder(output, tool); @@ -90,7 +93,7 @@ public class CuttingBoardRecipeJsonBuilder { exporter.accept(id, new CuttingBoardRecipe( ingredients, - new Tool(new Identifier("farmersdelight:tool"), tool), + new Tool(Identifier.of("farmersdelight:tool"), tool), sound, results ), @@ -103,7 +106,7 @@ public class CuttingBoardRecipeJsonBuilder { } public void offerTo(RecipeExporter exporter, String recipePath) { - Identifier recipeId = new Identifier(recipePath); + Identifier recipeId = Identifier.of(recipePath); if (recipeId.equals(Registries.ITEM.getId(output.asItem()))) { throw new IllegalStateException("Recipe " + recipePath + " should remove its 'save' argument as it is equal to default one"); } @@ -119,7 +122,7 @@ public class CuttingBoardRecipeJsonBuilder { public record Result(Identifier item, int count) { public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( Identifier.CODEC.fieldOf("item").forGetter(Result::item), - Codecs.createStrictOptionalFieldCodec(Codecs.POSITIVE_INT, "count", 1).forGetter(Result::count) + Codecs.POSITIVE_INT.optionalFieldOf("count", 1).forGetter(Result::count) ).apply(i, Result::new)); } @@ -128,8 +131,14 @@ public class CuttingBoardRecipeJsonBuilder { Tool tool, Identifier sound, List result - ) implements Recipe { - static final Identifier ID = new Identifier("farmersdelight", "cutting"); + ) implements Recipe { + static final Identifier ID = Identifier.of("farmersdelight", "cutting"); + static final MapCodec CODEC = RecordCodecBuilder.mapCodec(i -> i.group( + Ingredient.DISALLOW_EMPTY_CODEC.listOf().fieldOf("ingredients").forGetter(CuttingBoardRecipe::ingredients), + Tool.CODEC.fieldOf("tool").forGetter(CuttingBoardRecipe::tool), + Identifier.CODEC.fieldOf("sound").forGetter(CuttingBoardRecipe::sound), + Result.CODEC.listOf().fieldOf("result").forGetter(CuttingBoardRecipe::result) + ).apply(i, CuttingBoardRecipe::new)); static final RecipeType TYPE = Registry.register(Registries.RECIPE_TYPE, ID, new RecipeType<>() { @Override public String toString() { @@ -138,38 +147,39 @@ public class CuttingBoardRecipeJsonBuilder { }); static final RecipeSerializer SERIALIZER = Registry.register(Registries.RECIPE_SERIALIZER, ID, new RecipeSerializer<>() { @Override - public Codec codec() { return CODEC; } - + public MapCodec codec() { return CODEC; } @Override - public CuttingBoardRecipe read(PacketByteBuf buf) { return null; } - - @Override - public void write(PacketByteBuf buf, CuttingBoardRecipe recipe) { } + public PacketCodec packetCodec() { return null; } }); - static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( - Ingredient.DISALLOW_EMPTY_CODEC.listOf().fieldOf("ingredients").forGetter(CuttingBoardRecipe::ingredients), - Tool.CODEC.fieldOf("tool").forGetter(CuttingBoardRecipe::tool), - Identifier.CODEC.fieldOf("sound").forGetter(CuttingBoardRecipe::sound), - Result.CODEC.listOf().fieldOf("result").forGetter(CuttingBoardRecipe::result) - ).apply(i, CuttingBoardRecipe::new)); public static void bootstrap() {} @Override - public boolean matches(Inventory inventory, World world) { return false; } + public boolean matches(CraftingRecipeInput inventory, World world) { return false; } @Override - public ItemStack craft(Inventory inventory, DynamicRegistryManager registryManager) { return ItemStack.EMPTY; } + public ItemStack craft(CraftingRecipeInput inventory, WrapperLookup registryManager) { return ItemStack.EMPTY; } @Override public boolean fits(int width, int height) { return false; } @Override - public ItemStack getResult(DynamicRegistryManager registryManager) { return ItemStack.EMPTY; } + public ItemStack getResult(WrapperLookup registryManager) { return ItemStack.EMPTY; } @Override public RecipeSerializer getSerializer() { return SERIALIZER; } @Override public RecipeType getType() { return TYPE; } + + static class CuttingInput implements RecipeInput { + @Override + public ItemStack getStackInSlot(int slot) { + return null; + } + @Override + public int getSize() { + return 0; + } + } } } diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/GrowingRecipeJsonBuilder.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/GrowingRecipeJsonBuilder.java index e0e5b355..3b215dc5 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/GrowingRecipeJsonBuilder.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/GrowingRecipeJsonBuilder.java @@ -69,7 +69,7 @@ public class GrowingRecipeJsonBuilder { } public void offerTo(RecipeExporter exporter, String recipePath) { - Identifier recipeId = new Identifier(recipePath); + Identifier recipeId = Identifier.of(recipePath); Identifier id = Registries.BLOCK.getId(output.getBlock()); if (recipeId.equals(id)) { throw new IllegalStateException("Recipe " + recipePath + " should remove its 'save' argument as it is equal to default one"); diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/SpellcraftingRecipeJsonBuilder.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/SpellcraftingRecipeJsonBuilder.java index e140d2c3..43060d77 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/SpellcraftingRecipeJsonBuilder.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/SpellcraftingRecipeJsonBuilder.java @@ -96,7 +96,7 @@ public class SpellcraftingRecipeJsonBuilder { } public void offerTo(RecipeExporter exporter, String recipePath) { - Identifier recipeId = new Identifier(recipePath); + Identifier recipeId = Identifier.of(recipePath); if (recipeId.equals(spell.getId())) { throw new IllegalStateException("Recipe " + recipePath + " should remove its 'save' argument as it is equal to default one"); } diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/URecipeProvider.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/URecipeProvider.java index 546f8b46..ad85deb9 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/URecipeProvider.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/URecipeProvider.java @@ -4,6 +4,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.concurrent.CompletableFuture; import java.util.stream.Stream; import org.jetbrains.annotations.Nullable; @@ -28,8 +29,8 @@ import com.mojang.datafixers.util.Either; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; -import net.fabricmc.fabric.api.resource.conditions.v1.DefaultResourceConditions; -import net.fabricmc.fabric.api.tag.convention.v1.ConventionalItemTags; +import net.fabricmc.fabric.api.resource.conditions.v1.ResourceConditions; +import net.fabricmc.fabric.api.tag.convention.v2.ConventionalItemTags; import net.minecraft.advancement.AdvancementCriterion; import net.minecraft.advancement.criterion.Criteria; import net.minecraft.advancement.criterion.InventoryChangedCriterion; @@ -49,6 +50,7 @@ import net.minecraft.predicate.item.ItemPredicate; import net.minecraft.recipe.Ingredient; import net.minecraft.recipe.book.RecipeCategory; import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryWrapper; import net.minecraft.registry.tag.ItemTags; import net.minecraft.registry.tag.TagKey; import net.minecraft.resource.featuretoggle.FeatureSet; @@ -57,8 +59,8 @@ import net.minecraft.util.Identifier; public class URecipeProvider extends FabricRecipeProvider { private static final List WOOLS = List.of(Items.BLACK_WOOL, Items.BLUE_WOOL, Items.BROWN_WOOL, Items.CYAN_WOOL, Items.GRAY_WOOL, Items.GREEN_WOOL, Items.LIGHT_BLUE_WOOL, Items.LIGHT_GRAY_WOOL, Items.LIME_WOOL, Items.MAGENTA_WOOL, Items.ORANGE_WOOL, Items.PINK_WOOL, Items.PURPLE_WOOL, Items.RED_WOOL, Items.YELLOW_WOOL, Items.WHITE_WOOL); - public URecipeProvider(FabricDataOutput output) { - super(output); + public URecipeProvider(FabricDataOutput output, CompletableFuture registriesFuture) { + super(output, registriesFuture); } @Override @@ -90,7 +92,7 @@ public class URecipeProvider extends FabricRecipeProvider { .offerTo(exporter, convertBetween(UItems.SUNGLASSES, UItems.BROKEN_SUNGLASSES)); // farmers delight - offerFarmersDelightCuttingRecipes(withConditions(exporter, DefaultResourceConditions.allModsLoaded("farmersdelight"))); + offerFarmersDelightCuttingRecipes(withConditions(exporter, ResourceConditions.allModsLoaded("farmersdelight"))); } private void generateVanillaRecipeExtensions(RecipeExporter exporter) { @@ -732,7 +734,7 @@ public class URecipeProvider extends FabricRecipeProvider { CuttingBoardRecipeJsonBuilder.create(stripped, ItemTags.AXES) .input(unstripped).criterion(hasItem(unstripped), conditionsFromItem(unstripped)) .sound(SoundEvents.ITEM_AXE_STRIP) - .result(new Identifier("farmersdelight:tree_bark")) + .result(Identifier.of("farmersdelight:tree_bark")) .offerTo(exporter, convertBetween(stripped, unstripped)); }); } diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/SereneSeasonsTags.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/SereneSeasonsTags.java index 100dcc99..a5dfdb10 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/SereneSeasonsTags.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/SereneSeasonsTags.java @@ -14,7 +14,7 @@ public interface SereneSeasonsTags { TagKey SUMMER_CROPS = item("summer_crops"); private static TagKey item(String name) { - return TagKey.of(RegistryKeys.ITEM, new Identifier("sereneseasons", name)); + return TagKey.of(RegistryKeys.ITEM, Identifier.of("sereneseasons", name)); } } @@ -25,7 +25,7 @@ public interface SereneSeasonsTags { TagKey SUMMER_CROPS = block("summer_crops"); private static TagKey block(String name) { - return TagKey.of(RegistryKeys.BLOCK, new Identifier("sereneseasons", name)); + return TagKey.of(RegistryKeys.BLOCK, Identifier.of("sereneseasons", name)); } } diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UBlockTagProvider.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UBlockTagProvider.java index b741612e..972974e1 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UBlockTagProvider.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UBlockTagProvider.java @@ -12,11 +12,10 @@ import com.minelittlepony.unicopia.server.world.UTreeGen; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider; -import net.fabricmc.fabric.api.tag.convention.v1.ConventionalBlockTags; +import net.fabricmc.fabric.api.tag.convention.v2.ConventionalBlockTags; import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.registry.Registries; -import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryWrapper; import net.minecraft.registry.RegistryWrapper.WrapperLookup; import net.minecraft.registry.tag.BlockTags; @@ -101,7 +100,7 @@ public class UBlockTagProvider extends FabricTagProvider.BlockTagProvider { getOrCreateTagBuilder(UTags.Blocks.KICKS_UP_DUST).forceAddTag(BlockTags.SAND).add( Blocks.SUSPICIOUS_SAND, Blocks.GRAVEL, Blocks.SUSPICIOUS_GRAVEL - ).forceAddTag(TagKey.of(RegistryKeys.BLOCK, new Identifier("c", "concrete_powders"))); + ).forceAddTag(ConventionalBlockTags.CONCRETES); getOrCreateTagBuilder(UTags.Blocks.UNAFFECTED_BY_GROW_ABILITY).add(Blocks.GRASS_BLOCK); addSeasonalCrops(); @@ -252,9 +251,7 @@ public class UBlockTagProvider extends FabricTagProvider.BlockTagProvider { } private void populateConventionalTags() { - getOrCreateTagBuilder(UConventionalTags.Blocks.CONCRETES).add(Arrays.stream(DyeColor.values()).map(i -> Registries.BLOCK.get(new Identifier(i.getName() + "_concrete"))).toArray(Block[]::new)); - getOrCreateTagBuilder(UConventionalTags.Blocks.CONCRETE_POWDERS).add(Arrays.stream(DyeColor.values()).map(i -> Registries.BLOCK.get(new Identifier(i.getName() + "_concrete_powder"))).toArray(Block[]::new)); - getOrCreateTagBuilder(UConventionalTags.Blocks.GLAZED_TERRACOTTAS).add(Arrays.stream(DyeColor.values()).map(i -> Registries.BLOCK.get(new Identifier(i.getName() + "_glazed_terracotta"))).toArray(Block[]::new)); + getOrCreateTagBuilder(UConventionalTags.Blocks.CONCRETE_POWDERS).add(Arrays.stream(DyeColor.values()).map(i -> Registries.BLOCK.get(Identifier.of(i.getName() + "_concrete_powder"))).toArray(Block[]::new)); getOrCreateTagBuilder(UConventionalTags.Blocks.CORAL_BLOCKS).add(Blocks.TUBE_CORAL_BLOCK, Blocks.BRAIN_CORAL_BLOCK, Blocks.BUBBLE_CORAL_BLOCK, Blocks.FIRE_CORAL_BLOCK, Blocks.HORN_CORAL_BLOCK); getOrCreateTagBuilder(UConventionalTags.Blocks.CORAL_FANS).add(Blocks.TUBE_CORAL_FAN, Blocks.BRAIN_CORAL_FAN, Blocks.BUBBLE_CORAL_FAN, Blocks.FIRE_CORAL_FAN, Blocks.HORN_CORAL_FAN); getOrCreateTagBuilder(UConventionalTags.Blocks.CORALS).add(Blocks.TUBE_CORAL, Blocks.BRAIN_CORAL, Blocks.BUBBLE_CORAL, Blocks.FIRE_CORAL, Blocks.HORN_CORAL); diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UDimensionTypeTagProvider.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UDimensionTypeTagProvider.java index e2e1e274..63000c3c 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UDimensionTypeTagProvider.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UDimensionTypeTagProvider.java @@ -18,18 +18,18 @@ public class UDimensionTypeTagProvider extends FabricTagProvider @Override protected void configure(WrapperLookup lookup) { getOrCreateTagBuilder(UTags.DimensionTypes.HAS_NO_ATMOSPHERE) - .addOptional(new Identifier("ad_astra", "earth_orbit")) - .addOptional(new Identifier("ad_astra", "glacio_orbit")) - .addOptional(new Identifier("ad_astra", "mars_orbit")) - .addOptional(new Identifier("ad_astra", "mercury_orbit")) - .addOptional(new Identifier("ad_astra", "moon")).addOptional(new Identifier("adastra", "moon_orbit")) - .addOptional(new Identifier("ad_astra", "venus_orbit")) + .addOptional(Identifier.of("ad_astra", "earth_orbit")) + .addOptional(Identifier.of("ad_astra", "glacio_orbit")) + .addOptional(Identifier.of("ad_astra", "mars_orbit")) + .addOptional(Identifier.of("ad_astra", "mercury_orbit")) + .addOptional(Identifier.of("ad_astra", "moon")).addOptional(Identifier.of("adastra", "moon_orbit")) + .addOptional(Identifier.of("ad_astra", "venus_orbit")) - .addOptional(new Identifier("adastra", "earth_orbit")) - .addOptional(new Identifier("adastra", "glacio_orbit")) - .addOptional(new Identifier("adastra", "mars_orbit")) - .addOptional(new Identifier("adastra", "mercury_orbit")) - .addOptional(new Identifier("adastra", "moon")).addOptional(new Identifier("adastra", "moon_orbit")) - .addOptional(new Identifier("adastra", "venus_orbit")); + .addOptional(Identifier.of("adastra", "earth_orbit")) + .addOptional(Identifier.of("adastra", "glacio_orbit")) + .addOptional(Identifier.of("adastra", "mars_orbit")) + .addOptional(Identifier.of("adastra", "mercury_orbit")) + .addOptional(Identifier.of("adastra", "moon")).addOptional(Identifier.of("adastra", "moon_orbit")) + .addOptional(Identifier.of("adastra", "venus_orbit")); } } diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UItemTagProvider.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UItemTagProvider.java index 11452ef5..0be7beac 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UItemTagProvider.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UItemTagProvider.java @@ -19,7 +19,7 @@ import com.minelittlepony.unicopia.server.world.UTreeGen; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider; -import net.fabricmc.fabric.api.tag.convention.v1.ConventionalItemTags; +import net.fabricmc.fabric.api.tag.convention.v2.ConventionalItemTags; import net.minecraft.block.Block; import net.minecraft.data.family.BlockFamily; import net.minecraft.item.Item; @@ -67,7 +67,6 @@ public class UItemTagProvider extends FabricTagProvider.ItemTagProvider { getOrCreateTagBuilder(ItemTags.CHEST_BOATS).add(UItems.PALM_CHEST_BOAT); getOrCreateTagBuilder(ItemTags.BOATS).add(UItems.PALM_BOAT); - getOrCreateTagBuilder(ItemTags.MUSIC_DISCS).add(ItemFamilies.MUSIC_DISCS); getOrCreateTagBuilder(ItemTags.CREEPER_DROP_MUSIC_DISCS).add(UItems.MUSIC_DISC_CRUSADE, UItems.MUSIC_DISC_FUNK, UItems.MUSIC_DISC_PET, UItems.MUSIC_DISC_POPULAR); getOrCreateTagBuilder(ItemTags.SIGNS).add(UBlocks.PALM_SIGN.asItem()); @@ -76,8 +75,6 @@ public class UItemTagProvider extends FabricTagProvider.ItemTagProvider { getOrCreateTagBuilder(UTags.Items.HORSE_SHOES).add(ItemFamilies.HORSE_SHOES); getOrCreateTagBuilder(UTags.Items.POLEARMS).add(ItemFamilies.POLEARMS); - getOrCreateTagBuilder(ItemTags.TOOLS).addTag(UTags.Items.HORSE_SHOES).addTag(UTags.Items.POLEARMS); - getOrCreateTagBuilder(UTags.Items.BASKETS).add(ItemFamilies.BASKETS); getOrCreateTagBuilder(UTags.Items.BADGES).add(Race.REGISTRY.stream() .map(race -> race.getId().withPath(p -> p + "_badge")) @@ -93,7 +90,7 @@ public class UItemTagProvider extends FabricTagProvider.ItemTagProvider { // technical tags getOrCreateTagBuilder(ItemTags.VILLAGER_PLANTABLE_SEEDS).addTag(UTags.Items.APPLE_SEEDS); - getOrCreateTagBuilder(UTags.Items.CAN_CUT_PIE).forceAddTag(ConventionalItemTags.SHEARS).addOptionalTag(UConventionalTags.Items.TOOL_KNIVES); + getOrCreateTagBuilder(UTags.Items.CAN_CUT_PIE).forceAddTag(ConventionalItemTags.SHEAR_TOOLS).addOptionalTag(UConventionalTags.Items.TOOL_KNIVES); getOrCreateTagBuilder(UTags.Items.COOLS_OFF_KIRINS).add(Items.MELON_SLICE, UItems.JUICE).forceAddTag(ConventionalItemTags.WATER_BUCKETS); getOrCreateTagBuilder(UTags.Items.FALLS_SLOWLY).add(Items.FEATHER, UItems.CLOUD_LUMP).forceAddTag(UTags.Items.MAGIC_FEATHERS); getOrCreateTagBuilder(UTags.Items.IS_DELIVERED_AGGRESSIVELY).forceAddTag(ItemTags.ANVIL); @@ -125,8 +122,8 @@ public class UItemTagProvider extends FabricTagProvider.ItemTagProvider { Items.GOLDEN_PICKAXE, Items.GOLDEN_SHOVEL, Items.GOLDEN_AXE, Items.GOLDEN_SWORD, Items.GOLDEN_HOE, UItems.GOLDEN_HORSE_SHOE, UItems.GOLDEN_POLEARM, UItems.GOLDEN_FEATHER, UItems.GOLDEN_WING, UItems.GOLDEN_OAK_SEEDS - ).forceAddTag(ConventionalItemTags.GOLD_INGOTS).forceAddTag(ConventionalItemTags.RAW_GOLD_ORES).forceAddTag(ConventionalItemTags.RAW_GOLD_BLOCKS) - .addOptionalTag(new Identifier("farmersdelight:golden_knife")); + ).forceAddTag(ConventionalItemTags.GOLD_INGOTS).forceAddTag(ConventionalItemTags.GOLD_RAW_MATERIALS).forceAddTag(ConventionalItemTags.STORAGE_BLOCKS_RAW_GOLD) + .addOptionalTag(Identifier.of("farmersdelight:golden_knife")); getOrCreateTagBuilder(UTags.Items.LOOT_BUG_EPIC_DROPS).add( Items.DIAMOND_BLOCK, Items.DIAMOND_HELMET, Items.DIAMOND_BOOTS, Items.DIAMOND_LEGGINGS, Items.DIAMOND_CHESTPLATE, @@ -316,10 +313,10 @@ public class UItemTagProvider extends FabricTagProvider.ItemTagProvider { getOrCreateTagBuilder(UConventionalTags.Items.APPLES) .add(Items.APPLE, Items.GOLDEN_APPLE, Items.ENCHANTED_GOLDEN_APPLE, UItems.ROTTEN_APPLE) .forceAddTag(UTags.Items.FRESH_APPLES) - .addOptionalTag(new Identifier("c", "pyrite_apples")) // no idea which mod add pyrite apples + .addOptionalTag(Identifier.of("c", "pyrite_apples")) // no idea which mod add pyrite apples ; getOrCreateTagBuilder(UConventionalTags.Items.BANANAS).add(UItems.BANANA); - getOrCreateTagBuilder(UConventionalTags.Items.RAW_FISH).add(Items.COD, Items.SALMON, Items.PUFFERFISH, Items.TROPICAL_FISH).addOptionalTag(new Identifier("c", "mollusks")); + getOrCreateTagBuilder(UConventionalTags.Items.RAW_FISH).add(Items.COD, Items.SALMON, Items.PUFFERFISH, Items.TROPICAL_FISH).addOptionalTag(Identifier.of("c", "mollusks")); getOrCreateTagBuilder(UConventionalTags.Items.COOKED_FISH).add(Items.COOKED_COD, Items.COOKED_SALMON, UItems.COOKED_TROPICAL_FISH, UItems.COOKED_PUFFERFISH, UItems.FRIED_AXOLOTL); getOrCreateTagBuilder(UConventionalTags.Items.ROTTEN_FISH).add(UItems.ROTTEN_COD, UItems.ROTTEN_TROPICAL_FISH, UItems.ROTTEN_SALMON, UItems.ROTTEN_PUFFERFISH); getOrCreateTagBuilder(ItemTags.FISHES).add( @@ -328,24 +325,24 @@ public class UItemTagProvider extends FabricTagProvider.ItemTagProvider { ); getOrCreateTagBuilder(UConventionalTags.Items.COOKED_MEAT) .add(Items.COOKED_PORKCHOP, Items.COOKED_BEEF, Items.COOKED_MUTTON, Items.COOKED_RABBIT, Items.COOKED_CHICKEN, Items.RABBIT_STEW) - .addOptionalTag(new Identifier("c", "cooked_bacon")) - .addOptionalTag(new Identifier("c", "cooked_beef")) - .addOptionalTag(new Identifier("c", "cooked_chicken")) - .addOptionalTag(new Identifier("c", "cooked_mutton")) - .addOptionalTag(new Identifier("c", "cooked_pork")) - .addOptionalTag(new Identifier("c", "fried_chickens")) - .addOptionalTag(new Identifier("c", "hamburgers")) - .addOptionalTag(new Identifier("c", "pork_and_beans")) - .addOptionalTag(new Identifier("c", "pork_jerkies")) - .addOptionalTag(new Identifier("c", "protien")); + .addOptionalTag(Identifier.of("c", "cooked_bacon")) + .addOptionalTag(Identifier.of("c", "cooked_beef")) + .addOptionalTag(Identifier.of("c", "cooked_chicken")) + .addOptionalTag(Identifier.of("c", "cooked_mutton")) + .addOptionalTag(Identifier.of("c", "cooked_pork")) + .addOptionalTag(Identifier.of("c", "fried_chickens")) + .addOptionalTag(Identifier.of("c", "hamburgers")) + .addOptionalTag(Identifier.of("c", "pork_and_beans")) + .addOptionalTag(Identifier.of("c", "pork_jerkies")) + .addOptionalTag(Identifier.of("c", "protien")); getOrCreateTagBuilder(UConventionalTags.Items.RAW_MEAT) .add(Items.PORKCHOP, Items.BEEF, Items.MUTTON, Items.RABBIT, Items.CHICKEN) - .addOptionalTag(new Identifier("c", "raw_bacon")) - .addOptionalTag(new Identifier("c", "raw_beef")) - .addOptionalTag(new Identifier("c", "raw_chicken")) - .addOptionalTag(new Identifier("c", "raw_mutton")) - .addOptionalTag(new Identifier("c", "raw_pork")) - .addOptionalTag(new Identifier("c", "lemon_chickens")); + .addOptionalTag(Identifier.of("c", "raw_bacon")) + .addOptionalTag(Identifier.of("c", "raw_beef")) + .addOptionalTag(Identifier.of("c", "raw_chicken")) + .addOptionalTag(Identifier.of("c", "raw_mutton")) + .addOptionalTag(Identifier.of("c", "raw_pork")) + .addOptionalTag(Identifier.of("c", "lemon_chickens")); getOrCreateTagBuilder(UConventionalTags.Items.ROTTEN_MEAT).add(Items.ROTTEN_FLESH); getOrCreateTagBuilder(UConventionalTags.Items.ROTTEN_INSECT).add(Items.FERMENTED_SPIDER_EYE); getOrCreateTagBuilder(UConventionalTags.Items.COOKED_INSECT).add(UItems.COOKED_FROG_LEGS); @@ -368,9 +365,9 @@ public class UItemTagProvider extends FabricTagProvider.ItemTagProvider { getOrCreateTagBuilder(UConventionalTags.Items.NUTS).add(UItems.BOWL_OF_NUTS) .addOptionalTag(UConventionalTags.Items.CROPS_PEANUTS) .forceAddTag(UConventionalTags.Items.ACORNS) - .addOptional(new Identifier("garnished", "nuts")) - .addOptional(new Identifier("garnished", "nut_mix")) - .addOptional(new Identifier("garnished", "neverable_delecacies")); + .addOptional(Identifier.of("garnished", "nuts")) + .addOptional(Identifier.of("garnished", "nut_mix")) + .addOptional(Identifier.of("garnished", "neverable_delecacies")); getOrCreateTagBuilder(UConventionalTags.Items.FRUITS) .add(Items.MELON_SLICE, Items.SWEET_BERRIES, Items.GLOW_BERRIES, Items.CHORUS_FRUIT) .add(UItems.JUICE, UItems.ZAP_APPLE, UItems.ZAP_BULB) @@ -378,7 +375,7 @@ public class UItemTagProvider extends FabricTagProvider.ItemTagProvider { .forceAddTag(UConventionalTags.Items.PINEAPPLES) .forceAddTag(UConventionalTags.Items.APPLES) .forceAddTag(UConventionalTags.Items.BANANAS) - .addOptionalTag(new Identifier("garnished", "berries")); + .addOptionalTag(Identifier.of("garnished", "berries")); getOrCreateTagBuilder(UConventionalTags.Items.DESSERTS).add(Items.CAKE, UItems.APPLE_PIE_SLICE).forceAddTag(UTags.Items.PIES); getOrCreateTagBuilder(UConventionalTags.Items.CANDY).add(Items.SUGAR, UItems.ROCK_CANDY, UItems.CANDIED_APPLE); getOrCreateTagBuilder(UTags.Items.BAKED_GOODS).add( @@ -391,78 +388,78 @@ public class UItemTagProvider extends FabricTagProvider.ItemTagProvider { private void exportFarmersDelightItems() { getOrCreateTagBuilder(UTags.Items.COOLS_OFF_KIRINS) - .addOptional(new Identifier("farmersdelight", "melon_popsicle")) - .addOptional(new Identifier("farmersdelight", "melon_juice")); - getOrCreateTagBuilder(TagKey.of(RegistryKeys.ITEM, new Identifier("farmersdelight", "cabbage_roll_ingredients"))).add(UItems.OATS, UItems.ROCK, UItems.WHEAT_WORMS); - getOrCreateTagBuilder(TagKey.of(RegistryKeys.ITEM, new Identifier("farmersdelight", "comfort_foods"))).add(UItems.OATMEAL, UItems.ROCK_STEW, UItems.MUFFIN); + .addOptional(Identifier.of("farmersdelight", "melon_popsicle")) + .addOptional(Identifier.of("farmersdelight", "melon_juice")); + getOrCreateTagBuilder(TagKey.of(RegistryKeys.ITEM, Identifier.of("farmersdelight", "cabbage_roll_ingredients"))).add(UItems.OATS, UItems.ROCK, UItems.WHEAT_WORMS); + getOrCreateTagBuilder(TagKey.of(RegistryKeys.ITEM, Identifier.of("farmersdelight", "comfort_foods"))).add(UItems.OATMEAL, UItems.ROCK_STEW, UItems.MUFFIN); getOrCreateTagBuilder(UConventionalTags.Items.RAW_FISH) - .addOptional(new Identifier("farmersdelight", "cod_roll")) - .addOptional(new Identifier("farmersdelight", "salmon_roll")) - .addOptional(new Identifier("farmersdelight", "cod_slice")) - .addOptional(new Identifier("farmersdelight", "salmon_slice")); + .addOptional(Identifier.of("farmersdelight", "cod_roll")) + .addOptional(Identifier.of("farmersdelight", "salmon_roll")) + .addOptional(Identifier.of("farmersdelight", "cod_slice")) + .addOptional(Identifier.of("farmersdelight", "salmon_slice")); getOrCreateTagBuilder(UConventionalTags.Items.COOKED_FISH) - .addOptional(new Identifier("farmersdelight", "fish_stew")) - .addOptional(new Identifier("farmersdelight", "baked_cod_stew")) - .addOptional(new Identifier("farmersdelight", "grilled_salmon")); + .addOptional(Identifier.of("farmersdelight", "fish_stew")) + .addOptional(Identifier.of("farmersdelight", "baked_cod_stew")) + .addOptional(Identifier.of("farmersdelight", "grilled_salmon")); getOrCreateTagBuilder(UConventionalTags.Items.RAW_MEAT) - .addOptional(new Identifier("farmersdelight", "ham")); + .addOptional(Identifier.of("farmersdelight", "ham")); getOrCreateTagBuilder(UConventionalTags.Items.COOKED_MEAT) - .addOptional(new Identifier("farmersdelight", "chicken_soup")) - .addOptional(new Identifier("farmersdelight", "bacon_and_eggs")) - .addOptional(new Identifier("farmersdelight", "pasta_with_meatballs")) - .addOptional(new Identifier("farmersdelight", "beef_stew")) - .addOptional(new Identifier("farmersdelight", "bone_broth")) - .addOptional(new Identifier("farmersdelight", "mutton_wrap")) - .addOptional(new Identifier("farmersdelight", "bacon_sandwich")) - .addOptional(new Identifier("farmersdelight", "hamburger")) - .addOptional(new Identifier("farmersdelight", "chicken_sandwich")) - .addOptional(new Identifier("farmersdelight", "barbecue_stick")) - .addOptional(new Identifier("farmersdelight", "smoked_ham")) - .addOptional(new Identifier("farmersdelight", "honey_glazed_ham")) - .addOptional(new Identifier("farmersdelight", "honey_glazed_ham_block")) - .addOptional(new Identifier("farmersdelight", "roast_chicken")) - .addOptional(new Identifier("farmersdelight", "roast_chicken_block")) - .addOptional(new Identifier("farmersdelight", "steak_and_potatoes")) - .addOptional(new Identifier("farmersdelight", "roasted_mutton_chops")) - .addOptional(new Identifier("farmersdelight", "pasta_with_mutton_chop")); + .addOptional(Identifier.of("farmersdelight", "chicken_soup")) + .addOptional(Identifier.of("farmersdelight", "bacon_and_eggs")) + .addOptional(Identifier.of("farmersdelight", "pasta_with_meatballs")) + .addOptional(Identifier.of("farmersdelight", "beef_stew")) + .addOptional(Identifier.of("farmersdelight", "bone_broth")) + .addOptional(Identifier.of("farmersdelight", "mutton_wrap")) + .addOptional(Identifier.of("farmersdelight", "bacon_sandwich")) + .addOptional(Identifier.of("farmersdelight", "hamburger")) + .addOptional(Identifier.of("farmersdelight", "chicken_sandwich")) + .addOptional(Identifier.of("farmersdelight", "barbecue_stick")) + .addOptional(Identifier.of("farmersdelight", "smoked_ham")) + .addOptional(Identifier.of("farmersdelight", "honey_glazed_ham")) + .addOptional(Identifier.of("farmersdelight", "honey_glazed_ham_block")) + .addOptional(Identifier.of("farmersdelight", "roast_chicken")) + .addOptional(Identifier.of("farmersdelight", "roast_chicken_block")) + .addOptional(Identifier.of("farmersdelight", "steak_and_potatoes")) + .addOptional(Identifier.of("farmersdelight", "roasted_mutton_chops")) + .addOptional(Identifier.of("farmersdelight", "pasta_with_mutton_chop")); getOrCreateTagBuilder(UConventionalTags.Items.FRUITS) - .addOptional(new Identifier("farmersdelight", "pumpkin_slice")) - .addOptional(new Identifier("farmersdelight", "tomato")) - .addOptional(new Identifier("farmersdelight", "melon_juice")) - .addOptional(new Identifier("farmersdelight", "fruit_salad")); + .addOptional(Identifier.of("farmersdelight", "pumpkin_slice")) + .addOptional(Identifier.of("farmersdelight", "tomato")) + .addOptional(Identifier.of("farmersdelight", "melon_juice")) + .addOptional(Identifier.of("farmersdelight", "fruit_salad")); getOrCreateTagBuilder(UConventionalTags.Items.DESSERTS) - .addOptional(new Identifier("farmersdelight", "sweet_berry_cheesecake")) - .addOptional(new Identifier("farmersdelight", "sweet_berry_cheesecake_slice")) - .addOptional(new Identifier("farmersdelight", "chocolate_pie_slice")) - .addOptional(new Identifier("farmersdelight", "cake_slice")) - .addOptional(new Identifier("farmersdelight", "apple_pie_slice")) - .addOptional(new Identifier("farmersdelight", "glow_berry_custard")); + .addOptional(Identifier.of("farmersdelight", "sweet_berry_cheesecake")) + .addOptional(Identifier.of("farmersdelight", "sweet_berry_cheesecake_slice")) + .addOptional(Identifier.of("farmersdelight", "chocolate_pie_slice")) + .addOptional(Identifier.of("farmersdelight", "cake_slice")) + .addOptional(Identifier.of("farmersdelight", "apple_pie_slice")) + .addOptional(Identifier.of("farmersdelight", "glow_berry_custard")); getOrCreateTagBuilder(UConventionalTags.Items.COOKIES) - .addOptional(new Identifier("farmersdelight", "sweet_berry_cookie")) - .addOptional(new Identifier("farmersdelight", "honey_cookie")); + .addOptional(Identifier.of("farmersdelight", "sweet_berry_cookie")) + .addOptional(Identifier.of("farmersdelight", "honey_cookie")); getOrCreateTagBuilder(UTags.Items.BAKED_GOODS) - .addOptional(new Identifier("farmersdelight", "wheat_dough")) - .addOptional(new Identifier("farmersdelight", "raw_pasta")) - .addOptional(new Identifier("farmersdelight", "pie_crust")) - .addOptional(new Identifier("farmersdelight", "egg_sandwich")); + .addOptional(Identifier.of("farmersdelight", "wheat_dough")) + .addOptional(Identifier.of("farmersdelight", "raw_pasta")) + .addOptional(Identifier.of("farmersdelight", "pie_crust")) + .addOptional(Identifier.of("farmersdelight", "egg_sandwich")); getOrCreateTagBuilder(UTags.Items.HIGH_QUALITY_SEA_VEGETABLES) - .addOptional(new Identifier("farmersdelight", "kelp_roll")); + .addOptional(Identifier.of("farmersdelight", "kelp_roll")); getOrCreateTagBuilder(UTags.Items.LOW_QUALITY_SEA_VEGETABLES) - .addOptional(new Identifier("farmersdelight", "kelp_roll_slice")); + .addOptional(Identifier.of("farmersdelight", "kelp_roll_slice")); getOrCreateTagBuilder(UTags.Items.FORAGE_FILLING) - .addOptional(new Identifier("farmersdelight", "horse_feed")) - .addOptional(new Identifier("farmersdelight", "rice_bale")) - .addOptional(new Identifier("farmersdelight", "straw_bale")); + .addOptional(Identifier.of("farmersdelight", "horse_feed")) + .addOptional(Identifier.of("farmersdelight", "rice_bale")) + .addOptional(Identifier.of("farmersdelight", "straw_bale")); getOrCreateTagBuilder(UTags.Items.FORAGE_SAFE) - .addOptional(new Identifier("farmersdelight", "sandy_shrub")) - .addOptional(new Identifier("farmersdelight", "wild_cabbages")) - .addOptional(new Identifier("farmersdelight", "wild_onions")) - .addOptional(new Identifier("farmersdelight", "wild_carrots")) - .addOptional(new Identifier("farmersdelight", "wild_beetroots")) - .addOptional(new Identifier("farmersdelight", "wild_rice")); + .addOptional(Identifier.of("farmersdelight", "sandy_shrub")) + .addOptional(Identifier.of("farmersdelight", "wild_cabbages")) + .addOptional(Identifier.of("farmersdelight", "wild_onions")) + .addOptional(Identifier.of("farmersdelight", "wild_carrots")) + .addOptional(Identifier.of("farmersdelight", "wild_beetroots")) + .addOptional(Identifier.of("farmersdelight", "wild_rice")); getOrCreateTagBuilder(UTags.Items.FORAGE_RISKY) - .addOptional(new Identifier("farmersdelight", "wild_tomatoes")) - .addOptional(new Identifier("farmersdelight", "wild_potatoes")) - .addOptionalTag(new Identifier("c", "meads")); + .addOptional(Identifier.of("farmersdelight", "wild_tomatoes")) + .addOptional(Identifier.of("farmersdelight", "wild_potatoes")) + .addOptionalTag(Identifier.of("c", "meads")); } } diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UPaintingVariantTagProvider.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UPaintingVariantTagProvider.java index acd7613d..ede22609 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UPaintingVariantTagProvider.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UPaintingVariantTagProvider.java @@ -2,7 +2,7 @@ package com.minelittlepony.unicopia.datagen.providers.tag; import java.util.concurrent.CompletableFuture; -import com.minelittlepony.unicopia.entity.mob.UEntities; +import com.minelittlepony.unicopia.datagen.providers.UPaintingVariantProvider; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider; @@ -12,12 +12,16 @@ import net.minecraft.registry.RegistryWrapper.WrapperLookup; import net.minecraft.registry.tag.PaintingVariantTags; public class UPaintingVariantTagProvider extends FabricTagProvider { - public UPaintingVariantTagProvider(FabricDataOutput output, CompletableFuture registriesFuture) { + + private final UPaintingVariantProvider provider; + + public UPaintingVariantTagProvider(FabricDataOutput output, CompletableFuture registriesFuture, UPaintingVariantProvider provider) { super(output, RegistryKeys.PAINTING_VARIANT, registriesFuture); + this.provider = provider; } @Override protected void configure(WrapperLookup lookup) { - getOrCreateTagBuilder(PaintingVariantTags.PLACEABLE).add(UEntities.Paintings.REGISTRY.toArray(PaintingVariant[]::new)); + getOrCreateTagBuilder(PaintingVariantTags.PLACEABLE).add(provider.getKeys()); } } diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UStatusEffectTagProvider.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UStatusEffectTagProvider.java index 6422d0e1..6d834db2 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UStatusEffectTagProvider.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/tag/UStatusEffectTagProvider.java @@ -17,6 +17,8 @@ public class UStatusEffectTagProvider extends FabricTagProvider { @Override protected void configure(WrapperLookup lookup) { - getOrCreateTagBuilder(UTags.StatusEffects.PINEAPPLE_EFFECTS).add(StatusEffects.REGENERATION, StatusEffects.ABSORPTION, StatusEffects.LUCK, StatusEffects.HASTE); + getOrCreateTagBuilder(UTags.StatusEffects.PINEAPPLE_EFFECTS).add( + StatusEffects.REGENERATION.value(), StatusEffects.ABSORPTION.value(), StatusEffects.LUCK.value(), StatusEffects.HASTE.value() + ); } } diff --git a/src/main/java/com/minelittlepony/unicopia/diet/Ailment.java b/src/main/java/com/minelittlepony/unicopia/diet/Ailment.java index 9dadb1a8..e4754ea3 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/Ailment.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/Ailment.java @@ -1,22 +1,17 @@ package com.minelittlepony.unicopia.diet; import com.minelittlepony.unicopia.diet.affliction.Affliction; +import com.minelittlepony.unicopia.diet.affliction.EmptyAffliction; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; public record Ailment(Affliction effects) { - public static final Ailment EMPTY = new Ailment(Affliction.EMPTY); + public static final Ailment EMPTY = new Ailment(EmptyAffliction.INSTANCE); public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Affliction.CODEC.fieldOf("effects").forGetter(Ailment::effects) ).apply(instance, Ailment::new)); - - public Ailment(PacketByteBuf buffer) { - this(Affliction.read(buffer)); - } - - public void toBuffer(PacketByteBuf buffer) { - Affliction.write(buffer, effects); - } + public static final PacketCodec PACKET_CODEC = Affliction.PACKET_CODEC.xmap(Ailment::new, Ailment::effects); } diff --git a/src/main/java/com/minelittlepony/unicopia/diet/DietProfile.java b/src/main/java/com/minelittlepony/unicopia/diet/DietProfile.java index b10a8143..74a9ea39 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/DietProfile.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/DietProfile.java @@ -16,11 +16,14 @@ import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.client.item.TooltipContext; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.FoodComponent; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.FoodComponent; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.item.tooltip.TooltipType; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; @@ -38,17 +41,17 @@ public record DietProfile( Codec.FLOAT.fieldOf("default_multiplier").forGetter(DietProfile::defaultMultiplier), Codec.FLOAT.fieldOf("foraging_multiplier").forGetter(DietProfile::foragingMultiplier), Codec.list(Multiplier.CODEC).fieldOf("multipliers").forGetter(DietProfile::multipliers), - Codec.list(FoodGroupEffects.CODEC).fieldOf("effects").forGetter(DietProfile::effects), - FoodGroupEffects.CODEC.optionalFieldOf("default_effect").forGetter(DietProfile::defaultEffect) + Codec.list(FoodGroupEffects.createCodec(FoodGroupKey.CODEC)).fieldOf("effects").forGetter(DietProfile::effects), + FoodGroupEffects.createCodec(FoodGroupKey.CODEC).optionalFieldOf("default_effect").forGetter(DietProfile::defaultEffect) ).apply(instance, DietProfile::new)); - - public DietProfile(PacketByteBuf buffer) { - this(buffer.readFloat(), buffer.readFloat(), - buffer.readList(Multiplier::new), - buffer.readList(b -> new FoodGroupEffects(b, FoodGroupKey.LOOKUP)), - buffer.readOptional(b -> new FoodGroupEffects(b, FoodGroupKey.LOOKUP)) - ); - } + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + PacketCodecs.FLOAT, DietProfile::defaultMultiplier, + PacketCodecs.FLOAT, DietProfile::foragingMultiplier, + Multiplier.PACKET_CODEC.collect(PacketCodecs.toList()), DietProfile::multipliers, + FoodGroupEffects.createPacketCodec(FoodGroupKey.PACKET_CODEC).collect(PacketCodecs.toList()), DietProfile::effects, + PacketCodecs.optional(FoodGroupEffects.createPacketCodec(FoodGroupKey.PACKET_CODEC)), DietProfile::defaultEffect, + DietProfile::new + ); public void validate(Consumer issues, Predicate foodGroupExists) { multipliers.stream().flatMap(i -> i.tags().stream()).forEach(key -> { @@ -68,14 +71,6 @@ public record DietProfile( }); } - public void toBuffer(PacketByteBuf buffer) { - buffer.writeFloat(defaultMultiplier); - buffer.writeFloat(foragingMultiplier); - buffer.writeCollection(multipliers, (b, t) -> t.toBuffer(b)); - buffer.writeCollection(effects, (b, t) -> t.toBuffer(b)); - buffer.writeOptional(defaultEffect, (b, t) -> t.toBuffer(b)); - } - public Optional findMultiplier(ItemStack stack) { return multipliers.stream().filter(m -> m.test(stack)).findFirst(); } @@ -90,7 +85,7 @@ public record DietProfile( @Nullable public FoodComponent getAdjustedFoodComponent(ItemStack stack) { - var food = stack.getItem().getFoodComponent(); + var food = stack.get(DataComponentTypes.FOOD); if (this == EMPTY) { return food; } @@ -100,13 +95,17 @@ public record DietProfile( return null; } - float hunger = food.getHunger() * ratios.getFirst(); + float hunger = food.nutrition() * ratios.getFirst(); int baseline = (int)hunger; - return FoodAttributes.copy(food) - .hunger(Math.max(1, (hunger - baseline) >= 0.5F ? baseline + 1 : baseline)) - .saturationModifier(food.getSaturationModifier() * ratios.getSecond()) - .build(); + return new FoodComponent( + Math.max(1, (hunger - baseline) >= 0.5F ? baseline + 1 : baseline), + food.saturation() * ratios.getSecond(), + food.canAlwaysEat(), + food.eatSeconds(), + food.usingConvertsTo(), + food.effects() + ); } public boolean isInedible(ItemStack stack) { @@ -126,8 +125,8 @@ public record DietProfile( return Pair.of(hungerMultiplier, saturationMultiplier); } - public void appendTooltip(ItemStack stack, @Nullable PlayerEntity user, List tooltip, TooltipContext context) { - var food = stack.getItem().getFoodComponent(); + public void appendTooltip(ItemStack stack, @Nullable PlayerEntity user, List tooltip, TooltipType context) { + var food = stack.get(DataComponentTypes.FOOD); var ratios = getRatios(stack); if (food == null || isInedible(ratios)) { @@ -142,8 +141,8 @@ public record DietProfile( if (context.isAdvanced()) { var nonAdjustedFood = getNonAdjustedFoodComponent(stack, user).orElse(food); tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.base_multiplier", baseMultiplier).formatted(Formatting.DARK_GRAY))); - tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.hunger.detailed", food.getHunger(), nonAdjustedFood.getHunger(), (int)(ratios.getFirst() * 100))).formatted(Formatting.DARK_GRAY)); - tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.saturation.detailed", food.getSaturationModifier(), nonAdjustedFood.getSaturationModifier(), (int)(ratios.getSecond() * 100))).formatted(Formatting.DARK_GRAY)); + tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.hunger.detailed", food.nutrition(), nonAdjustedFood.nutrition(), (int)(ratios.getFirst() * 100))).formatted(Formatting.DARK_GRAY)); + tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.saturation.detailed", food.saturation(), nonAdjustedFood.saturation(), (int)(ratios.getSecond() * 100))).formatted(Formatting.DARK_GRAY)); } else { tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.hunger", (int)(ratios.getFirst() * 100))).formatted(Formatting.DARK_GRAY)); tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.saturation", (int)(ratios.getSecond() * 100))).formatted(Formatting.DARK_GRAY)); @@ -178,22 +177,18 @@ public record DietProfile( Codec.FLOAT.fieldOf("hunger").forGetter(Multiplier::hunger), Codec.FLOAT.fieldOf("saturation").forGetter(Multiplier::saturation) ).apply(instance, Multiplier::new)); - - public Multiplier(PacketByteBuf buffer) { - this(buffer.readCollection(HashSet::new, p -> FoodGroupKey.LOOKUP.apply(p.readIdentifier())), buffer.readFloat(), buffer.readFloat()); - } + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + FoodGroupKey.PACKET_CODEC.collect(PacketCodecs.toCollection(HashSet::new)), Multiplier::tags, + PacketCodecs.FLOAT, Multiplier::hunger, + PacketCodecs.FLOAT, Multiplier::saturation, + Multiplier::new + ); @Override public boolean test(ItemStack stack) { return tags.stream().anyMatch(tag -> tag.contains(stack)); } - public void toBuffer(PacketByteBuf buffer) { - buffer.writeCollection(tags, (p, t) -> p.writeIdentifier(t.id())); - buffer.writeFloat(hunger); - buffer.writeFloat(saturation); - } - public static final class Builder { private Set tags = new HashSet<>(); private float hunger = 1; diff --git a/src/main/java/com/minelittlepony/unicopia/diet/DietView.java b/src/main/java/com/minelittlepony/unicopia/diet/DietView.java index 4d872462..b8dabf0a 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/DietView.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/DietView.java @@ -3,10 +3,10 @@ package com.minelittlepony.unicopia.diet; import java.util.List; import org.jetbrains.annotations.Nullable; -import net.minecraft.client.item.TooltipContext; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.text.Text; import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; @@ -17,7 +17,7 @@ public interface DietView { void finishUsing(ItemStack stack, World world, LivingEntity entity); - void appendTooltip(ItemStack stack, @Nullable PlayerEntity user, List tooltip, TooltipContext context); + void appendTooltip(ItemStack stack, @Nullable PlayerEntity user, List tooltip, TooltipType context); interface Holder { default DietView getDiets(ItemStack stack) { diff --git a/src/main/java/com/minelittlepony/unicopia/diet/DietsLoader.java b/src/main/java/com/minelittlepony/unicopia/diet/DietsLoader.java index f10755bb..aa78a64c 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/DietsLoader.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/DietsLoader.java @@ -33,11 +33,11 @@ public class DietsLoader implements IdentifiableResourceReloadListener { Profiler prepareProfiler, Profiler applyProfiler, Executor prepareExecutor, Executor applyExecutor) { - CompletableFuture> foodGroupsFuture = CompletableFuture.supplyAsync(() -> { - Map foodGroups = new HashMap<>(); + CompletableFuture> foodGroupsFuture = CompletableFuture.supplyAsync(() -> { + Map foodGroups = new HashMap<>(); for (var group : loadData(manager, prepareExecutor, "diet/food_groups").entrySet()) { try { - FoodGroup.CODEC.parse(JsonOps.INSTANCE, group.getValue()) + FoodGroup.EFFECTS_CODEC.parse(JsonOps.INSTANCE, group.getValue()) .resultOrPartial(error -> LOGGER.error("Could not load food group {}: {}", group.getKey(), error)) .ifPresent(value -> { foodGroups.put(group.getKey(), new FoodGroup(group.getKey(), value)); diff --git a/src/main/java/com/minelittlepony/unicopia/diet/Effect.java b/src/main/java/com/minelittlepony/unicopia/diet/Effect.java index af9ad3d9..c34f9470 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/Effect.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/Effect.java @@ -4,10 +4,10 @@ import java.util.List; import java.util.Optional; import java.util.function.Predicate; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.item.FoodComponent; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.FoodComponent; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.UseAction; @@ -21,16 +21,16 @@ public interface Effect extends Predicate { Ailment ailment(); - default void appendTooltip(ItemStack stack, List tooltip, TooltipContext context) { + default void appendTooltip(ItemStack stack, List tooltip, TooltipType context) { if (!test(stack)) { - if (stack.isFood()) { + if (stack.contains(DataComponentTypes.FOOD)) { tooltip.add(Text.literal(" ").append(Text.translatable("food_group.unicopia.misc")).formatted(Formatting.GRAY)); } else if (stack.getUseAction() == UseAction.DRINK) { tooltip.add(Text.literal(" ").append(Text.translatable("food_group.unicopia.drinks")).formatted(Formatting.GRAY)); } } - if (context.isAdvanced() && stack.isFood()) { + if (context.isAdvanced() && stack.contains(DataComponentTypes.FOOD)) { if (!ailment().effects().isEmpty()) { tooltip.add(Text.translatable("unicopia.diet.side_effects").formatted(Formatting.DARK_PURPLE)); ailment().effects().appendTooltip(tooltip); @@ -38,12 +38,6 @@ public interface Effect extends Predicate { } } - default void toBuffer(PacketByteBuf buffer) { - buffer.writeCollection(tags(), (b, t) -> b.writeIdentifier(t.id())); - buffer.writeOptional(foodComponent(), FoodAttributes::write); - ailment().toBuffer(buffer); - } - @Override default boolean test(ItemStack stack) { return tags().stream().anyMatch(tag -> tag.contains(stack)); diff --git a/src/main/java/com/minelittlepony/unicopia/diet/FoodAttributes.java b/src/main/java/com/minelittlepony/unicopia/diet/FoodAttributes.java index a5a9b9a5..665277eb 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/FoodAttributes.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/FoodAttributes.java @@ -7,6 +7,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.component.type.FoodComponent; import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketByteBuf; import net.minecraft.network.RegistryByteBuf; final class FoodAttributes { @@ -21,12 +22,12 @@ final class FoodAttributes { })); @Deprecated - static FoodComponent read(RegistryByteBuf buffer) { - return FoodComponent.PACKET_CODEC.decode(buffer); + static FoodComponent read(PacketByteBuf buffer) { + return FoodComponent.PACKET_CODEC.decode((RegistryByteBuf)buffer); } @Deprecated - static void write(RegistryByteBuf buffer, FoodComponent food) { - FoodComponent.PACKET_CODEC.encode(buffer, food); + static void write(PacketByteBuf buffer, FoodComponent food) { + FoodComponent.PACKET_CODEC.encode((RegistryByteBuf)buffer, food); } } diff --git a/src/main/java/com/minelittlepony/unicopia/diet/FoodGroup.java b/src/main/java/com/minelittlepony/unicopia/diet/FoodGroup.java index 173b1fef..56aa5245 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/FoodGroup.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/FoodGroup.java @@ -4,12 +4,11 @@ import java.util.List; import java.util.Optional; import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; - -import net.minecraft.client.item.TooltipContext; -import net.minecraft.item.FoodComponent; +import net.minecraft.component.type.FoodComponent; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.item.tooltip.TooltipType; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; @@ -18,15 +17,12 @@ import net.minecraft.util.Util; public record FoodGroup( Identifier id, FoodGroupEffects attributes) implements Effect { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - FoodGroupKey.TAG_CODEC.listOf().fieldOf("tags").forGetter(FoodGroupEffects::tags), - FoodAttributes.CODEC.optionalFieldOf("food_component").forGetter(FoodGroupEffects::foodComponent), - Ailment.CODEC.fieldOf("ailment").forGetter(FoodGroupEffects::ailment) - ).apply(instance, FoodGroupEffects::new)); - - public FoodGroup(PacketByteBuf buffer) { - this(buffer.readIdentifier(), new FoodGroupEffects(buffer, FoodGroupKey.TAG_ID_LOOKUP)); - } + public static final Codec EFFECTS_CODEC = FoodGroupEffects.createCodec(FoodGroupKey.TAG_CODEC); + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + Identifier.PACKET_CODEC, FoodGroup::id, + FoodGroupEffects.createPacketCodec(FoodGroupKey.TAG_PACKET_CODEC), FoodGroup::attributes, + FoodGroup::new + ); @Override public List tags() { @@ -43,14 +39,8 @@ public record FoodGroup( return attributes.ailment(); } @Override - public void appendTooltip(ItemStack stack, List tooltip, TooltipContext context) { + public void appendTooltip(ItemStack stack, List tooltip, TooltipType context) { tooltip.add(Text.literal(" ").append(Text.translatable(Util.createTranslationKey("food_group", id()))).formatted(Formatting.GRAY)); Effect.super.appendTooltip(stack, tooltip, context); } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeIdentifier(id()); - Effect.super.toBuffer(buffer); - } } diff --git a/src/main/java/com/minelittlepony/unicopia/diet/FoodGroupEffects.java b/src/main/java/com/minelittlepony/unicopia/diet/FoodGroupEffects.java index ae363418..50e178de 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/FoodGroupEffects.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/FoodGroupEffects.java @@ -3,17 +3,19 @@ package com.minelittlepony.unicopia.diet; import java.util.ArrayList; import java.util.List; import java.util.Optional; -import java.util.function.Function; - import com.minelittlepony.unicopia.diet.affliction.Affliction; import com.minelittlepony.unicopia.item.UFoodComponents; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import io.netty.buffer.ByteBuf; import net.minecraft.component.type.FoodComponent; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.item.tooltip.TooltipType; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.tag.TagKey; import net.minecraft.text.Text; @@ -26,18 +28,24 @@ public record FoodGroupEffects( Optional foodComponent, Ailment ailment ) implements Effect { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - FoodGroupKey.CODEC.listOf().fieldOf("tags").forGetter(FoodGroupEffects::tags), - FoodAttributes.CODEC.optionalFieldOf("food_component").forGetter(FoodGroupEffects::foodComponent), - Ailment.CODEC.fieldOf("ailment").forGetter(FoodGroupEffects::ailment) - ).apply(instance, FoodGroupEffects::new)); - - public FoodGroupEffects(PacketByteBuf buffer, Function lookup) { - this(buffer.readList(b -> lookup.apply(b.readIdentifier())), buffer.readOptional(FoodAttributes::read), new Ailment(buffer)); + public static Codec createCodec(Codec keyCodec) { + return RecordCodecBuilder.create(instance -> instance.group( + keyCodec.listOf().fieldOf("tags").forGetter(FoodGroupEffects::tags), + FoodAttributes.CODEC.optionalFieldOf("food_component").forGetter(FoodGroupEffects::foodComponent), + Ailment.CODEC.fieldOf("ailment").forGetter(FoodGroupEffects::ailment) + ).apply(instance, FoodGroupEffects::new)); + } + public static final PacketCodec createPacketCodec(PacketCodec keyCodec) { + return PacketCodec.tuple( + keyCodec.collect(PacketCodecs.toList()), FoodGroupEffects::tags, + PacketCodecs.optional(FoodComponent.PACKET_CODEC), FoodGroupEffects::foodComponent, + Ailment.PACKET_CODEC, FoodGroupEffects::ailment, + FoodGroupEffects::new + ); } @Override - public void appendTooltip(ItemStack stack, List tooltip, TooltipContext context) { + public void appendTooltip(ItemStack stack, List tooltip, TooltipType context) { tags.forEach(tag -> { if (tag.contains(stack)) { tooltip.add(Text.literal(" ").append(Text.translatable(Util.createTranslationKey("tag", tag.id()))).formatted(Formatting.GRAY)); @@ -49,7 +57,7 @@ public record FoodGroupEffects( public static final class Builder { private final List tags = new ArrayList<>(); private Optional foodComponent = Optional.empty(); - private Ailment ailment = new Ailment(Affliction.EMPTY); + private Ailment ailment = Ailment.EMPTY; public Builder tag(Identifier tag) { return tag(TagKey.of(RegistryKeys.ITEM, tag)); diff --git a/src/main/java/com/minelittlepony/unicopia/diet/FoodGroupKey.java b/src/main/java/com/minelittlepony/unicopia/diet/FoodGroupKey.java index 567c4a36..cd9fc676 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/FoodGroupKey.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/FoodGroupKey.java @@ -6,8 +6,10 @@ import com.minelittlepony.unicopia.Debug; import com.minelittlepony.unicopia.Unicopia; import com.mojang.serialization.Codec; +import io.netty.buffer.ByteBuf; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.registry.Registries; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.tag.TagKey; @@ -71,9 +73,13 @@ public interface FoodGroupKey { }; }); Function TAG_ID_LOOKUP = id -> TAG_LOOKUP.apply(TagKey.of(RegistryKeys.ITEM, id)); + Codec CODEC = Identifier.CODEC.xmap(LOOKUP, FoodGroupKey::id); Codec TAG_CODEC = TagKey.unprefixedCodec(RegistryKeys.ITEM).xmap(TAG_LOOKUP, k -> TagKey.of(RegistryKeys.ITEM, k.id())); + PacketCodec PACKET_CODEC = Identifier.PACKET_CODEC.xmap(LOOKUP, FoodGroupKey::id); + PacketCodec TAG_PACKET_CODEC = Identifier.PACKET_CODEC.xmap(id -> TAG_LOOKUP.apply(TagKey.of(RegistryKeys.ITEM, id)), FoodGroupKey::id); + Identifier id(); boolean contains(ItemStack stack); diff --git a/src/main/java/com/minelittlepony/unicopia/diet/PonyDiets.java b/src/main/java/com/minelittlepony/unicopia/diet/PonyDiets.java index 54990fee..4fcd491c 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/PonyDiets.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/PonyDiets.java @@ -1,23 +1,25 @@ package com.minelittlepony.unicopia.diet; -import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Collectors; - import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.entity.effect.FoodPoisoningStatusEffect; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.item.ItemDuck; -import net.minecraft.client.item.TooltipContext; +import com.minelittlepony.unicopia.util.serialization.PacketCodecUtils; + +import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.item.tooltip.TooltipType; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Hand; @@ -27,11 +29,28 @@ import net.minecraft.world.World; public class PonyDiets implements DietView { private final Map diets; - private final Map effects; + private final Map effects; private static PonyDiets INSTANCE = new PonyDiets(Map.of(), Map.of()); + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + PacketCodecs.map(HashMap::new, PacketCodecs.registryValue(Race.REGISTRY_KEY), DietProfile.PACKET_CODEC), diets -> diets.diets, + FoodGroup.PACKET_CODEC.collect(PacketCodecUtils.toMap(FoodGroup::id)), diets -> diets.effects, + PonyDiets::new + ); + + /*public static final PacketCodec PACKET_CODEC = PacketCodec.ofStatic((buffer, diets) -> { + buffer.writeMap(diets.diets, (b, r) -> b.writeRegistryKey(Race.REGISTRY.getKey(r).get()), (b, e) -> e.toBuffer(b)); + buffer.writeCollection(diets.effects.values(), (b, e) -> e.toBuffer(b)); + }, buffer -> { + return new PonyDiets( + buffer.readMap(b -> Race.REGISTRY.get(b.readRegistryKey(Race.REGISTRY_KEY)), DietProfile::new), + FoodGroup.PACKET_CODEC.collect(PacketCodecUtils.toMap(FoodGroup::id)).decode(buffer) + ); + });*/ + public static PonyDiets getInstance() { + return INSTANCE; } @@ -44,29 +63,17 @@ public class PonyDiets implements DietView { INSTANCE = diets; } - PonyDiets(Map diets, Map effects) { + PonyDiets(Map diets, Map effects) { this.diets = diets; this.effects = effects; } - public PonyDiets(PacketByteBuf buffer) { - this( - buffer.readMap(b -> b.readRegistryValue(Race.REGISTRY), DietProfile::new), - buffer.readCollection(ArrayList::new, FoodGroup::new).stream().collect(Collectors.toMap(FoodGroup::id, Function.identity())) - ); - } - - public void toBuffer(PacketByteBuf buffer) { - buffer.writeMap(diets, (b, r) -> b.writeRegistryValue(Race.REGISTRY, r), (b, e) -> e.toBuffer(b)); - buffer.writeCollection(effects.values(), (b, e) -> e.toBuffer(b)); - } - private DietProfile getDiet(Pony pony) { return Optional.ofNullable(diets.get(pony.getObservedSpecies())).orElse(DietProfile.EMPTY); } Effect getEffects(ItemStack stack) { - return effects.values().stream().filter(effect -> effect.test(stack)).findFirst().orElse(Effect.EMPTY); + return effects.values().stream().filter(effect -> effect.test(stack)).findFirst().map(Effect.class::cast).orElse(Effect.EMPTY); } private Effect getEffects(ItemStack stack, Pony pony) { @@ -88,10 +95,10 @@ public class PonyDiets implements DietView { } @Override - public void appendTooltip(ItemStack stack, @Nullable PlayerEntity user, List tooltip, TooltipContext context) { + public void appendTooltip(ItemStack stack, @Nullable PlayerEntity user, List tooltip, TooltipType context) { if (initEdibility(stack, user)) { - if (!((ItemDuck)stack.getItem()).getOriginalFoodComponent().isEmpty() || stack.getItem().getFoodComponent() != null) { + if (!((ItemDuck)stack.getItem()).getOriginalFoodComponent().isEmpty() || stack.contains(DataComponentTypes.FOOD)) { Pony pony = Pony.of(user); tooltip.add(Text.translatable("unicopia.diet.information").formatted(Formatting.DARK_PURPLE)); @@ -107,14 +114,14 @@ public class PonyDiets implements DietView { return Pony.of(user).filter(pony -> { DietProfile diet = getDiet(pony); - if (!stack.isFood() && pony.getObservedSpecies().hasIronGut()) { + if (!stack.contains(DataComponentTypes.FOOD) && pony.getObservedSpecies().hasIronGut()) { diet.findEffect(stack) .flatMap(Effect::foodComponent) .or(() -> getEffects(stack).foodComponent()) .ifPresent(item::setFoodComponent); } - if (stack.isFood()) { + if (stack.contains(DataComponentTypes.FOOD)) { item.setFoodComponent(diet.getAdjustedFoodComponent(stack)); } diff --git a/src/main/java/com/minelittlepony/unicopia/diet/affliction/Affliction.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/Affliction.java index ff228b31..9c2614eb 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/affliction/Affliction.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/Affliction.java @@ -7,38 +7,28 @@ import com.mojang.serialization.Codec; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import net.minecraft.util.dynamic.Codecs; public interface Affliction { - Affliction EMPTY = new Affliction() { - @Override - public void afflict(PlayerEntity player, ItemStack stack) { } - - @Override - public AfflictionType getType() { - return AfflictionType.EMPTY; - } - - @Override - public void toBuffer(PacketByteBuf buffer) { } - }; - Codec CODEC = Codecs.xor(AfflictionType.CODEC, Codec.list(AfflictionType.CODEC).xmap( + Codec SINGLE_CODEC = AfflictionType.CODEC.dispatch("type", affliction -> affliction.getType(), type -> type.codec()); + Codec CODEC = Codec.xor(SINGLE_CODEC, Codec.list(SINGLE_CODEC).xmap( afflictions -> { afflictions = afflictions.stream().filter(f -> !f.isEmpty()).toList(); return switch (afflictions.size()) { - case 0 -> EMPTY; + case 0 -> EmptyAffliction.INSTANCE; case 1 -> afflictions.get(0); default -> new CompoundAffliction(afflictions); }; }, - affliction -> ((CompoundAffliction)affliction).afflictions + affliction -> ((CompoundAffliction)affliction).afflictions() )).xmap( either -> either.left().or(either::right).get(), affliction -> affliction instanceof CompoundAffliction ? Either.right(affliction) : Either.left(affliction) ); + PacketCodec PACKET_CODEC = AfflictionType.PACKET_CODEC.dispatch(Affliction::getType, AfflictionType::packetCodec); void afflict(PlayerEntity player, ItemStack stack); @@ -55,15 +45,4 @@ public interface Affliction { } AfflictionType getType(); - - void toBuffer(PacketByteBuf buffer); - - static void write(PacketByteBuf buffer, Affliction affliction) { - buffer.writeIdentifier(affliction.getType().id()); - affliction.toBuffer(buffer); - } - - static Affliction read(PacketByteBuf buffer) { - return AfflictionType.REGISTRY.get(buffer.readIdentifier()).reader().apply(buffer); - } } diff --git a/src/main/java/com/minelittlepony/unicopia/diet/affliction/AfflictionType.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/AfflictionType.java index 6d9f405f..7fcfd455 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/affliction/AfflictionType.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/AfflictionType.java @@ -3,45 +3,30 @@ package com.minelittlepony.unicopia.diet.affliction; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.util.RegistryUtils; import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.JsonOps; +import com.mojang.serialization.MapCodec; -import net.minecraft.network.PacketByteBuf.PacketReader; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.registry.Registry; import net.minecraft.util.Identifier; -import net.minecraft.util.JsonHelper; import net.minecraft.util.Util; -import net.minecraft.util.dynamic.Codecs; -public record AfflictionType(Codec codec, Identifier id, PacketReader reader) { +public record AfflictionType(Identifier id, MapCodec codec, PacketCodec packetCodec) { public static final String DEFAULT_ID = "unicopia:apply_status_effect"; public static final Registry> REGISTRY = RegistryUtils.createDefaulted(Unicopia.id("affliction_type"), DEFAULT_ID); - @SuppressWarnings("unchecked") - public static final Codec CODEC = Codecs.JSON_ELEMENT.flatXmap(json -> { - if (!json.isJsonObject()) { - return DataResult.error(() -> "Not a JSON object"); - } - return Identifier.validate(JsonHelper.getString(JsonHelper.asObject(json, "affliction"), "type", AfflictionType.DEFAULT_ID)) - .flatMap(type -> AfflictionType.REGISTRY.get(type).codec().parse(JsonOps.INSTANCE, json)); - }, thing -> { - AfflictionType type = thing.getType(); - return ((Codec)type.codec()).encodeStart(JsonOps.INSTANCE, thing).map(json -> { - if (json.isJsonObject()) { - json.getAsJsonObject().addProperty("type", type.id().toString()); - } - return json; - }); - }); + public static final Codec> CODEC = REGISTRY.getCodec(); + public static final PacketCodec> PACKET_CODEC = PacketCodecs.registryValue(REGISTRY.getKey()); - public static final AfflictionType EMPTY = register("empty", Codec.unit(Affliction.EMPTY), buffer -> Affliction.EMPTY); - public static final AfflictionType MANY = register("many", CompoundAffliction.CODEC, CompoundAffliction::new); - public static final AfflictionType APPLY_STATUS_EFFECT = register("apply_status_effect", StatusEffectAffliction.CODEC, StatusEffectAffliction::new); - public static final AfflictionType LOSE_HUNGER = register("lose_hunger", LoseHungerAffliction.CODEC, LoseHungerAffliction::new); - public static final AfflictionType HEALING = register("healing", HealingAffliction.CODEC, HealingAffliction::new); - public static final AfflictionType CURE_LOVE_SICKNESS = register("cure_love_sickness", ClearLoveSicknessAffliction.CODEC, buffer -> ClearLoveSicknessAffliction.INSTANCE); + public static final AfflictionType EMPTY = register("empty", EmptyAffliction.CODEC, EmptyAffliction.PACKET_CODEC); + public static final AfflictionType MANY = register("many", CompoundAffliction.CODEC, CompoundAffliction.PACKET_CODEC); + public static final AfflictionType APPLY_STATUS_EFFECT = register("apply_status_effect", StatusEffectAffliction.CODEC, StatusEffectAffliction.PACKET_CODEC); + public static final AfflictionType LOSE_HUNGER = register("lose_hunger", LoseHungerAffliction.CODEC, LoseHungerAffliction.PACKET_CODEC); + public static final AfflictionType HEALING = register("healing", HealingAffliction.CODEC, HealingAffliction.PACKET_CODEC); + public static final AfflictionType CURE_LOVE_SICKNESS = register("cure_love_sickness", ClearLoveSicknessAffliction.CODEC, ClearLoveSicknessAffliction.PACKET_CODEC); - static AfflictionType register(String name, Codec codec, PacketReader reader) { - return Registry.register(REGISTRY, Unicopia.id(name), new AfflictionType<>(codec, Unicopia.id(name), reader)); + static AfflictionType register(String name, MapCodec codec, PacketCodec packetCodec) { + return Registry.register(REGISTRY, Unicopia.id(name), new AfflictionType<>(Unicopia.id(name), codec, packetCodec)); } public String getTranslationKey() { diff --git a/src/main/java/com/minelittlepony/unicopia/diet/affliction/ClearLoveSicknessAffliction.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/ClearLoveSicknessAffliction.java index 4a2105f1..73df2aab 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/affliction/ClearLoveSicknessAffliction.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/ClearLoveSicknessAffliction.java @@ -1,15 +1,22 @@ package com.minelittlepony.unicopia.diet.affliction; +import org.jetbrains.annotations.Nullable; + import com.minelittlepony.unicopia.entity.effect.UEffects; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; + +import io.netty.buffer.ByteBuf; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.FoodComponent; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; public final class ClearLoveSicknessAffliction implements Affliction { public static final ClearLoveSicknessAffliction INSTANCE = new ClearLoveSicknessAffliction(); - public static final Codec CODEC = Codec.unit(INSTANCE); + public static final MapCodec CODEC = MapCodec.unit(INSTANCE); + public static final PacketCodec PACKET_CODEC = PacketCodec.unit(INSTANCE); @Override public AfflictionType getType() { @@ -18,7 +25,9 @@ public final class ClearLoveSicknessAffliction implements Affliction { @Override public void afflict(PlayerEntity player, ItemStack stack) { - player.heal(stack.isFood() ? stack.getItem().getFoodComponent().getHunger() : 1); + @Nullable + FoodComponent food = stack.get(DataComponentTypes.FOOD); + player.heal(food == null ? 1 : food.nutrition()); if (player.getWorld().isClient) { return; } @@ -26,8 +35,4 @@ public final class ClearLoveSicknessAffliction implements Affliction { player.removeStatusEffect(UEffects.FOOD_POISONING); player.removeStatusEffect(StatusEffects.WEAKNESS); } - - @Override - public void toBuffer(PacketByteBuf buffer) { - } } diff --git a/src/main/java/com/minelittlepony/unicopia/diet/affliction/CompoundAffliction.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/CompoundAffliction.java index 9861f7e7..b3f0bfa0 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/affliction/CompoundAffliction.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/CompoundAffliction.java @@ -2,31 +2,25 @@ package com.minelittlepony.unicopia.diet.affliction; import java.util.List; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.text.Text; -public class CompoundAffliction implements Affliction { - public final List afflictions; - - public CompoundAffliction(List afflictions) { - this.afflictions = afflictions; - } +public record CompoundAffliction (List afflictions) implements Affliction { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Affliction.CODEC.listOf().fieldOf("afflictions").forGetter(CompoundAffliction::afflictions) + ).apply(instance, CompoundAffliction::new)); + public static final PacketCodec PACKET_CODEC = null; public static CompoundAffliction of(Affliction...afflictions) { return new CompoundAffliction(List.of(afflictions)); } - public CompoundAffliction(PacketByteBuf buffer) { - this(buffer.readList(Affliction::read)); - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeCollection(afflictions, Affliction::write); - } - @Override public AfflictionType getType() { return AfflictionType.MANY; @@ -49,7 +43,6 @@ public class CompoundAffliction implements Affliction { }); } - @Override public void afflict(PlayerEntity player, ItemStack stack) { afflictions.forEach(i -> i.afflict(player, stack)); diff --git a/src/main/java/com/minelittlepony/unicopia/diet/affliction/EmptyAffliction.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/EmptyAffliction.java new file mode 100644 index 00000000..720a684f --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/EmptyAffliction.java @@ -0,0 +1,23 @@ +package com.minelittlepony.unicopia.diet.affliction; + +import com.mojang.serialization.MapCodec; + +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.network.codec.PacketCodec; + +public record EmptyAffliction() implements Affliction { + public static final EmptyAffliction INSTANCE = new EmptyAffliction(); + public static final MapCodec CODEC = MapCodec.unit(INSTANCE); + public static final PacketCodec PACKET_CODEC = PacketCodec.unit(INSTANCE); + + @Override + public void afflict(PlayerEntity player, ItemStack stack) { + } + + @Override + public AfflictionType getType() { + return AfflictionType.EMPTY; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/diet/affliction/HealingAffliction.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/HealingAffliction.java index 8e6bc53d..71b2acf2 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/affliction/HealingAffliction.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/HealingAffliction.java @@ -1,26 +1,21 @@ package com.minelittlepony.unicopia.diet.affliction; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.text.Text; public record HealingAffliction(float health) implements Affliction { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( Codec.FLOAT.fieldOf("health").forGetter(HealingAffliction::health) ).apply(instance, HealingAffliction::new)); - - public HealingAffliction(PacketByteBuf buffer) { - this(buffer.readFloat()); - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeFloat(health); - } + public static final PacketCodec PACKET_CODEC = PacketCodecs.FLOAT.xmap(HealingAffliction::new, HealingAffliction::health); @Override public AfflictionType getType() { diff --git a/src/main/java/com/minelittlepony/unicopia/diet/affliction/LoseHungerAffliction.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/LoseHungerAffliction.java index fe9ff84f..1922f2bd 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/affliction/LoseHungerAffliction.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/LoseHungerAffliction.java @@ -1,26 +1,21 @@ package com.minelittlepony.unicopia.diet.affliction; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.text.Text; public record LoseHungerAffliction(float multiplier) implements Affliction { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( Codec.FLOAT.fieldOf("multiplier").forGetter(LoseHungerAffliction::multiplier) ).apply(instance, LoseHungerAffliction::new)); - - public LoseHungerAffliction(PacketByteBuf buffer) { - this(buffer.readFloat()); - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeFloat(multiplier); - } + public static final PacketCodec PACKET_CODEC = PacketCodecs.FLOAT.xmap(LoseHungerAffliction::new, LoseHungerAffliction::multiplier); @Override public AfflictionType getType() { diff --git a/src/main/java/com/minelittlepony/unicopia/diet/affliction/Range.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/Range.java index 78c3abe1..da3db591 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/affliction/Range.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/Range.java @@ -1,38 +1,38 @@ package com.minelittlepony.unicopia.diet.affliction; +import com.google.common.collect.Interner; +import com.google.common.collect.Interners; import com.mojang.datafixers.util.Either; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.network.PacketByteBuf; -import net.minecraft.util.dynamic.Codecs; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; public record Range(int min, int max) { - public static final Codec CODEC = Codecs.xor( + private static final Interner INTERNER = Interners.newWeakInterner(); + public static final Codec CODEC = Codec.xor( Codec.INT.xmap(value -> Range.of(value, -1), range -> range.min()), RecordCodecBuilder.create(instance -> instance.group( Codec.INT.fieldOf("min").forGetter(Range::min), Codec.INT.fieldOf("max").forGetter(Range::max) ).apply(instance, Range::of)) ).xmap(either -> either.left().or(either::right).get(), l -> Either.right(l)); + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + PacketCodecs.INTEGER, Range::min, + PacketCodecs.INTEGER, Range::max, + Range::of + ); public static Range of(int min, int max) { - return new Range(min, max); + return INTERNER.intern(new Range(min, max)); } public static Range of(int exact) { return of(exact, exact); } - public static Range of(PacketByteBuf buffer) { - return of(buffer.readInt(), buffer.readInt()); - } - - public void toBuffer(PacketByteBuf buffer) { - buffer.writeInt(min); - buffer.writeInt(max); - } - public int getClamped(int currentTicks, int multiplier) { return clamp((min * multiplier) + currentTicks, multiplier); } diff --git a/src/main/java/com/minelittlepony/unicopia/diet/affliction/StatusEffectAffliction.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/StatusEffectAffliction.java index 018f2d2a..cd8585b9 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/affliction/StatusEffectAffliction.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/StatusEffectAffliction.java @@ -1,40 +1,39 @@ package com.minelittlepony.unicopia.diet.affliction; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.StringHelper; import net.minecraft.util.math.MathHelper; -public record StatusEffectAffliction(StatusEffect effect, Range seconds, Range amplifier, int chance) implements Affliction { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - Registries.STATUS_EFFECT.getCodec().fieldOf("effect").forGetter(StatusEffectAffliction::effect), +public record StatusEffectAffliction(RegistryEntry effect, Range seconds, Range amplifier, int chance) implements Affliction { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Registries.STATUS_EFFECT.getEntryCodec().fieldOf("effect").forGetter(StatusEffectAffliction::effect), Range.CODEC.fieldOf("seconds").forGetter(StatusEffectAffliction::seconds), Range.CODEC.optionalFieldOf("amplifier", Range.of(0, -1)).forGetter(StatusEffectAffliction::amplifier), Codec.INT.optionalFieldOf("chance", 0).forGetter(StatusEffectAffliction::chance) ).apply(instance, StatusEffectAffliction::new)); - - public StatusEffectAffliction(PacketByteBuf buffer) { - this(Registries.STATUS_EFFECT.get(buffer.readIdentifier()), Range.of(buffer), Range.of(buffer), buffer.readInt()); - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeIdentifier(Registries.STATUS_EFFECT.getId(effect)); - seconds.toBuffer(buffer); - amplifier.toBuffer(buffer); - buffer.writeInt(chance); - } + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + PacketCodecs.registryEntry(RegistryKeys.STATUS_EFFECT), StatusEffectAffliction::effect, + Range.PACKET_CODEC, StatusEffectAffliction::seconds, + Range.PACKET_CODEC, StatusEffectAffliction::amplifier, + PacketCodecs.INTEGER, StatusEffectAffliction::chance, + StatusEffectAffliction::new + ); @Override public AfflictionType getType() { @@ -43,27 +42,26 @@ public record StatusEffectAffliction(StatusEffect effect, Range seconds, Range a @Override public void afflict(PlayerEntity player, ItemStack stack) { - if (player.getWorld().isClient) { - return; - } - if (chance > 0 && player.getWorld().random.nextInt(chance) > 0) { + if (player.getWorld().isClient || (chance > 0 && player.getWorld().random.nextInt(chance) > 0)) { return; } + float health = player.getHealth(); + float oldMaxHealth = player.getMaxHealth(); StatusEffectInstance current = player.getStatusEffect(effect); player.addStatusEffect(new StatusEffectInstance(effect, seconds.getClamped(current == null ? 0 : current.getDuration(), 20), amplifier.getClamped(current == null ? 0 : current.getAmplifier(), 1) )); // keep original health - if (effect.getAttributeModifiers().containsKey(EntityAttributes.GENERIC_MAX_HEALTH)) { + if (player.getMaxHealth() != oldMaxHealth) { player.setHealth(MathHelper.clamp(health, 0, player.getMaxHealth())); } } @Override public Text getName() { - MutableText text = effect.getName().copy(); + MutableText text = effect.value().getName().copy(); if (amplifier.min() > 0) { text = Text.translatable("potion.withAmplifier", text, Text.translatable("potion.potency." + (amplifier.min()))); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/AttributeContainer.java b/src/main/java/com/minelittlepony/unicopia/entity/AttributeContainer.java index 11000da1..d916ce27 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/AttributeContainer.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/AttributeContainer.java @@ -1,21 +1,21 @@ package com.minelittlepony.unicopia.entity; import java.util.Map; -import java.util.UUID; - import org.jetbrains.annotations.Nullable; import it.unimi.dsi.fastutil.floats.Float2ObjectFunction; import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.attribute.EntityAttributeInstance; import net.minecraft.entity.attribute.EntityAttributeModifier; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; public interface AttributeContainer { @Nullable - EntityAttributeInstance getAttributeInstance(EntityAttribute attribute); + EntityAttributeInstance getAttributeInstance(RegistryEntry attribute); - default void updateAttributeModifier(UUID id, EntityAttribute attribute, float desiredValue, Float2ObjectFunction modifierSupplier, boolean permanent) { + default void updateAttributeModifier(Identifier id, RegistryEntry attribute, float desiredValue, Float2ObjectFunction modifierSupplier, boolean permanent) { @Nullable EntityAttributeInstance instance = getAttributeInstance(attribute); if (instance == null) { @@ -25,7 +25,7 @@ public interface AttributeContainer { @Nullable EntityAttributeModifier modifier = instance.getModifier(id); - if (!MathHelper.approximatelyEquals(desiredValue, modifier == null ? 0 : modifier.getValue())) { + if (!MathHelper.approximatelyEquals(desiredValue, modifier == null ? 0 : modifier.value())) { instance.removeModifier(id); if (desiredValue != 0) { @@ -38,13 +38,13 @@ public interface AttributeContainer { } } - default void applyAttributeModifiers(Map modifiers, boolean permanent, boolean apply) { + default void applyAttributeModifiers(Map, EntityAttributeModifier> modifiers, boolean permanent, boolean apply) { modifiers.forEach((attribute, modifier) -> { applyAttributeModifier(attribute, modifier, permanent, apply); }); } - default void applyAttributeModifier(EntityAttribute attribute, EntityAttributeModifier modifier, boolean permanent, boolean apply) { + default void applyAttributeModifier(RegistryEntry attribute, EntityAttributeModifier modifier, boolean permanent, boolean apply) { @Nullable EntityAttributeInstance instance = getAttributeInstance(attribute); if (instance == null) { @@ -52,7 +52,7 @@ public interface AttributeContainer { } @Nullable - boolean present = instance.hasModifier(modifier); + boolean present = instance.hasModifier(modifier.id()); if (present != apply) { if (apply) { @@ -62,7 +62,7 @@ public interface AttributeContainer { instance.addTemporaryModifier(modifier); } } else { - instance.removeModifier(modifier.getId()); + instance.removeModifier(modifier.id()); } } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/Creature.java b/src/main/java/com/minelittlepony/unicopia/entity/Creature.java index 4be62edd..fdecfb05 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/Creature.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/Creature.java @@ -34,6 +34,7 @@ import net.minecraft.entity.passive.*; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; import net.minecraft.util.math.MathHelper; public class Creature extends Living implements WeaklyOwned.Mutable { @@ -299,23 +300,23 @@ public class Creature extends Living implements WeaklyOwned.Mutabl } @Override - public void toNBT(NbtCompound compound) { - super.toNBT(compound); - compound.put("master", getMasterReference().toNBT()); - physics.toNBT(compound); + public void toNBT(NbtCompound compound, WrapperLookup lookup) { + super.toNBT(compound, lookup); + compound.put("master", getMasterReference().toNBT(lookup)); + physics.toNBT(compound, lookup); compound.putBoolean("discorded", isDiscorded()); } @Override - public void fromNBT(NbtCompound compound) { - super.fromNBT(compound); + public void fromNBT(NbtCompound compound, WrapperLookup lookup) { + super.fromNBT(compound, lookup); if (compound.contains("master", NbtElement.COMPOUND_TYPE)) { - owner.fromNBT(compound.getCompound("master")); - if (owner.isSet()) { + getMasterReference().fromNBT(compound.getCompound("master"), lookup); + if (getMasterReference().isSet()) { targets.ifPresent(this::initMinionAi); } } - physics.fromNBT(compound); + physics.fromNBT(compound, lookup); setDiscorded(compound.getBoolean("discorded")); } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/Enchantments.java b/src/main/java/com/minelittlepony/unicopia/entity/Enchantments.java index 000d8b61..30162766 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/Enchantments.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/Enchantments.java @@ -17,36 +17,41 @@ import com.minelittlepony.unicopia.util.Tickable; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtList; import net.minecraft.nbt.NbtString; import net.minecraft.util.Identifier; import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; +import net.minecraft.registry.entry.RegistryEntry; public class Enchantments implements NbtSerialisable, Tickable { private final Living entity; - private final Set equippedEnchantments = new HashSet<>(); + private final Set> equippedEnchantments = new HashSet<>(); - private final Map data = new HashMap<>(); + private final Map, SimpleEnchantment.Data> data = new HashMap<>(); Enchantments(Living entity) { this.entity = entity; } @SuppressWarnings("unchecked") - public Optional getOrEmpty(Enchantment enchantment) { + public Optional getOrEmpty(RegistryEntry enchantment) { return Optional.ofNullable((T)data.get(enchantment)); } @SuppressWarnings("unchecked") - public T computeIfAbsent(Enchantment enchantment, Supplier factory) { + public T computeIfAbsent(RegistryEntry enchantment, Supplier factory) { return (T)data.computeIfAbsent(enchantment, e -> factory.get()); } @Nullable @SuppressWarnings("unchecked") - public T remove(Enchantment enchantment) { + public T remove(RegistryEntry enchantment) { return (T)data.remove(enchantment); } @@ -60,37 +65,38 @@ public class Enchantments implements NbtSerialisable, Tickable { if (active != equippedEnchantments.contains(ench)) { if (active) { equippedEnchantments.add(ench); - ench.onEquipped(entity); + ench.value().onEquipped(entity); } else { equippedEnchantments.remove(ench); - ench.onUnequipped(entity); + ench.value().onUnequipped(entity); } } if (active) { - ench.onUserTick(entity, level); + ench.value().onUserTick(entity, level); } }); } @Override - public void toNBT(NbtCompound compound) { + public void toNBT(NbtCompound compound, WrapperLookup lookup) { NbtList list = new NbtList(); equippedEnchantments.forEach(enchant -> { - Identifier id = Registries.ENCHANTMENT.getId(enchant); - if (id != null) { - list.add(NbtString.of(id.toString())); - } + enchant.getKey().ifPresent(key -> { + list.add(NbtString.of(key.getValue().toString())); + }); }); compound.put("enchants", list); } @Override - public void fromNBT(NbtCompound compound) { + public void fromNBT(NbtCompound compound, WrapperLookup lookup) { equippedEnchantments.clear(); if (compound.contains("enchants")) { - compound.getList("enchants", 8).forEach(tag -> { - Registries.ENCHANTMENT.getOrEmpty(new Identifier(tag.asString())).ifPresent(equippedEnchantments::add); + compound.getList("enchants", NbtElement.STRING_TYPE).forEach(tag -> { + lookup.getWrapperOrThrow(RegistryKeys.ENCHANTMENT) + .getOptional(RegistryKey.of(RegistryKeys.ENCHANTMENT, Identifier.of(tag.asString()))) + .ifPresent(equippedEnchantments::add); }); } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntityPhysics.java b/src/main/java/com/minelittlepony/unicopia/entity/EntityPhysics.java index bd51d7ba..70dd4157 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntityPhysics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/EntityPhysics.java @@ -14,6 +14,7 @@ import net.minecraft.entity.EntityPose; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.mob.MobEntity; import net.minecraft.nbt.NbtCompound; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; import net.minecraft.registry.tag.BlockTags; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -130,12 +131,12 @@ public class EntityPhysics implements Physics, Copyable { } @Override - public void toNBT(NbtCompound compound) { + public void toNBT(NbtCompound compound, WrapperLookup lookup) { compound.putString("owner_race", getSpecies().getId().toString()); physics.toNBT(compound); } @Override - public void fromNBT(NbtCompound compound) { + public void fromNBT(NbtCompound compound, WrapperLookup lookup) { if (compound.contains("owner_race", NbtElement.STRING_TYPE)) { setSpecies(Race.fromName(compound.getString("owner_race"), Race.HUMAN)); } @@ -209,7 +210,8 @@ public class ItemImpl implements Equine { boolean isClingy(ItemStack stack); default ParticleEffect getParticleEffect(IItemEntity entity) { - return ParticleTypes.AMBIENT_ENTITY_EFFECT; + // TODO: was AMBIENT_ENTITY_EFFECT + return ParticleTypes.EFFECT; } default float getFollowDistance(IItemEntity entity) { diff --git a/src/main/java/com/minelittlepony/unicopia/entity/ItemTracker.java b/src/main/java/com/minelittlepony/unicopia/entity/ItemTracker.java index 30334093..fba69d2c 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/ItemTracker.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/ItemTracker.java @@ -16,6 +16,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.util.Identifier; import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; public class ItemTracker implements NbtSerialisable, Copyable, Tickable, TrinketsDelegate.Inventory { public static final long TICKS = 1; @@ -115,14 +116,14 @@ public class ItemTracker implements NbtSerialisable, Copyable, Tick } @Override - public void toNBT(NbtCompound compound) { + public void toNBT(NbtCompound compound, WrapperLookup lookup) { items.forEach((charm, count) -> { compound.putLong(Registries.ITEM.getId(charm.asItem()).toString(), count); }); } @Override - public void fromNBT(NbtCompound compound) { + public void fromNBT(NbtCompound compound, WrapperLookup lookup) { items.clear(); compound.getKeys().stream().map(Identifier::tryParse) .filter(Objects::nonNull) diff --git a/src/main/java/com/minelittlepony/unicopia/entity/Living.java b/src/main/java/com/minelittlepony/unicopia/entity/Living.java index e109876a..34391bbe 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/Living.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/Living.java @@ -42,7 +42,6 @@ import com.minelittlepony.unicopia.util.*; import net.fabricmc.fabric.api.util.TriState; import net.minecraft.block.BlockState; -import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.*; import net.minecraft.entity.attribute.EntityAttribute; @@ -59,6 +58,9 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.network.packet.s2c.play.EntityPassengersSetS2CPacket; import net.minecraft.particle.ParticleTypes; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.tag.DamageTypeTags; import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.BlockSoundGroup; @@ -252,7 +254,7 @@ public abstract class Living implements Equine, Caste } @Override - public final @Nullable EntityAttributeInstance getAttributeInstance(EntityAttribute attribute) { + public final @Nullable EntityAttributeInstance getAttributeInstance(RegistryEntry attribute) { return asEntity().getAttributeInstance(attribute); } @@ -373,8 +375,8 @@ public abstract class Living implements Equine, Caste if (magical.isIn(UTags.DamageTypes.BREAKS_SUNGLASSES)) { ItemStack glasses = GlassesItem.getForEntity(entity).stack(); if (glasses.isOf(UItems.SUNGLASSES)) { - ItemStack broken = UItems.BROKEN_SUNGLASSES.getDefaultStack(); - broken.setNbt(glasses.getNbt()); + // TODO: BreaksIntoItemComponent + ItemStack broken = glasses.withItem(UItems.BROKEN_SUNGLASSES); TrinketsDelegate.getInstance(entity).setEquippedStack(entity, TrinketsDelegate.FACE, broken); playSound(USounds.ITEM_SUNGLASSES_SHATTER, 1, 1); } @@ -450,34 +452,35 @@ public abstract class Living implements Equine, Caste @Override public float getCloudWalkingStrength() { - Enchantment featherFalling = net.minecraft.enchantment.Enchantments.FEATHER_FALLING; - int maxLevel = featherFalling.getMaxLevel(); - int level = EnchantmentHelper.getEquipmentLevel(featherFalling, entity); - return MathHelper.clamp(level / (float)maxLevel, 0, 1); + return asWorld().getRegistryManager().get(RegistryKeys.ENCHANTMENT).getEntry(net.minecraft.enchantment.Enchantments.FEATHER_FALLING).map(featherFalling -> { + int maxLevel = featherFalling.value().getMaxLevel(); + int level = EnchantmentHelper.getEquipmentLevel(featherFalling, entity); + return MathHelper.clamp(level / (float)maxLevel, 0, 1); + }).orElse(0F); } @Override - public void toNBT(NbtCompound compound) { + public void toNBT(NbtCompound compound, WrapperLookup lookup) { enchants.toNBT(compound); - spells.getSlots().toNBT(compound); + spells.getSlots().toNBT(compound, lookup); getCarrierId().ifPresent(id -> compound.putUuid("carrier", id)); - toSyncronisedNbt(compound); + toSyncronisedNbt(compound, lookup); } @Override - public void fromNBT(NbtCompound compound) { + public void fromNBT(NbtCompound compound, WrapperLookup lookup) { enchants.fromNBT(compound); - spells.getSlots().fromNBT(compound); + spells.getSlots().fromNBT(compound, lookup); setCarrier(compound.containsUuid("carrier") ? compound.getUuid("carrier") : null); - fromSynchronizedNbt(compound); + fromSynchronizedNbt(compound, lookup); } - public void toSyncronisedNbt(NbtCompound compound) { - compound.put("armour", armour.toNBT()); + public void toSyncronisedNbt(NbtCompound compound, WrapperLookup lookup) { + compound.put("armour", armour.toNBT(lookup)); } - public void fromSynchronizedNbt(NbtCompound compound) { - armour.fromNBT(compound.getCompound("armour")); + public void fromSynchronizedNbt(NbtCompound compound, WrapperLookup lookup) { + armour.fromNBT(compound.getCompound("armour"), lookup); } public void updateVelocity() { diff --git a/src/main/java/com/minelittlepony/unicopia/entity/effect/EffectUtils.java b/src/main/java/com/minelittlepony/unicopia/entity/effect/EffectUtils.java index 86a41527..90c8d9ee 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/effect/EffectUtils.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/effect/EffectUtils.java @@ -2,10 +2,11 @@ package com.minelittlepony.unicopia.entity.effect; import com.minelittlepony.unicopia.InteractionManager; +import net.minecraft.component.type.AttributeModifiersComponent; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.item.ItemStack; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.StringHelper; @@ -23,7 +24,7 @@ public interface EffectUtils { return getAmplifier(entity, UEffects.BROKEN_WINGS) > 1; } - static int getAmplifier(LivingEntity entity, StatusEffect effect) { + static int getAmplifier(LivingEntity entity, RegistryEntry effect) { return entity.hasStatusEffect(effect) ? entity.getStatusEffect(effect).getAmplifier() + 1 : 0; } @@ -35,7 +36,7 @@ public interface EffectUtils { return entity.hasStatusEffect(UEffects.FORTIFICATION); } - static boolean applyStatusEffect(LivingEntity entity, StatusEffect effect, boolean apply) { + static boolean applyStatusEffect(LivingEntity entity, RegistryEntry effect, boolean apply) { if (entity.getWorld().isClient) { return false; } @@ -62,14 +63,14 @@ public interface EffectUtils { static Text formatModifierChange(String modifierName, float change, boolean isDetrimental) { return Text.literal(" ").append(Text.translatable("attribute.modifier." + (change > 0 ? "plus" : "take") + ".0", - ItemStack.MODIFIER_FORMAT.format(Math.abs(change)), + AttributeModifiersComponent.DECIMAL_FORMAT.format(Math.abs(change)), Text.translatable(modifierName) ).formatted((isDetrimental ? change : -change) < 0 ? Formatting.DARK_GREEN : Formatting.RED)); } static Text formatModifierChange(Text modifierName, float change, boolean isDetrimental) { return Text.literal(" ").append(Text.translatable("attribute.modifier." + (change > 0 ? "plus" : "take") + ".0", - ItemStack.MODIFIER_FORMAT.format(Math.abs(change)), + AttributeModifiersComponent.DECIMAL_FORMAT.format(Math.abs(change)), modifierName ).formatted((isDetrimental ? change : -change) < 0 ? Formatting.DARK_GREEN : Formatting.RED)); } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/effect/UEffects.java b/src/main/java/com/minelittlepony/unicopia/entity/effect/UEffects.java index 798a7289..dae16314 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/effect/UEffects.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/effect/UEffects.java @@ -5,30 +5,31 @@ import com.minelittlepony.unicopia.Unicopia; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectCategory; import net.minecraft.registry.Registry; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.Registries; public interface UEffects { - StatusEffect FOOD_POISONING = register("food_poisoning", new FoodPoisoningStatusEffect(3484199)); - StatusEffect SUN_BLINDNESS = register("sun_blindness", new SunBlindnessStatusEffect(0x886F0F)); + RegistryEntry FOOD_POISONING = register("food_poisoning", new FoodPoisoningStatusEffect(3484199)); + RegistryEntry SUN_BLINDNESS = register("sun_blindness", new SunBlindnessStatusEffect(0x886F0F)); /** * Status effect emitted by players with a high level of corruption. * When affecting an entity, will give them a random chance to reproduce or duplicate themselves when they die. */ - StatusEffect CORRUPT_INFLUENCE = register("corrupt_influence", new CorruptInfluenceStatusEffect(0x00FF00)); - StatusEffect PARALYSIS = register("paralysis", new SimpleStatusEffect(StatusEffectCategory.HARMFUL, 0, false)); - StatusEffect FORTIFICATION = register("fortification", new SimpleStatusEffect(StatusEffectCategory.BENEFICIAL, 0x000077, false)); - StatusEffect BROKEN_WINGS = register("broken_wings", new SimpleStatusEffect(StatusEffectCategory.BENEFICIAL, 0xEEAA00, false)); + RegistryEntry CORRUPT_INFLUENCE = register("corrupt_influence", new CorruptInfluenceStatusEffect(0x00FF00)); + RegistryEntry PARALYSIS = register("paralysis", new SimpleStatusEffect(StatusEffectCategory.HARMFUL, 0, false)); + RegistryEntry FORTIFICATION = register("fortification", new SimpleStatusEffect(StatusEffectCategory.BENEFICIAL, 0x000077, false)); + RegistryEntry BROKEN_WINGS = register("broken_wings", new SimpleStatusEffect(StatusEffectCategory.BENEFICIAL, 0xEEAA00, false)); /** * Side-effect of wearing the alicorn amulet. * Causes the player to lose grip on whatever item they're holding. */ - StatusEffect BUTTER_FINGERS = register("butter_fingers", new ButterfingersStatusEffect(0x888800)); + RegistryEntry BUTTER_FINGERS = register("butter_fingers", new ButterfingersStatusEffect(0x888800)); - StatusEffect SEAPONYS_GRACE = register("seaponys_grace", new SimpleStatusEffect(StatusEffectCategory.BENEFICIAL, 0x0000EE, false)); - StatusEffect SEAPONYS_IRE = register("seaponys_ire", new SimpleStatusEffect(StatusEffectCategory.HARMFUL, 0xEE00EE, false)); + RegistryEntry SEAPONYS_GRACE = register("seaponys_grace", new SimpleStatusEffect(StatusEffectCategory.BENEFICIAL, 0x0000EE, false)); + RegistryEntry SEAPONYS_IRE = register("seaponys_ire", new SimpleStatusEffect(StatusEffectCategory.HARMFUL, 0xEE00EE, false)); - private static StatusEffect register(String name, StatusEffect effect) { - return Registry.register(Registries.STATUS_EFFECT, Unicopia.id(name), effect); + private static RegistryEntry register(String name, StatusEffect effect) { + return Registry.registerReference(Registries.STATUS_EFFECT, Unicopia.id(name), effect); } static void bootstrap() {} 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 ceaf6dad..4edfaeff 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/mob/ButterflyEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/mob/ButterflyEntity.java @@ -1,13 +1,9 @@ package com.minelittlepony.unicopia.entity.mob; -import java.util.Arrays; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Collectors; - import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.USounds; @@ -15,9 +11,9 @@ import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.item.ButterflyItem; import com.minelittlepony.unicopia.util.NbtSerialisable; +import io.netty.buffer.ByteBuf; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityPose; import net.minecraft.entity.EntityType; import net.minecraft.entity.ItemEntity; import net.minecraft.entity.SpawnReason; @@ -27,16 +23,20 @@ import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.data.DataTracker; import net.minecraft.entity.data.TrackedData; import net.minecraft.entity.data.TrackedDataHandlerRegistry; +import net.minecraft.entity.data.DataTracker.Builder; import net.minecraft.entity.mob.AmbientEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.predicate.entity.EntityPredicates; import net.minecraft.sound.SoundEvent; import net.minecraft.registry.tag.BlockTags; import net.minecraft.registry.tag.ItemTags; import net.minecraft.util.Hand; import net.minecraft.util.Identifier; +import net.minecraft.util.StringIdentifiable; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; @@ -73,6 +73,7 @@ public class ButterflyEntity extends AmbientEntity { } public static boolean canSpawn(EntityType type, WorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { + // TODO: Uncomment this return true;//world.getBlockState(pos.down()).isIn(UTags.Blocks.BUTTERFLIES_SPAWNABLE_ON); } @@ -104,10 +105,10 @@ public class ButterflyEntity extends AmbientEntity { } @Override - protected void initDataTracker() { - super.initDataTracker(); - getDataTracker().startTracking(VARIANT, Variant.BUTTERFLY.ordinal()); - getDataTracker().startTracking(RESTING, false); + protected void initDataTracker(Builder builder) { + super.initDataTracker(builder); + builder.add(VARIANT, Variant.BUTTERFLY.ordinal()); + builder.add(RESTING, false); } @Override @@ -330,11 +331,6 @@ public class ButterflyEntity extends AmbientEntity { return reason != SpawnReason.NATURAL || (getY() >= world.getSeaLevel() && world.getLightLevel(getBlockPos()) > 3); } - @Override - public float getEyeHeight(EntityPose pose) { - return getHeight() / 2; - } - @Override public ItemEntity dropStack(ItemStack stack, float yOffset) { return super.dropStack(ButterflyItem.setVariant(stack, getVariant()), yOffset); @@ -345,8 +341,12 @@ public class ButterflyEntity extends AmbientEntity { super.writeCustomDataToNbt(nbt); nbt.putInt("ticksResting", ticksResting); nbt.putInt("breedingCooldown", breedingCooldown); - NbtSerialisable.BLOCK_POS.writeOptional("hoveringPosition", nbt, hoveringPosition); - NbtSerialisable.BLOCK_POS.writeOptional("flowerPosition", nbt, flowerPosition); + hoveringPosition.ifPresent(pos -> { + nbt.put("hoveringPosition", NbtSerialisable.encode(BlockPos.CODEC, pos)); + }); + flowerPosition.ifPresent(pos -> { + nbt.put("flowerPosition", NbtSerialisable.encode(BlockPos.CODEC, pos)); + }); NbtCompound visited = new NbtCompound(); this.visited.forEach((pos, time) -> { visited.putLong(String.valueOf(pos.asLong()), time); @@ -359,8 +359,8 @@ public class ButterflyEntity extends AmbientEntity { super.readCustomDataFromNbt(nbt); ticksResting = nbt.getInt("ticksResting"); breedingCooldown = nbt.getInt("breedingCooldown"); - hoveringPosition = NbtSerialisable.BLOCK_POS.readOptional("hoveringPosition", nbt); - flowerPosition = NbtSerialisable.BLOCK_POS.readOptional("flowerPosition", nbt); + hoveringPosition = NbtSerialisable.decode(BlockPos.CODEC, nbt.get("hoveringPosition")); + flowerPosition = NbtSerialisable.decode(BlockPos.CODEC, nbt.get("flowerPosition")); NbtCompound visited = nbt.getCompound("visited"); this.visited.clear(); visited.getKeys().forEach(key -> { @@ -370,7 +370,7 @@ public class ButterflyEntity extends AmbientEntity { }); } - public enum Variant { + public enum Variant implements StringIdentifiable { BUTTERFLY, YELLOW, LIME, @@ -388,9 +388,12 @@ public class ButterflyEntity extends AmbientEntity { BRIMSTONE; public static final Variant[] VALUES = Variant.values(); - private static final Map REGISTRY = Arrays.stream(VALUES).collect(Collectors.toMap(a -> a.name().toLowerCase(Locale.ROOT), Function.identity())); - private final Identifier skin = Unicopia.id("textures/entity/butterfly/" + name().toLowerCase(Locale.ROOT) + ".png"); + public static final EnumCodec CODEC = StringIdentifiable.createCodec(Variant::values); + public static final PacketCodec PACKET_CODEC = PacketCodecs.indexed(i -> VALUES[i], Variant::ordinal); + + private final String name = name().toLowerCase(Locale.ROOT); + private final Identifier skin = Unicopia.id("textures/entity/butterfly/" + name + ".png"); public Identifier getSkin() { return skin; @@ -405,7 +408,12 @@ public class ButterflyEntity extends AmbientEntity { } public static Variant byName(String name) { - return REGISTRY.getOrDefault(name == null ? "" : name, BUTTERFLY); + return CODEC.byId(name, BUTTERFLY); + } + + @Override + public String asString() { + return name; } } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/mob/SpellbookEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/mob/SpellbookEntity.java index c5247c17..daa910c3 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/mob/SpellbookEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/mob/SpellbookEntity.java @@ -12,11 +12,12 @@ import com.minelittlepony.unicopia.container.SpellbookScreenHandler; import com.minelittlepony.unicopia.container.SpellbookState; import com.minelittlepony.unicopia.entity.MagicImmune; import com.minelittlepony.unicopia.item.UItems; +import com.minelittlepony.unicopia.item.component.UDataComponentTypes; import com.minelittlepony.unicopia.network.Channel; import com.minelittlepony.unicopia.network.MsgSpellbookStateChanged; import com.minelittlepony.unicopia.server.world.Altar; import com.minelittlepony.unicopia.util.MeteorlogicalUtil; - +import com.minelittlepony.unicopia.util.NbtSerialisable; import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; import net.fabricmc.fabric.api.util.TriState; import net.minecraft.block.Blocks; @@ -27,12 +28,12 @@ import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.data.DataTracker; import net.minecraft.entity.data.TrackedData; import net.minecraft.entity.data.TrackedDataHandlerRegistry; +import net.minecraft.entity.data.DataTracker.Builder; import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; -import net.minecraft.network.PacketByteBuf; import net.minecraft.particle.ParticleTypes; import net.minecraft.predicate.entity.EntityPredicates; import net.minecraft.screen.*; @@ -62,7 +63,7 @@ public class SpellbookEntity extends MobEntity implements MagicImmune { private int activeTicks = TICKS_TO_SLEEP; private boolean prevDaytime; - private final SpellbookState state = new SpellbookState(); + private SpellbookState state = new SpellbookState(); private Optional altar = Optional.empty(); @@ -91,20 +92,25 @@ public class SpellbookEntity extends MobEntity implements MagicImmune { } @Override - protected void initDataTracker() { - super.initDataTracker(); - dataTracker.startTracking(LOCKED, (byte)1); - dataTracker.startTracking(ALTERED, false); + protected void initDataTracker(Builder builder) { + super.initDataTracker(builder); + builder.add(LOCKED, (byte)1); + builder.add(ALTERED, false); } public SpellbookState getSpellbookState() { return state; } + public void setSpellbookState(SpellbookState state) { + state.copySyncronizer(this.state); + this.state = state; + } + @Override public ItemStack getPickBlockStack() { ItemStack stack = UItems.SPELLBOOK.getDefaultStack(); - stack.getOrCreateNbt().put("spellbookState", state.toNBT()); + stack.set(UDataComponentTypes.SPELLBOOK_STATE, state.createCopy()); return stack; } @@ -345,7 +351,7 @@ public class SpellbookEntity extends MobEntity implements MagicImmune { if (isOpen()) { keepAwake(); - player.openHandledScreen(new ExtendedScreenHandlerFactory() { + player.openHandledScreen(new ExtendedScreenHandlerFactory() { @Override public Text getDisplayName() { return SpellbookEntity.this.getDisplayName(); @@ -357,8 +363,8 @@ public class SpellbookEntity extends MobEntity implements MagicImmune { } @Override - public void writeScreenOpeningData(ServerPlayerEntity player, PacketByteBuf buf) { - state.toPacket(buf); + public SpellbookState getScreenOpeningData(ServerPlayerEntity player) { + return state; } }); player.playSound(USounds.Vanilla.ITEM_BOOK_PAGE_TURN, 2, 1); @@ -385,8 +391,8 @@ public class SpellbookEntity extends MobEntity implements MagicImmune { activeTicks = compound.getInt("activeTicks"); setAltered(compound.getBoolean("altered")); setForcedState(compound.contains("locked") ? TriState.of(compound.getBoolean("locked")) : TriState.DEFAULT); - state.fromNBT(compound.getCompound("spellbookState")); - altar = Altar.SERIALIZER.readOptional("altar", compound); + state.fromNBT(compound.getCompound("spellbookState"), getWorld().getRegistryManager()); + altar = NbtSerialisable.decode(Altar.CODEC, compound.get("altar")); } @Override @@ -395,12 +401,14 @@ public class SpellbookEntity extends MobEntity implements MagicImmune { compound.putInt("activeTicks", activeTicks); compound.putBoolean("prevDaytime", prevDaytime); compound.putBoolean("altered", isAltered()); - compound.put("spellbookState", state.toNBT()); + compound.put("spellbookState", state.toNBT(getWorld().getRegistryManager())); getForcedState().map(t -> { compound.putBoolean("locked", t); return null; }); - Altar.SERIALIZER.writeOptional("altar", compound, altar); + altar.ifPresent(altar -> { + compound.put("altar", NbtSerialisable.encode(Altar.CODEC, altar)); + }); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/entity/mob/StormCloudEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/mob/StormCloudEntity.java index 6bad71e2..536f2bfa 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/mob/StormCloudEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/mob/StormCloudEntity.java @@ -26,6 +26,7 @@ import net.minecraft.entity.data.TrackedData; import net.minecraft.entity.data.TrackedDataHandlerRegistry; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; +import net.minecraft.loot.LootTable; import net.minecraft.loot.context.LootContextParameterSet; import net.minecraft.loot.context.LootContextParameters; import net.minecraft.loot.context.LootContextTypes; @@ -33,11 +34,12 @@ import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.minecraft.particle.ParticleTypes; import net.minecraft.predicate.entity.EntityPredicates; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; @@ -73,11 +75,11 @@ public class StormCloudEntity extends Entity implements MagicImmune { } @Override - protected void initDataTracker() { - dataTracker.startTracking(STORM_TICKS, 0); - dataTracker.startTracking(CLEAR_TICKS, 0); - dataTracker.startTracking(TARGET_SIZE, 1F); - dataTracker.startTracking(DISSIPATING, false); + protected void initDataTracker(DataTracker.Builder builder) { + builder.add(STORM_TICKS, 0); + builder.add(CLEAR_TICKS, 0); + builder.add(TARGET_SIZE, 1F); + builder.add(DISSIPATING, false); } public boolean isStormy() { @@ -295,17 +297,17 @@ public class StormCloudEntity extends Entity implements MagicImmune { if (random.nextInt(35) == 0 || (source.isOf(DamageTypes.PLAYER_ATTACK) && EquineContext.of(source.getAttacker()).collidesWithClouds())) { if (getSize(1) < 2) { if (!getWorld().isClient() && getWorld().getGameRules().getBoolean(GameRules.DO_MOB_LOOT)) { - Identifier identifier = getType().getLootTableId(); + RegistryKey table = getType().getLootTableId(); LootContextParameterSet.Builder builder = new LootContextParameterSet.Builder((ServerWorld)this.getWorld()) .add(LootContextParameters.THIS_ENTITY, this) .add(LootContextParameters.ORIGIN, this.getPos()) .add(LootContextParameters.DAMAGE_SOURCE, source) - .addOptional(LootContextParameters.KILLER_ENTITY, source.getAttacker()) - .addOptional(LootContextParameters.DIRECT_KILLER_ENTITY, source.getSource()); + .addOptional(LootContextParameters.ATTACKING_ENTITY, source.getAttacker()) + .addOptional(LootContextParameters.DIRECT_ATTACKING_ENTITY, source.getSource()); if (source.getAttacker() instanceof PlayerEntity player) { builder = builder.add(LootContextParameters.LAST_DAMAGE_PLAYER, player).luck(player.getLuck()); } - getWorld().getServer().getLootManager().getLootTable(identifier) + getWorld().getRegistryManager().get(RegistryKeys.LOOT_TABLE).get(table) .generateLoot(builder.build(LootContextTypes.ENTITY), 0L, this::dropStack); } kill(); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/mob/UEntities.java b/src/main/java/com/minelittlepony/unicopia/entity/mob/UEntities.java index cd3f9fae..20b1f51f 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/mob/UEntities.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/mob/UEntities.java @@ -1,7 +1,5 @@ package com.minelittlepony.unicopia.entity.mob; -import java.util.HashSet; -import java.util.Set; import java.util.function.Predicate; import com.minelittlepony.unicopia.Unicopia; @@ -13,14 +11,11 @@ import com.minelittlepony.unicopia.projectile.PhysicsBodyProjectileEntity; import net.fabricmc.fabric.api.biome.v1.BiomeModifications; import net.fabricmc.fabric.api.biome.v1.BiomeSelectionContext; import net.fabricmc.fabric.api.biome.v1.BiomeSelectors; -import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; -import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; +import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityType; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityDimensions; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; -import net.minecraft.entity.SpawnRestriction.Location; -import net.minecraft.entity.decoration.painting.PaintingVariant; +import net.minecraft.entity.SpawnLocationTypes; import net.minecraft.entity.mob.FlyingEntity; import net.minecraft.entity.mob.HostileEntity; import net.minecraft.registry.*; @@ -28,91 +23,92 @@ import net.minecraft.registry.tag.BiomeTags; import net.minecraft.world.Heightmap.Type; public interface UEntities { - EntityType BUTTERFLY = register("butterfly", FabricEntityTypeBuilder.createMob().spawnGroup(SpawnGroup.AMBIENT).entityFactory(ButterflyEntity::new) - .spawnRestriction(Location.NO_RESTRICTIONS, Type.MOTION_BLOCKING_NO_LEAVES, ButterflyEntity::canSpawn) + EntityType BUTTERFLY = register("butterfly", FabricEntityType.Builder.createMob(ButterflyEntity::new, SpawnGroup.AMBIENT, builder -> builder + .spawnRestriction(SpawnLocationTypes.UNRESTRICTED, Type.MOTION_BLOCKING_NO_LEAVES, ButterflyEntity::canSpawn) + .defaultAttributes(ButterflyEntity::createButterflyAttributes)) .spawnableFarFromPlayer() - .dimensions(EntityDimensions.fixed(0.25F, 0.25F))); - EntityType THROWN_ITEM = register("thrown_item", FabricEntityTypeBuilder.create(SpawnGroup.MISC, MagicProjectileEntity::new) - .trackRangeBlocks(100) + .dimensions(0.25F, 0.25F) + .eyeHeight(0.125F)); + EntityType THROWN_ITEM = register("thrown_item", EntityType.Builder.create(MagicProjectileEntity::new, SpawnGroup.MISC) + .maxTrackingRange(100) .disableSummon() - .trackedUpdateRate(2) - .dimensions(EntityDimensions.fixed(0.25F, 0.25F))); - EntityType MUFFIN = register("muffin", FabricEntityTypeBuilder.create(SpawnGroup.MISC, (type, world) -> new PhysicsBodyProjectileEntity(type, world, UItems.MUFFIN.getDefaultStack())) - .trackRangeBlocks(100) + .trackingTickInterval(2) + .dimensions(0.25F, 0.25F)); + EntityType MUFFIN = register("muffin", EntityType.Builder.create((type, world) -> new PhysicsBodyProjectileEntity(type, world, UItems.MUFFIN.getDefaultStack()), SpawnGroup.MISC) + .maxTrackingRange(100) .disableSummon() - .trackedUpdateRate(2) - .dimensions(EntityDimensions.fixed(0.25F, 0.25F))); - EntityType MAGIC_BEAM = register("magic_beam", FabricEntityTypeBuilder.create(SpawnGroup.MISC, MagicBeamEntity::new) - .trackRangeBlocks(100) + .trackingTickInterval(2) + .dimensions(0.25F, 0.25F)); + EntityType MAGIC_BEAM = register("magic_beam", EntityType.Builder.create(MagicBeamEntity::new, SpawnGroup.MISC) + .maxTrackingRange(100) .disableSummon() - .trackedUpdateRate(2) - .dimensions(EntityDimensions.fixed(0.25F, 0.25F))); - EntityType FLOATING_ARTEFACT = register("floating_artefact", FabricEntityTypeBuilder.create(SpawnGroup.MISC, FloatingArtefactEntity::new) - .trackRangeBlocks(200) + .trackingTickInterval(2) + .alwaysUpdateVelocity(true) + .dimensions(0.25F, 0.25F)); + EntityType FLOATING_ARTEFACT = register("floating_artefact", EntityType.Builder.create(FloatingArtefactEntity::new, SpawnGroup.MISC) + .maxTrackingRange(200) .disableSummon() - .dimensions(EntityDimensions.fixed(1, 1))); - EntityType CAST_SPELL = register("cast_spell", FabricEntityTypeBuilder.create(SpawnGroup.MISC, CastSpellEntity::new) - .trackRangeBlocks(200) + .dimensions(1, 1)); + EntityType CAST_SPELL = register("cast_spell", EntityType.Builder.create(CastSpellEntity::new, SpawnGroup.MISC) + .maxTrackingRange(200) .disableSummon() - .dimensions(EntityDimensions.changing(4, 4))); - EntityType TWITTERMITE = register("twittermite", FabricEntityTypeBuilder.create(SpawnGroup.MISC, FairyEntity::new) - .trackRangeBlocks(200) - .dimensions(EntityDimensions.fixed(0.1F, 0.1F))); - EntityType FRIENDLY_CREEPER = register("friendly_creeper", FabricEntityTypeBuilder.create(SpawnGroup.MISC, FriendlyCreeperEntity::new) - .trackRangeChunks(8) + .dimensions(4, 4)); + EntityType TWITTERMITE = register("twittermite", FabricEntityType.Builder.createMob(FairyEntity::new, SpawnGroup.MISC, builder -> builder + .defaultAttributes(FairyEntity::createMobAttributes)) + .maxTrackingRange(200) + .dimensions(0.1F, 0.1F)); + EntityType FRIENDLY_CREEPER = register("friendly_creeper", FabricEntityType.Builder.createMob(FriendlyCreeperEntity::new, SpawnGroup.MISC, builder -> builder + .defaultAttributes(FriendlyCreeperEntity::createCreeperAttributes)) + .maxTrackingRange(8) .disableSummon() - .dimensions(EntityDimensions.fixed(0.6f, 1.7f))); - EntityType SPELLBOOK = register("spellbook", FabricEntityTypeBuilder.create(SpawnGroup.MISC, SpellbookEntity::new) - .trackRangeBlocks(200) - .dimensions(EntityDimensions.fixed(0.9F, 0.5F))); - EntityType SOMBRA = register("sombra", FabricEntityTypeBuilder.create(SpawnGroup.MONSTER, SombraEntity::new) - .trackRangeBlocks(200) - .dimensions(EntityDimensions.changing(2F, 4F))); - EntityType CRYSTAL_SHARDS = register("crystal_shards", FabricEntityTypeBuilder.create(SpawnGroup.MISC, CrystalShardsEntity::new) - .trackRangeBlocks(100) - .dimensions(EntityDimensions.changing(1F, 1F))); - EntityType STORM_CLOUD = register("storm_cloud", FabricEntityTypeBuilder.create(SpawnGroup.MISC, StormCloudEntity::new) - .trackRangeBlocks(200) - .dimensions(EntityDimensions.changing(20F, 20F))); - EntityType AIR_BALLOON = register("air_balloon", FabricEntityTypeBuilder.create(SpawnGroup.MISC, AirBalloonEntity::new) - .trackRangeBlocks(1000) - .dimensions(EntityDimensions.changing(2.5F, 0.1F))); - EntityType LOOT_BUG = register("loot_bug", FabricEntityTypeBuilder.create(SpawnGroup.MONSTER, LootBugEntity::new) - .trackRangeChunks(8) - .dimensions(EntityDimensions.fixed(0.8F, 0.6F))); - EntityType TENTACLE = register("ignominious_vine", FabricEntityTypeBuilder.create(SpawnGroup.MISC, TentacleEntity::new) - .trackRangeChunks(8) - .dimensions(EntityDimensions.fixed(0.8F, 0.8F))); - EntityType IGNOMINIOUS_BULB = register("ignominious_bulb", FabricEntityTypeBuilder.create(SpawnGroup.MISC, IgnominiousBulbEntity::new) - .trackRangeChunks(8) - .dimensions(EntityDimensions.fixed(3, 2))); - EntityType SPECTER = register("specter", FabricEntityTypeBuilder.createMob().spawnGroup(SpawnGroup.MONSTER).entityFactory(SpecterEntity::new) - .spawnRestriction(Location.ON_GROUND, Type.MOTION_BLOCKING_NO_LEAVES, HostileEntity::canSpawnInDark) - .fireImmune() + .dimensions(0.6f, 1.7f)); + EntityType SPELLBOOK = register("spellbook", FabricEntityType.Builder.createMob(SpellbookEntity::new, SpawnGroup.MISC, builder -> builder + .defaultAttributes(SpellbookEntity::createMobAttributes)) + .maxTrackingRange(200) + .dimensions(0.9F, 0.5F)); + EntityType SOMBRA = register("sombra", FabricEntityType.Builder.createMob(SombraEntity::new, SpawnGroup.MONSTER, builder -> builder + .defaultAttributes(SombraEntity::createMobAttributes)) + .maxTrackingRange(200) + .dimensions(2F, 4F)); + EntityType CRYSTAL_SHARDS = register("crystal_shards", EntityType.Builder.create(CrystalShardsEntity::new, SpawnGroup.MISC) + .maxTrackingRange(100) + .dimensions(1F, 1F)); + EntityType STORM_CLOUD = register("storm_cloud", EntityType.Builder.create(StormCloudEntity::new, SpawnGroup.MISC) + .maxTrackingRange(200) + .dimensions(20F, 20F)); + EntityType AIR_BALLOON = register("air_balloon", FabricEntityType.Builder.createMob(AirBalloonEntity::new, SpawnGroup.MISC, builder -> builder + .defaultAttributes(FlyingEntity::createMobAttributes)) + .maxTrackingRange(1000) + .dimensions(2.5F, 0.1F)); + EntityType LOOT_BUG = register("loot_bug", FabricEntityType.Builder.createMob(LootBugEntity::new, SpawnGroup.MONSTER, builder -> builder + .defaultAttributes(LootBugEntity::createSilverfishAttributes)) + .maxTrackingRange(8) + .dimensions(0.8F, 0.6F)); + EntityType TENTACLE = register("ignominious_vine", EntityType.Builder.create(TentacleEntity::new, SpawnGroup.MISC) + .maxTrackingRange(8) + .dimensions(0.8F, 0.8F)); + EntityType IGNOMINIOUS_BULB = register("ignominious_bulb", FabricEntityType.Builder.createMob(IgnominiousBulbEntity::new, SpawnGroup.MISC, builder -> builder + .defaultAttributes(IgnominiousBulbEntity::createMobAttributes)) + .maxTrackingRange(8) + .dimensions(3, 2)); + EntityType SPECTER = register("specter", FabricEntityType.Builder.createMob(SpecterEntity::new, SpawnGroup.MONSTER, builder -> builder + .spawnRestriction(SpawnLocationTypes.ON_GROUND, Type.MOTION_BLOCKING_NO_LEAVES, HostileEntity::canSpawnInDark) + .defaultAttributes(SpecterEntity::createAttributes)) + .makeFireImmune() .spawnableFarFromPlayer() - .dimensions(EntityDimensions.fixed(1, 2))); - EntityType MIMIC = register("mimic", FabricEntityTypeBuilder.create(SpawnGroup.MONSTER, MimicEntity::new) - .fireImmune() + .dimensions(1, 2)); + EntityType MIMIC = register("mimic", FabricEntityType.Builder.createMob(MimicEntity::new, SpawnGroup.MONSTER, builder -> builder + .defaultAttributes(MimicEntity::createMobAttributes)) + .makeFireImmune() .disableSummon() - .dimensions(EntityDimensions.changing(0.875F, 0.875F))); + .dimensions(0.875F, 0.875F)); - static EntityType register(String name, FabricEntityTypeBuilder builder) { + static EntityType register(String name, EntityType.Builder builder) { EntityType type = builder.build(); return Registry.register(Registries.ENTITY_TYPE, Unicopia.id(name), type); } static void bootstrap() { - FabricDefaultAttributeRegistry.register(BUTTERFLY, ButterflyEntity.createButterflyAttributes()); - FabricDefaultAttributeRegistry.register(SPELLBOOK, SpellbookEntity.createMobAttributes()); - FabricDefaultAttributeRegistry.register(TWITTERMITE, FairyEntity.createMobAttributes()); - FabricDefaultAttributeRegistry.register(AIR_BALLOON, FlyingEntity.createMobAttributes()); - FabricDefaultAttributeRegistry.register(SOMBRA, SombraEntity.createMobAttributes()); - FabricDefaultAttributeRegistry.register(FRIENDLY_CREEPER, FriendlyCreeperEntity.createCreeperAttributes()); - FabricDefaultAttributeRegistry.register(LOOT_BUG, LootBugEntity.createSilverfishAttributes()); - FabricDefaultAttributeRegistry.register(IGNOMINIOUS_BULB, IgnominiousBulbEntity.createMobAttributes()); - FabricDefaultAttributeRegistry.register(SPECTER, SpecterEntity.createAttributes()); - FabricDefaultAttributeRegistry.register(MIMIC, MimicEntity.createMobAttributes()); - if (!Unicopia.getConfig().disableButterflySpawning.get()) { final Predicate butterflySpawnable = BiomeSelectors.foundInOverworld() .and(ctx -> ctx.getBiome().hasPrecipitation() && ctx.getBiome().getTemperature() > 0.15F); @@ -133,39 +129,5 @@ public interface UEntities { UTradeOffers.bootstrap(); EntityBehaviour.bootstrap(); UEntityAttributes.bootstrap(); - Paintings.bootstrap(); - } - - interface Paintings { - Set REGISTRY = new HashSet<>(); - - private static void register(String id, int width, int height) { - REGISTRY.add(Registry.register( - Registries.PAINTING_VARIANT, - RegistryKey.of(RegistryKeys.PAINTING_VARIANT, Unicopia.id(id)), - new PaintingVariant(16 * width, 16 * height) - )); - } - - static void bootstrap() { - register("bloom", 2, 1); - register("chicken", 2, 1); - register("bells", 2, 1); - - register("crystal", 3, 3); - register("harmony", 3, 3); - - register("equality", 2, 4); - register("solar", 2, 4); - register("lunar", 2, 4); - register("platinum", 2, 4); - register("hurricane", 2, 4); - register("pudding", 2, 4); - register("terra", 2, 4); - register("equestria", 2, 4); - - register("blossom", 2, 3); - register("shadow", 2, 3); - } } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/mob/UEntityAttributes.java b/src/main/java/com/minelittlepony/unicopia/entity/mob/UEntityAttributes.java index f622003f..a7766b6b 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/mob/UEntityAttributes.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/mob/UEntityAttributes.java @@ -3,25 +3,26 @@ package com.minelittlepony.unicopia.entity.mob; import java.util.ArrayList; import java.util.List; -import com.jamieswhiteshirt.reachentityattributes.ReachEntityAttributes; import com.minelittlepony.unicopia.Unicopia; import net.minecraft.entity.attribute.ClampedEntityAttribute; import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.registry.Registry; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.Registries; public interface UEntityAttributes { List REGISTRY = new ArrayList<>(); - EntityAttribute EXTENDED_REACH_DISTANCE = ReachEntityAttributes.REACH; - EntityAttribute EXTENDED_ATTACK_DISTANCE = ReachEntityAttributes.ATTACK_RANGE; - EntityAttribute EXTRA_MINING_SPEED = register("earth.mining_speed", new ClampedEntityAttribute("player.miningSpeed", 1, 0, 5).setTracked(true)); - EntityAttribute ENTITY_GRAVITY_MODIFIER = register("player.gravity", (new EntityAttribute("player.gravityModifier", 1) {}).setTracked(true)); + RegistryEntry EXTENDED_REACH_DISTANCE = EntityAttributes.PLAYER_BLOCK_INTERACTION_RANGE; + RegistryEntry EXTENDED_ATTACK_DISTANCE = EntityAttributes.PLAYER_ENTITY_INTERACTION_RANGE; + RegistryEntry EXTRA_MINING_SPEED = register("earth.mining_speed", new ClampedEntityAttribute("player.miningSpeed", 1, 0, 5).setTracked(true)); + RegistryEntry ENTITY_GRAVITY_MODIFIER = register("player.gravity", (new EntityAttribute("player.gravityModifier", 1) {}).setTracked(true)); - private static EntityAttribute register(String name, EntityAttribute attribute) { + private static RegistryEntry register(String name, EntityAttribute attribute) { REGISTRY.add(attribute); - return Registry.register(Registries.ATTRIBUTE, Unicopia.id(name), attribute); + return Registry.registerReference(Registries.ATTRIBUTE, Unicopia.id(name), attribute); } static void bootstrap() {} 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 8e529828..ba3b9a15 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java @@ -17,6 +17,7 @@ import net.minecraft.block.Blocks; import net.minecraft.block.SideShapeType; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.NbtCompound; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; import net.minecraft.registry.tag.BlockTags; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; @@ -161,7 +162,7 @@ public class Acrobatics implements Tickable, NbtSerialisable { public void startHanging(BlockPos pos) { boolean inverted = pony.getPhysics().isGravityNegative(); hangingPos.set(Optional.of(pos)); - entity.teleport(pos.getX() + 0.5, pos.getY() - (inverted ? 0 : 1), pos.getZ() + 0.5); + entity.setPosition(pos.getX() + 0.5, pos.getY() - (inverted ? 0 : 1), pos.getZ() + 0.5); entity.setVelocity(Vec3d.ZERO); entity.setSneaking(false); entity.stopFallFlying(); @@ -196,14 +197,14 @@ public class Acrobatics implements Tickable, NbtSerialisable { } @Override - public void toNBT(NbtCompound compound) { + public void toNBT(NbtCompound compound, WrapperLookup lookup) { compound.putInt("ticksHanging", ticksHanging); - BLOCK_POS.writeOptional("hangingPosition", compound, getHangingPosition()); + BLOCK_POS.writeOptional("hangingPosition", compound, getHangingPosition(), lookup); } @Override - public void fromNBT(NbtCompound compound) { + public void fromNBT(NbtCompound compound, WrapperLookup lookup) { ticksHanging = compound.getInt("ticksHanging"); - hangingPos.set(NbtSerialisable.BLOCK_POS.readOptional("hangingPosition", compound)); + hangingPos.set(NbtSerialisable.BLOCK_POS.readOptional("hangingPosition", compound, lookup)); } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/ManaContainer.java b/src/main/java/com/minelittlepony/unicopia/entity/player/ManaContainer.java index 15bcf34f..32e1be87 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/ManaContainer.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/ManaContainer.java @@ -9,6 +9,7 @@ import com.minelittlepony.unicopia.util.Copyable; import com.minelittlepony.unicopia.util.NbtSerialisable; import com.minelittlepony.unicopia.util.Tickable; import net.minecraft.nbt.NbtCompound; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; import net.minecraft.util.math.MathHelper; class ManaContainer implements MagicReserves, Tickable, NbtSerialisable, Copyable { @@ -44,13 +45,13 @@ class ManaContainer implements MagicReserves, Tickable, NbtSerialisable, Copyabl } @Override - public void toNBT(NbtCompound compound) { - bars.forEach((key, bar) -> compound.put(key, bar.toNBT())); + public void toNBT(NbtCompound compound, WrapperLookup lookup) { + bars.forEach((key, bar) -> compound.put(key, bar.toNBT(lookup))); } @Override - public void fromNBT(NbtCompound compound) { - bars.forEach((key, bar) -> bar.fromNBT(compound.getCompound(key))); + public void fromNBT(NbtCompound compound, WrapperLookup lookup) { + bars.forEach((key, bar) -> bar.fromNBT(compound.getCompound(key), lookup)); } @Override @@ -227,13 +228,13 @@ class ManaContainer implements MagicReserves, Tickable, NbtSerialisable, Copyabl } @Override - public void toNBT(NbtCompound compound) { + public void toNBT(NbtCompound compound, WrapperLookup lookup) { compound.putFloat("shadow", trailingValue); compound.putFloat("value", get()); } @Override - public void fromNBT(NbtCompound compound) { + public void fromNBT(NbtCompound compound, WrapperLookup lookup) { trailingValue = compound.getFloat("shadow"); load(compound.getFloat("value")); } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerAttributes.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerAttributes.java index 8fd84dcf..dad3d817 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerAttributes.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerAttributes.java @@ -1,10 +1,10 @@ package com.minelittlepony.unicopia.entity.player; import java.util.List; -import java.util.UUID; import java.util.function.Predicate; import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.entity.effect.EffectUtils; import com.minelittlepony.unicopia.entity.effect.UEffects; @@ -12,58 +12,59 @@ import com.minelittlepony.unicopia.entity.mob.UEntityAttributes; import com.minelittlepony.unicopia.util.Tickable; import net.minecraft.entity.attribute.EntityAttribute; -import net.minecraft.entity.attribute.EntityAttributeInstance; import net.minecraft.entity.attribute.EntityAttributeModifier; import net.minecraft.entity.attribute.EntityAttributeModifier.Operation; import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.util.Identifier; public class PlayerAttributes implements Tickable { private final static List ATTRIBUTES = List.of( new ToggleableAttribute( - new EntityAttributeModifier(UUID.fromString("777a5505-521e-480b-b9d5-6ea54f259564"), "Earth Pony Strength", 0.6, Operation.MULTIPLY_TOTAL), + new EntityAttributeModifier(Unicopia.id("earth_pony_strength"), 0.6, Operation.ADD_MULTIPLIED_TOTAL), List.of(EntityAttributes.GENERIC_ATTACK_DAMAGE, EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE), pony -> pony.getCompositeRace().canUseEarth() ), new ToggleableAttribute( - new EntityAttributeModifier(UUID.fromString("79e269a8-03e8-b9d5-5853-e25fdcf6706d"), "Earth Pony Knockback Resistance", 6, Operation.ADDITION), + new EntityAttributeModifier(Unicopia.id("earth_pony_knockback_resistance"), 6, Operation.ADD_VALUE), List.of(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE), pony -> pony.getCompositeRace().canUseEarth() && pony.asEntity().isSneaking() ), new ToggleableAttribute( - new EntityAttributeModifier(UUID.fromString("9fc9e269-152e-0b48-9bd5-564a546e59f2"), "Earth Pony Mining Speed", 0.5, Operation.MULTIPLY_TOTAL), + new EntityAttributeModifier(Unicopia.id("earth_pony_mining_speed"), 0.5, Operation.ADD_MULTIPLIED_TOTAL), List.of(UEntityAttributes.EXTRA_MINING_SPEED), pony -> pony.getCompositeRace().canUseEarth() ), new ToggleableAttribute( - new EntityAttributeModifier(UUID.fromString("9e2699fc-3b8d-4f71-9d2d-fb92ee19b4f7"), "Pegasus Speed", 0.2, Operation.MULTIPLY_TOTAL), + new EntityAttributeModifier(Unicopia.id("pegasus_speed"), 0.2, Operation.ADD_MULTIPLIED_TOTAL), List.of(EntityAttributes.GENERIC_MOVEMENT_SPEED, EntityAttributes.GENERIC_ATTACK_SPEED), pony -> pony.getCompositeRace().canFly() && !pony.getCompositeRace().includes(Race.HIPPOGRIFF) ), new ToggleableAttribute( - new EntityAttributeModifier(UUID.fromString("707b50a8-03e8-40f4-8553-ecf67025fd6d"), "Pegasus Reach", 1.5, Operation.ADDITION), + new EntityAttributeModifier(Unicopia.id("pegasus_reach"), 1.5, Operation.ADD_VALUE), List.of(UEntityAttributes.EXTENDED_REACH_DISTANCE), pony -> pony.getCompositeRace().canFly() && !pony.getCompositeRace().includes(Race.HIPPOGRIFF) ), new ToggleableAttribute( - new EntityAttributeModifier(UUID.fromString("9e2699fc-3b8d-4f71-92dd-bef19b92e4f7"), "Hippogriff Speed", 0.1, Operation.MULTIPLY_TOTAL), + new EntityAttributeModifier(Unicopia.id("hippogriff_speed"), 0.1, Operation.ADD_MULTIPLIED_TOTAL), List.of(EntityAttributes.GENERIC_MOVEMENT_SPEED, EntityAttributes.GENERIC_ATTACK_SPEED), pony -> pony.getCompositeRace().includes(Race.HIPPOGRIFF) ), new ToggleableAttribute( - new EntityAttributeModifier(UUID.fromString("707b50a8-03e8-40f4-5853-fc7e0f625d6d"), "Hippogriff Reach", 1.3, Operation.ADDITION), + new EntityAttributeModifier(Unicopia.id("hippogriff_reach"), 1.3, Operation.ADD_VALUE), List.of(UEntityAttributes.EXTENDED_REACH_DISTANCE), pony -> pony.getCompositeRace().includes(Race.HIPPOGRIFF) ), new ToggleableAttribute( - new EntityAttributeModifier(UUID.fromString("79e269a8-03e8-b9d5-5853-e25fdcf6706e"), "Kirin Knockback Vulnerability", -2, Operation.ADDITION), + new EntityAttributeModifier(Unicopia.id("kirin_knockback_vulneravility"), -2, Operation.ADD_VALUE), List.of(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE), pony -> pony.getCompositeRace().includes(Race.KIRIN) ), new ToggleableAttribute( - new EntityAttributeModifier(UUID.fromString("4991fde9-c685-4930-bbd2-d7a228728bfe"), "Kirin Rage Speed", 0.7, Operation.MULTIPLY_TOTAL), + new EntityAttributeModifier(Unicopia.id("kirin_rage"), 0.7, Operation.ADD_MULTIPLIED_TOTAL), List.of(EntityAttributes.GENERIC_MOVEMENT_SPEED, EntityAttributes.GENERIC_ATTACK_SPEED, EntityAttributes.GENERIC_ATTACK_DAMAGE, @@ -74,10 +75,10 @@ public class PlayerAttributes implements Tickable { ) ); - public static final UUID HEALTH_SWAPPING_MODIFIER_ID = UUID.fromString("7b93803e-4b25-11ed-951e-00155d43e0a2"); + public static final Identifier HEALTH_SWAPPING_MODIFIER_ID = Unicopia.id("health_swap"); public static EntityAttributeModifier healthChange(float addition) { - return new EntityAttributeModifier(HEALTH_SWAPPING_MODIFIER_ID, "Health Swap", addition, Operation.ADDITION); + return new EntityAttributeModifier(HEALTH_SWAPPING_MODIFIER_ID, addition, Operation.ADD_VALUE); } private final Pony pony; @@ -92,20 +93,10 @@ public class PlayerAttributes implements Tickable { EffectUtils.applyStatusEffect(pony.asEntity(), UEffects.FORTIFICATION, pony.getCompositeRace().canUseEarth() && pony.asEntity().isSneaking()); } - record ToggleableAttribute(EntityAttributeModifier modifier, List attributes, Predicate test) { + record ToggleableAttribute(EntityAttributeModifier modifier, List> attributes, Predicate test) { public void update(Pony pony) { boolean enable = test.test(pony); - attributes.forEach(attribute -> { - EntityAttributeInstance instance = pony.asEntity().getAttributeInstance(attribute); - - if (enable) { - if (!instance.hasModifier(modifier)) { - instance.addPersistentModifier(modifier); - } - } else { - instance.removeModifier(modifier.getId()); - } - }); + attributes.forEach(attribute -> pony.applyAttributeModifier(attribute, modifier, true, enable)); } } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerCharmTracker.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerCharmTracker.java index fbb29e1c..c613012d 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerCharmTracker.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerCharmTracker.java @@ -13,6 +13,7 @@ import com.minelittlepony.unicopia.util.NbtSerialisable; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtList; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; @@ -71,7 +72,7 @@ public class PlayerCharmTracker implements NbtSerialisable, Copyable spell : handSpells) { equippedSpells.add(spell.toNbt(new NbtCompound())); @@ -80,7 +81,7 @@ public class PlayerCharmTracker implements NbtSerialisable, Copyable implements Tickab ChargeableItem.consumeEnergy(stack.stack(), energyConsumed); if (entity.getWorld().random.nextInt(damageInterval) == 0) { - stack.stack().damage(minDamage + entity.getWorld().random.nextInt(50), (LivingEntity)entity, stack.breakStatusSender()); + stack.stack().damage(minDamage + entity.getWorld().random.nextInt(50), (ServerWorld)entity.getWorld(), (ServerPlayerEntity)entity, stack.breakStatusSender()); } if (!lastFlightType.canFly()) { @@ -871,8 +874,8 @@ public class PlayerPhysics extends EntityPhysics implements Tickab } @Override - public void toNBT(NbtCompound compound) { - super.toNBT(compound); + public void toNBT(NbtCompound compound, WrapperLookup lookup) { + super.toNBT(compound, lookup); compound.putBoolean("isFlying", isFlyingSurvival); compound.putBoolean("isCancelled", isCancelled); compound.putBoolean("isFlyingEither", isFlyingEither); @@ -882,8 +885,8 @@ public class PlayerPhysics extends EntityPhysics implements Tickab } @Override - public void fromNBT(NbtCompound compound) { - super.fromNBT(compound); + public void fromNBT(NbtCompound compound, WrapperLookup lookup) { + super.fromNBT(compound, lookup); isFlyingSurvival = compound.getBoolean("isFlying"); isCancelled = compound.getBoolean("isCancelled"); isFlyingEither = compound.getBoolean("isFlyingEither"); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index ca4aa870..1b82f453 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -42,6 +42,8 @@ import com.google.common.collect.Streams; import com.minelittlepony.common.util.animation.Interpolator; import com.mojang.authlib.GameProfile; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.PotionContentsComponent; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.*; @@ -55,8 +57,8 @@ import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.particle.ParticleTypes; -import net.minecraft.potion.PotionUtil; -import net.minecraft.potion.Potions; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.tag.DamageTypeTags; import net.minecraft.registry.tag.FluidTags; import net.minecraft.server.network.ServerPlayerEntity; @@ -650,13 +652,13 @@ public class Pony extends Living implements Copyable, Update return false; } - public int getImplicitEnchantmentLevel(Enchantment enchantment, int initial) { + public int getImplicitEnchantmentLevel(RegistryEntry enchantment, int initial) { if ((enchantment == Enchantments.AQUA_AFFINITY || enchantment == Enchantments.DEPTH_STRIDER || enchantment == Enchantments.LUCK_OF_THE_SEA || enchantment == Enchantments.LURE) && getCompositeRace().includes(Race.SEAPONY)) { - return MathHelper.clamp(initial + 3, enchantment.getMinLevel(), enchantment.getMaxLevel()); + return MathHelper.clamp(initial + 3, enchantment.value().getMinLevel(), enchantment.value().getMaxLevel()); } return initial; @@ -742,7 +744,7 @@ public class Pony extends Living implements Copyable, Update } if (getObservedSpecies() == Race.KIRIN - && (stack.isIn(UTags.Items.COOLS_OFF_KIRINS) || PotionUtil.getPotion(stack) == Potions.WATER)) { + && (stack.isIn(UTags.Items.COOLS_OFF_KIRINS) || stack.get(DataComponentTypes.POTION_CONTENTS) == PotionContentsComponent.DEFAULT)) { getMagicalReserves().getCharge().multiply(0.5F); getSpellSlot().get(SpellType.RAGE).ifPresent(RageAbilitySpell::setExtenguishing); } @@ -824,34 +826,34 @@ public class Pony extends Living implements Copyable, Update } @Override - public void toNBT(NbtCompound compound) { - compound.put("mana", mana.toNBT()); + public void toNBT(NbtCompound compound, WrapperLookup lookup) { + compound.put("mana", mana.toNBT(lookup)); compound.putInt("levels", levels.get()); compound.putInt("corruption", corruption.get()); - super.toNBT(compound); + super.toNBT(compound, lookup); } @Override - public void fromNBT(NbtCompound compound) { + public void fromNBT(NbtCompound compound, WrapperLookup lookup) { levels.set(compound.getInt("levels")); corruption.set(compound.getInt("corruption")); - mana.fromNBT(compound.getCompound("mana")); - super.fromNBT(compound); + mana.fromNBT(compound.getCompound("mana"), lookup); + super.fromNBT(compound, lookup); } @Override - public void toSyncronisedNbt(NbtCompound compound) { - super.toSyncronisedNbt(compound); + public void toSyncronisedNbt(NbtCompound compound, WrapperLookup lookup) { + super.toSyncronisedNbt(compound, lookup); compound.putString("playerSpecies", Race.REGISTRY.getId(getSpecies()).toString()); compound.putString("suppressedSpecies", Race.REGISTRY.getId(getSuppressedRace()).toString()); compound.putFloat("magicExhaustion", magicExhaustion); compound.putInt("ticksInSun", ticksInSun); compound.putBoolean("hasShades", hasShades); - compound.put("acrobatics", acrobatics.toNBT()); - compound.put("powers", powers.toNBT()); - compound.put("gravity", gravity.toNBT()); - compound.put("charms", charms.toNBT()); - compound.put("discoveries", discoveries.toNBT()); + compound.put("acrobatics", acrobatics.toNBT(lookup)); + compound.put("powers", powers.toNBT(lookup)); + compound.put("gravity", gravity.toNBT(lookup)); + compound.put("charms", charms.toNBT(lookup)); + compound.put("discoveries", discoveries.toNBT(lookup)); compound.putInt("ticksInvulnerable", ticksInvulnerable); compound.putInt("ticksMetamorphising", ticksMetamorphising); NbtCompound progress = new NbtCompound(); @@ -862,15 +864,15 @@ public class Pony extends Living implements Copyable, Update } @Override - public void fromSynchronizedNbt(NbtCompound compound) { - super.fromSynchronizedNbt(compound); + public void fromSynchronizedNbt(NbtCompound compound, WrapperLookup lookup) { + super.fromSynchronizedNbt(compound, lookup); setSpecies(Race.fromName(compound.getString("playerSpecies"), Race.HUMAN)); setSuppressedRace(Race.fromName(compound.getString("suppressedSpecies"), Race.UNSET)); - powers.fromNBT(compound.getCompound("powers")); - gravity.fromNBT(compound.getCompound("gravity")); - charms.fromNBT(compound.getCompound("charms")); - discoveries.fromNBT(compound.getCompound("discoveries")); - acrobatics.fromNBT(compound.getCompound("acrobatics")); + powers.fromNBT(compound.getCompound("powers"), lookup); + gravity.fromNBT(compound.getCompound("gravity"), lookup); + charms.fromNBT(compound.getCompound("charms"), lookup); + discoveries.fromNBT(compound.getCompound("discoveries"), lookup); + acrobatics.fromNBT(compound.getCompound("acrobatics"), lookup); magicExhaustion = compound.getFloat("magicExhaustion"); ticksInvulnerable = compound.getInt("ticksInvulnerable"); ticksInSun = compound.getInt("ticksInSun"); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/dummy/DummyClientPlayerEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/player/dummy/DummyClientPlayerEntity.java index 4d563e6a..4fdb7773 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/dummy/DummyClientPlayerEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/dummy/DummyClientPlayerEntity.java @@ -14,11 +14,11 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.network.PlayerListEntry; -import net.minecraft.client.render.entity.PlayerModelPart; import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.Entity; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerModelPart; import net.minecraft.item.ItemStack; import net.minecraft.world.GameMode; diff --git a/src/main/java/com/minelittlepony/unicopia/item/AlicornAmuletItem.java b/src/main/java/com/minelittlepony/unicopia/item/AlicornAmuletItem.java index 6cb64651..403f31c9 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/AlicornAmuletItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/AlicornAmuletItem.java @@ -8,6 +8,7 @@ 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; import com.minelittlepony.unicopia.block.UBlocks; import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate; import com.minelittlepony.unicopia.entity.*; @@ -28,9 +29,10 @@ import it.unimi.dsi.fastutil.objects.Object2FloatMaps; import it.unimi.dsi.fastutil.objects.Object2FloatOpenHashMap; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.item.TooltipContext; +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.*; @@ -41,10 +43,14 @@ import net.minecraft.entity.decoration.ItemFrameEntity; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +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; import net.minecraft.sound.SoundCategory; @@ -58,8 +64,8 @@ import net.minecraft.world.World; import net.minecraft.world.World.ExplosionSourceType; public class AlicornAmuletItem extends AmuletItem implements ItemTracker.Trackable, ItemImpl.ClingyItem, ItemImpl.GroundTickCallback { - private static final UUID EFFECT_UUID = UUID.fromString("c0a870f5-99ef-4716-a23e-f320ee834b26"); - private static final Object2FloatMap EFFECT_SCALES = Object2FloatMaps.unmodifiable(new Object2FloatOpenHashMap<>(Map.of( + 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, EntityAttributes.GENERIC_ATTACK_KNOCKBACK, 0.05F, EntityAttributes.GENERIC_ATTACK_SPEED, 0.2F, @@ -67,16 +73,16 @@ public class AlicornAmuletItem extends AmuletItem implements ItemTracker.Trackab EntityAttributes.GENERIC_ARMOR, 0.01F ))); private static final Float2ObjectFunction EFFECT_FACTORY = v -> { - return new EntityAttributeModifier(EFFECT_UUID, "Alicorn Amulet Modifier", v, EntityAttributeModifier.Operation.ADDITION); + return new EntityAttributeModifier(EFFECT_ID, v, EntityAttributeModifier.Operation.ADD_VALUE); }; - public AlicornAmuletItem(FabricItemSettings settings) { - super(settings, 0, ImmutableMultimap.of()); + public AlicornAmuletItem(Item.Settings settings) { + super(settings, 0); } @Environment(EnvType.CLIENT) @Override - public void appendTooltip(ItemStack stack, @Nullable World world, List tooltip, TooltipContext tooltipContext) { + public void appendTooltip(ItemStack stack, TooltipContext context, List tooltip, TooltipType type) { Pony iplayer = Pony.of(MinecraftClient.getInstance().player); if (iplayer != null) { @@ -177,7 +183,7 @@ public class AlicornAmuletItem extends AmuletItem implements ItemTracker.Trackab public static void updateAttributes(Living wearer, float effectScale) { EFFECT_SCALES.object2FloatEntrySet().forEach(entry -> { - wearer.updateAttributeModifier(EFFECT_UUID, entry.getKey(), entry.getFloatValue() * effectScale, EFFECT_FACTORY, false); + wearer.updateAttributeModifier(EFFECT_ID, entry.getKey(), entry.getFloatValue() * effectScale, EFFECT_FACTORY, false); }); } @@ -248,10 +254,10 @@ public class AlicornAmuletItem extends AmuletItem implements ItemTracker.Trackab // bind to the player after 3 days if (daysAttached >= 3 && !pony.asEntity().isCreative()) { stack = living.getArmour().getEquippedStack(TrinketsDelegate.NECKLACE).stack(); - if (stack.getItem() == this && !EnchantmentHelper.hasBindingCurse(stack)) { + if (stack.getItem() == this && !EnchantmentHelper.hasAnyEnchantmentsWith(stack, EnchantmentEffectComponentTypes.PREVENT_ARMOR_CHANGE)) { pony.playSound(USounds.ITEM_ALICORN_AMULET_HALLUCINATION, 3, 1); stack = stack.copy(); - stack.addEnchantment(Enchantments.BINDING_CURSE, 1); + stack.addEnchantment(pony.entryFor(Enchantments.BINDING_CURSE), 1); pony.getArmour().equipStack(TrinketsDelegate.NECKLACE, stack); } } @@ -330,14 +336,16 @@ public class AlicornAmuletItem extends AmuletItem implements ItemTracker.Trackab if ((entity.age / 1000) % 10 == 0 && entity.age % 50 == 0) { for (Entity target : VecHelper.findInRange(entity, entity.getWorld(), entity.getPos(), 10, EntityPredicates.EXCEPT_CREATIVE_OR_SPECTATOR)) { - for (ItemStack equipment : target.getItemsEquipped()) { - if (equipment.getItem() == UItems.GROGARS_BELL) { - ChargeableItem chargeable = (ChargeableItem)UItems.GROGARS_BELL; - if (chargeable.hasCharge(equipment)) { - ChargeableItem.consumeEnergy(equipment, 3); - ParticleUtils.spawnParticle(entity.getWorld(), - new FollowingParticleEffect(UParticles.HEALTH_DRAIN, entity, 0.4F) - .withChild(ParticleTypes.COMPOSTER), target.getEyePos(), Vec3d.ZERO); + 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); + 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 a434863f..38e0aa45 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java @@ -2,49 +2,42 @@ package com.minelittlepony.unicopia.item; import java.util.List; import java.util.Optional; -import java.util.UUID; - -import org.jetbrains.annotations.Nullable; - -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; +import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate; -import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.item.TooltipContext; +import net.minecraft.component.type.AttributeModifiersComponent; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttribute; -import net.minecraft.entity.attribute.EntityAttributeModifier; import net.minecraft.item.ArmorMaterials; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.tooltip.TooltipType; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.sound.SoundEvent; import net.minecraft.text.MutableText; import net.minecraft.text.StringVisitable; import net.minecraft.text.Style; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import net.minecraft.world.World; +import net.minecraft.util.Identifier; public class AmuletItem extends WearableItem implements ChargeableItem { + public static final Identifier AMULET_MODIFIERS_ID = Unicopia.id("amulet_modifiers"); private final int maxEnergy; - private final ImmutableMultimap modifiers; - - public AmuletItem(FabricItemSettings settings, int maxEnergy) { - this(settings, maxEnergy, ImmutableMultimap.of()); - } - - public AmuletItem(FabricItemSettings settings, int maxEnergy, ImmutableMultimap modifiers) { + public AmuletItem(Item.Settings settings, int maxEnergy) { super(settings); this.maxEnergy = maxEnergy; - this.modifiers = modifiers; + } + + public AmuletItem(Item.Settings settings, int maxEnergy, AttributeModifiersComponent modifiers) { + this(settings.attributeModifiers(modifiers), maxEnergy); } @Override - public void appendTooltip(ItemStack stack, @Nullable World world, List list, TooltipContext tooltipContext) { + public void appendTooltip(ItemStack stack, TooltipContext context, List list, TooltipType type) { for (StringVisitable line : MinecraftClient.getInstance().textRenderer.getTextHandler().wrapLines( Text.translatable(getTranslationKey(stack) + ".lore"), 150, Style.EMPTY)) { @@ -62,8 +55,8 @@ public class AmuletItem extends WearableItem implements ChargeableItem { } @Override - public SoundEvent getEquipSound() { - return ArmorMaterials.IRON.getEquipSound(); + public RegistryEntry getEquipSound() { + return ArmorMaterials.IRON.value().equipSound(); } @Override @@ -76,11 +69,6 @@ public class AmuletItem extends WearableItem implements ChargeableItem { return !isChargable() || stack.hasEnchantments() || ChargeableItem.getEnergy(stack) > 0; } - @Override - public Multimap getAttributeModifiers(EquipmentSlot slot) { - return slot == EquipmentSlot.CHEST ? modifiers : ImmutableMultimap.of(); - } - public boolean isApplicable(ItemStack stack) { return stack.getItem() == this && (!isChargable() || ChargeableItem.getEnergy(stack) > 0); } @@ -105,19 +93,4 @@ public class AmuletItem extends WearableItem implements ChargeableItem { .findFirst() .orElse(TrinketsDelegate.EquippedStack.EMPTY); } - - public static class ModifiersBuilder { - private static final UUID SLOT_UUID = UUID.fromString("9F3D476D-C118-4544-8365-64846904B48E"); - - private final ImmutableMultimap.Builder modifiers = new ImmutableMultimap.Builder<>(); - - public ModifiersBuilder add(EntityAttribute attribute, double amount) { - modifiers.put(attribute, new EntityAttributeModifier(SLOT_UUID, "Armor modifier", amount, EntityAttributeModifier.Operation.ADDITION)); - return this; - } - - public ImmutableMultimap build() { - return modifiers.build(); - } - } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/AppleItem.java b/src/main/java/com/minelittlepony/unicopia/item/AppleItem.java index e49b3eed..91630997 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/AppleItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/AppleItem.java @@ -47,7 +47,7 @@ public class AppleItem { float bob = MathHelper.sin(((float)item.getAge() + 1) / 10F + entity.uniqueOffset) * 0.1F + 0.1F; for (int i = 0; i < 3; i++) { - entity.getWorld().addParticle(ParticleTypes.AMBIENT_ENTITY_EFFECT, entity.getX(), entity.getY() + bob, entity.getZ(), + entity.getWorld().addParticle(ParticleTypes.EFFECT, entity.getX(), entity.getY() + bob, entity.getZ(), entity.getWorld().random.nextGaussian() - 0.5F, entity.getWorld().random.nextGaussian() - 0.5F, entity.getWorld().random.nextGaussian() - 0.5F); diff --git a/src/main/java/com/minelittlepony/unicopia/item/BaitedFishingRodItem.java b/src/main/java/com/minelittlepony/unicopia/item/BaitedFishingRodItem.java index 3efa7744..78c15574 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/BaitedFishingRodItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/BaitedFishingRodItem.java @@ -6,6 +6,7 @@ import net.minecraft.entity.projectile.FishingBobberEntity; import net.minecraft.item.FishingRodItem; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; import net.minecraft.world.World; @@ -23,16 +24,13 @@ public class BaitedFishingRodItem extends FishingRodItem { if (user.fishHook != null) { user.fishHook.discard(); ItemStack stack = user.getStackInHand(hand); - int lure = (EnchantmentHelper.getLure(stack) + 1) * 2; - int luck = (EnchantmentHelper.getLuckOfTheSea(stack) + 1) * 2; + int lure = (int)((EnchantmentHelper.getFishingTimeReduction((ServerWorld)world, stack, user) + 1) * 20F); + int luck = (EnchantmentHelper.getFishingLuckBonus((ServerWorld)world, stack, user) + 1) * 2; world.spawnEntity(new FishingBobberEntity(user, world, luck, lure)); } if (result.getValue().isOf(this)) { - ItemStack stack = Items.FISHING_ROD.getDefaultStack(); - if (result.getValue().hasNbt()) { - stack.setNbt(result.getValue().getNbt().copy()); - } + ItemStack stack = result.getValue().withItem(Items.FISHING_ROD); return TypedActionResult.success(stack, world.isClient()); } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/BedsheetsItem.java b/src/main/java/com/minelittlepony/unicopia/item/BedsheetsItem.java index 32ecc6c4..a9a9a58b 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/BedsheetsItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/BedsheetsItem.java @@ -42,7 +42,7 @@ public class BedsheetsItem extends Item { FancyBedBlock.setBedPattern(world, context.getBlockPos(), pattern); context.getStack().decrement(1); PlayerEntity player = context.getPlayer(); - world.playSound(player, pos, SoundEvents.ITEM_ARMOR_EQUIP_GENERIC, SoundCategory.BLOCKS, 1, 1); + world.playSound(player, pos, SoundEvents.ITEM_ARMOR_EQUIP_GENERIC.value(), SoundCategory.BLOCKS, 1, 1); return ActionResult.success(world.isClient); } diff --git a/src/main/java/com/minelittlepony/unicopia/item/BellItem.java b/src/main/java/com/minelittlepony/unicopia/item/BellItem.java index 2b5f4d99..3bba2094 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/BellItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/BellItem.java @@ -1,8 +1,6 @@ package com.minelittlepony.unicopia.item; import java.util.List; -import org.jetbrains.annotations.Nullable; - import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.entity.Creature; @@ -15,7 +13,6 @@ import com.minelittlepony.unicopia.particle.UParticles; import com.minelittlepony.unicopia.util.VecHelper; import com.minelittlepony.unicopia.util.shape.Sphere; -import net.minecraft.client.item.TooltipContext; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.mob.CreeperEntity; import net.minecraft.entity.mob.IllagerEntity; @@ -23,6 +20,7 @@ import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.particle.ParticleEffect; import net.minecraft.particle.ParticleTypes; import net.minecraft.text.Text; @@ -44,12 +42,12 @@ public class BellItem extends Item implements ChargeableItem { } @Override - public void appendTooltip(ItemStack stack, @Nullable World world, List list, TooltipContext tooltipContext) { + public void appendTooltip(ItemStack stack, TooltipContext context, List list, TooltipType type) { list.add(Text.translatable(getTranslationKey() + ".charges", (int)Math.floor(ChargeableItem.getEnergy(stack)), getMaxCharge())); } @Override - public int getMaxUseTime(ItemStack stack) { + public int getMaxUseTime(ItemStack stack, LivingEntity user) { return 3000; } @@ -109,7 +107,7 @@ public class BellItem extends Item implements ChargeableItem { Living.getOrEmpty(userEntity).ifPresent(user -> { user.getTarget().ifPresent(living -> { - float maxUseTime = getMaxUseTime(stack); + float maxUseTime = getMaxUseTime(stack, userEntity); float progress = (maxUseTime - remainingUseTicks) / maxUseTime; if (tickDraining(user, living, stack, progress)) { diff --git a/src/main/java/com/minelittlepony/unicopia/item/ButterflyItem.java b/src/main/java/com/minelittlepony/unicopia/item/ButterflyItem.java index 374838a6..e1e53620 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/ButterflyItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/ButterflyItem.java @@ -2,21 +2,15 @@ package com.minelittlepony.unicopia.item; import java.util.Arrays; import java.util.List; -import java.util.Locale; - -import org.jetbrains.annotations.Nullable; - import com.minelittlepony.unicopia.entity.mob.ButterflyEntity; +import com.minelittlepony.unicopia.item.component.UDataComponentTypes; import com.minelittlepony.unicopia.item.group.MultiItem; -import net.minecraft.client.item.TooltipContext; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import net.minecraft.world.World; public class ButterflyItem extends Item implements MultiItem { @@ -30,22 +24,17 @@ public class ButterflyItem extends Item implements MultiItem { } @Override - public void appendTooltip(ItemStack stack, @Nullable World world, List tooltip, TooltipContext context) { + public void appendTooltip(ItemStack stack, TooltipContext context, List tooltip, TooltipType type) { tooltip.add(Text.literal(getVariant(stack).name()).formatted(Formatting.LIGHT_PURPLE)); } public static ButterflyEntity.Variant getVariant(ItemStack stack) { - NbtCompound nbt = stack.getNbt(); - if (nbt == null || !nbt.contains("variant", NbtElement.STRING_TYPE)) { - return ButterflyEntity.Variant.BUTTERFLY; - } - String variant = nbt.getString("variant"); - return ButterflyEntity.Variant.byName(variant); + return stack.getOrDefault(UDataComponentTypes.BUTTERFLY_VARIANT, ButterflyEntity.Variant.BUTTERFLY); } public static ItemStack setVariant(ItemStack stack, ButterflyEntity.Variant variant) { if (stack.isOf(UItems.BUTTERFLY)) { - stack.getOrCreateNbt().putString("variant", variant.name().toLowerCase(Locale.ROOT)); + stack.set(UDataComponentTypes.BUTTERFLY_VARIANT, variant); } return stack; } diff --git a/src/main/java/com/minelittlepony/unicopia/item/CrystalHeartItem.java b/src/main/java/com/minelittlepony/unicopia/item/CrystalHeartItem.java index c334124f..530f02fe 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/CrystalHeartItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/CrystalHeartItem.java @@ -52,13 +52,7 @@ public class CrystalHeartItem extends Item implements FloatingArtefactEntity.Art private static ItemStack fill(ItemStack stack) { Item item = ITEM_MAP.get().getOrDefault(stack.getItem(), stack.getItem()); - if (item == stack.getItem()) { - return stack; - } - ItemStack newStack = item.getDefaultStack(); - newStack.setNbt(stack.getNbt()); - newStack.setCount(stack.getCount()); - return newStack; + return item == stack.getItem() ? stack : stack.withItem(item); } public CrystalHeartItem(Settings settings) { diff --git a/src/main/java/com/minelittlepony/unicopia/item/CuringJokeItem.java b/src/main/java/com/minelittlepony/unicopia/item/CuringJokeItem.java index cbd12b9a..29635b1b 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/CuringJokeItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/CuringJokeItem.java @@ -75,7 +75,7 @@ public class CuringJokeItem extends BlockItem { static boolean removeEffect(LivingEntity user) { return user.getStatusEffects().stream().filter(effect -> { - return !effect.getEffectType().isBeneficial(); + return !effect.getEffectType().value().isBeneficial(); }).findAny().filter(effect -> { user.removeStatusEffect(effect.getEffectType()); return true; @@ -114,6 +114,6 @@ public class CuringJokeItem extends BlockItem { return InventoryUtil.stream(owner.getInventory()); } - return StreamSupport.stream(entity.getItemsEquipped().spliterator(), false); + return StreamSupport.stream(entity.getEquippedItems().spliterator(), false); } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/DragonBreathScrollItem.java b/src/main/java/com/minelittlepony/unicopia/item/DragonBreathScrollItem.java index 1223e5a7..09d62168 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/DragonBreathScrollItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/DragonBreathScrollItem.java @@ -1,12 +1,11 @@ package com.minelittlepony.unicopia.item; -import java.util.UUID; - import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.advancement.UCriteria; import com.minelittlepony.unicopia.server.world.DragonBreathStore; import com.minelittlepony.unicopia.server.world.UnicopiaWorldProperties; +import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -27,13 +26,13 @@ public class DragonBreathScrollItem extends Item { ItemStack stack = player.getStackInHand(hand); ItemStack payload = player.getStackInHand(hand == Hand.MAIN_HAND ? Hand.OFF_HAND : Hand.MAIN_HAND); - if (payload.isEmpty() || !stack.hasCustomName()) { + if (payload.isEmpty() || !stack.contains(DataComponentTypes.CUSTOM_NAME)) { return TypedActionResult.fail(stack); } stack.split(1); if (!world.isClient) { - String recipient = stack.getName().getString(); + String recipient = stack.get(DataComponentTypes.CUSTOM_NAME).getString(); UCriteria.SEND_DRAGON_BREATH.triggerSent(player, payload, recipient, (counterName, count) -> { if (count == 1 && "dings_on_celestias_head".equals(counterName)) { UnicopiaWorldProperties properties = UnicopiaWorldProperties.forWorld((ServerWorld)world); @@ -46,9 +45,4 @@ public class DragonBreathScrollItem extends Item { player.playSound(USounds.ITEM_DRAGON_BREATH_SCROLL_USE, 1, 1); return TypedActionResult.consume(stack); } - - public static ItemStack setRecipient(ItemStack stack, UUID recipient) { - stack.getOrCreateSubNbt("recipient").putUuid("id", recipient); - return stack; - } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/GlowableItem.java b/src/main/java/com/minelittlepony/unicopia/item/GlowableItem.java index 2e3c8f94..753e22c6 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/GlowableItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/GlowableItem.java @@ -1,15 +1,16 @@ package com.minelittlepony.unicopia.item; +import com.minelittlepony.unicopia.item.component.UDataComponentTypes; + import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; public interface GlowableItem { - default boolean isGlowing(ItemStack stack) { - NbtCompound tag = stack.getSubNbt("display"); - return tag != null && tag.getBoolean("glowing"); + static boolean isGlowing(ItemStack stack) { + Boolean glowing = stack.get(UDataComponentTypes.GLOWING); + return glowing != null && glowing; } - default void setGlowing(ItemStack stack, boolean glowing) { - stack.getOrCreateSubNbt("display").putBoolean("glowing", glowing); + static void setGlowing(ItemStack stack, boolean glowing) { + stack.set(UDataComponentTypes.GLOWING, glowing); } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/HorseShoeItem.java b/src/main/java/com/minelittlepony/unicopia/item/HorseShoeItem.java index fe800e86..c87080a9 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/HorseShoeItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/HorseShoeItem.java @@ -4,8 +4,6 @@ import java.util.List; import org.jetbrains.annotations.Nullable; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; import com.minelittlepony.unicopia.InteractionManager; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.USounds; @@ -14,12 +12,13 @@ import com.minelittlepony.unicopia.entity.mob.UEntityAttributes; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.projectile.PhysicsBodyProjectileEntity; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.component.type.AttributeModifierSlot; +import net.minecraft.component.type.AttributeModifiersComponent; import net.minecraft.entity.attribute.EntityAttributeModifier; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.sound.SoundEvent; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -30,16 +29,14 @@ public class HorseShoeItem extends HeavyProjectileItem { private final float projectileInnacuracy; private final float baseProjectileSpeed; - private final Multimap attributeModifiers; - - public HorseShoeItem(Settings settings, float projectileDamage, float projectileInnacuracy, float baseProjectileSpeed) { - super(settings, projectileDamage); + public HorseShoeItem(Item.Settings settings, float projectileDamage, float projectileInnacuracy, float baseProjectileSpeed) { + super(settings.attributeModifiers(AttributeModifiersComponent.builder().add( + UEntityAttributes.EXTENDED_ATTACK_DISTANCE, + new EntityAttributeModifier(PolearmItem.ATTACK_RANGE_MODIFIER_ID, -3F, EntityAttributeModifier.Operation.ADD_VALUE), + AttributeModifierSlot.MAINHAND + ).build()), projectileDamage); this.projectileInnacuracy = projectileInnacuracy; this.baseProjectileSpeed = baseProjectileSpeed; - - ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); - builder.put(UEntityAttributes.EXTENDED_ATTACK_DISTANCE, new EntityAttributeModifier(PolearmItem.ATTACK_RANGE_MODIFIER_ID, "Weapon modifier", -3F, EntityAttributeModifier.Operation.ADDITION)); - attributeModifiers = builder.build(); } @Override @@ -48,7 +45,7 @@ public class HorseShoeItem extends HeavyProjectileItem { } @Override - public void appendTooltip(ItemStack stack, @Nullable World world, List tooltip, TooltipContext context) { + public void appendTooltip(ItemStack stack, TooltipContext context, List tooltip, TooltipType type) { float degradation = (stack.getDamage() / (float)stack.getMaxDamage()); float inaccuracy = projectileInnacuracy + degradation * 30; tooltip.add(Text.empty()); @@ -97,15 +94,6 @@ public class HorseShoeItem extends HeavyProjectileItem { @Override public SoundEvent getThrowSound(ItemStack stack) { - return USounds.Vanilla.ITEM_TRIDENT_THROW; + return USounds.Vanilla.ITEM_TRIDENT_THROW.value(); } - - @Override - public Multimap getAttributeModifiers(EquipmentSlot slot) { - if (slot == EquipmentSlot.MAINHAND) { - return attributeModifiers; - } - return super.getAttributeModifiers(slot); - } - } diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemDuck.java b/src/main/java/com/minelittlepony/unicopia/item/ItemDuck.java index ee280da5..a0b6380d 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/ItemDuck.java +++ b/src/main/java/com/minelittlepony/unicopia/item/ItemDuck.java @@ -2,14 +2,22 @@ package com.minelittlepony.unicopia.item; import java.util.Optional; +import com.minelittlepony.unicopia.diet.DietView; import com.minelittlepony.unicopia.entity.ItemImpl; + +import net.minecraft.component.type.FoodComponent; import net.minecraft.item.*; -public interface ItemDuck extends ItemConvertible, ItemImpl.TickableItem { +public interface ItemDuck extends ItemConvertible, ItemImpl.TickableItem, DietView.Holder { + @Deprecated void setFoodComponent(FoodComponent food); + // TODO: Inject into Item.Settings::getComponents and return our own implementation of ComponentMap to handle food component overrides + // ItemStack(ComponentMapImpl(UnicopiaComponentMap(ItemComponentMap()), Changes)) + @Deprecated Optional getOriginalFoodComponent(); + @Deprecated default void resetFoodComponent() { setFoodComponent(getOriginalFoodComponent().orElse(null)); } diff --git a/src/main/java/com/minelittlepony/unicopia/item/PolearmItem.java b/src/main/java/com/minelittlepony/unicopia/item/PolearmItem.java index 85517dc5..9566394f 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/PolearmItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/PolearmItem.java @@ -1,64 +1,43 @@ package com.minelittlepony.unicopia.item; -import java.util.UUID; - -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; +import java.util.List; import com.minelittlepony.unicopia.UTags; +import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.mob.UEntityAttributes; -import com.minelittlepony.unicopia.item.enchantment.CustomEnchantableItem; - import net.minecraft.block.*; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.Enchantments; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.AttributeModifierSlot; +import net.minecraft.component.type.ToolComponent; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.attribute.*; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.*; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; -public class PolearmItem extends SwordItem implements CustomEnchantableItem { - static final UUID ATTACK_RANGE_MODIFIER_ID = UUID.fromString("A7B3659C-AA74-469C-963A-09A391DCAA0F"); - - private final Multimap attributeModifiers; - - private final int attackRange; +public class PolearmItem extends ToolItem { + static final Identifier ATTACK_RANGE_MODIFIER_ID = Unicopia.id("attack_reach_modifier"); public PolearmItem(ToolMaterial material, int damage, float speed, int range, Settings settings) { - super(material, damage, speed, settings); - this.attackRange = range; - ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); - builder.putAll(super.getAttributeModifiers(EquipmentSlot.MAINHAND)); - builder.put(UEntityAttributes.EXTENDED_REACH_DISTANCE, new EntityAttributeModifier(ATTACK_RANGE_MODIFIER_ID, "Weapon modifier", attackRange, EntityAttributeModifier.Operation.ADDITION)); - builder.put(UEntityAttributes.EXTENDED_ATTACK_DISTANCE, new EntityAttributeModifier(ATTACK_RANGE_MODIFIER_ID, "Weapon modifier", attackRange, EntityAttributeModifier.Operation.ADDITION)); - attributeModifiers = builder.build(); + super(material, settings.attributeModifiers(SwordItem.createAttributeModifiers(material, damage, speed).with( + UEntityAttributes.EXTENDED_REACH_DISTANCE, new EntityAttributeModifier(ATTACK_RANGE_MODIFIER_ID, range, EntityAttributeModifier.Operation.ADD_VALUE), AttributeModifierSlot.MAINHAND + ).with( + UEntityAttributes.EXTENDED_ATTACK_DISTANCE, new EntityAttributeModifier(ATTACK_RANGE_MODIFIER_ID, range, EntityAttributeModifier.Operation.ADD_VALUE), AttributeModifierSlot.MAINHAND + )).component(DataComponentTypes.TOOL, createToolComponent())); } - @Override - public float getMiningSpeedMultiplier(ItemStack stack, BlockState state) { - if (state.isOf(Blocks.COBWEB)) { - return 1; - } - return super.getMiningSpeedMultiplier(stack, state); - } - - @Override - public boolean isSuitableFor(BlockState state) { - return state.isIn(UTags.Blocks.POLEARM_MINEABLE); - } - - @Override - public Multimap getAttributeModifiers(EquipmentSlot slot) { - if (slot == EquipmentSlot.MAINHAND) { - return attributeModifiers; - } - return super.getAttributeModifiers(slot); + private static ToolComponent createToolComponent() { + return new ToolComponent( + List.of(ToolComponent.Rule.ofAlwaysDropping(List.of(Blocks.COBWEB), 15.0F), ToolComponent.Rule.of(UTags.Blocks.POLEARM_MINEABLE, 1.5F)), 1.0F, 2 + ); } @Override public boolean postHit(ItemStack stack, LivingEntity target, LivingEntity attacker) { boolean tooNear = target.distanceTo(attacker) <= 2; - stack.damage(tooNear ? 4 : 1, attacker, e -> e.sendEquipmentBreakStatus(EquipmentSlot.MAINHAND)); target.takeKnockback(0.15, attacker.getX() - target.getX(), attacker.getZ() - target.getZ()); Living.updateVelocity(target); if (tooNear) { @@ -70,7 +49,13 @@ public class PolearmItem extends SwordItem implements CustomEnchantableItem { } @Override - public boolean isAcceptableEnchant(ItemStack stack, Enchantment enchantment) { - return enchantment != Enchantments.SWEEPING; + public boolean canMine(BlockState state, World world, BlockPos pos, PlayerEntity miner) { + return !miner.isCreative(); + } + + @Override + public void postDamageEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { + boolean tooNear = target.distanceTo(attacker) <= 2; + stack.damage(tooNear ? 4 : 1, attacker, EquipmentSlot.MAINHAND); } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/SpellbookItem.java b/src/main/java/com/minelittlepony/unicopia/item/SpellbookItem.java index a853ffa3..5f363946 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/SpellbookItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/SpellbookItem.java @@ -3,8 +3,10 @@ package com.minelittlepony.unicopia.item; import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.advancement.UCriteria; +import com.minelittlepony.unicopia.container.SpellbookState; import com.minelittlepony.unicopia.entity.mob.SpellbookEntity; import com.minelittlepony.unicopia.entity.mob.UEntities; +import com.minelittlepony.unicopia.item.component.UDataComponentTypes; import com.minelittlepony.unicopia.server.world.Altar; import com.minelittlepony.unicopia.util.Dispensable; @@ -14,7 +16,6 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BookItem; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsageContext; -import net.minecraft.nbt.NbtCompound; import net.minecraft.util.ActionResult; import net.minecraft.util.TypedActionResult; import net.minecraft.util.math.BlockPointer; @@ -77,9 +78,9 @@ public class SpellbookItem extends BookItem implements Dispensable { } @Nullable - NbtCompound tag = stack.getSubNbt("spellbookState"); - if (tag != null) { - book.getSpellbookState().fromNBT(tag); + SpellbookState state = stack.get(UDataComponentTypes.SPELLBOOK_STATE); + if (state != null) { + book.setSpellbookState(state); } world.spawnEntity(book); diff --git a/src/main/java/com/minelittlepony/unicopia/item/StaffItem.java b/src/main/java/com/minelittlepony/unicopia/item/StaffItem.java index cb567ce1..f392000f 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/StaffItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/StaffItem.java @@ -1,42 +1,56 @@ package com.minelittlepony.unicopia.item; import java.util.List; -import java.util.UUID; - -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; import com.minelittlepony.unicopia.USounds; +import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.entity.mob.UEntityAttributes; import net.minecraft.block.Blocks; -import net.minecraft.client.item.TooltipContext; +import net.minecraft.component.type.AttributeModifierSlot; +import net.minecraft.component.type.AttributeModifiersComponent; import net.minecraft.entity.EntityDimensions; -import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.attribute.EntityAttributeModifier; -import net.minecraft.entity.attribute.EntityAttributeModifier.Operation; import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.SwordItem; import net.minecraft.item.ToolMaterials; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.particle.BlockStateParticleEffect; import net.minecraft.particle.ParticleTypes; import net.minecraft.text.Text; import net.minecraft.util.ActionResult; import net.minecraft.util.Formatting; import net.minecraft.util.Hand; +import net.minecraft.util.Identifier; import net.minecraft.util.UseAction; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; public class StaffItem extends SwordItem { - protected static final UUID ATTACK_REACH_MODIFIER = UUID.fromString("FA235E1C-4280-A865-B01B-CBAE9985ACA3"); + protected static final Identifier ATTACK_REACH_MODIFIER_ID = Unicopia.id("attack_reach"); public StaffItem(Settings settings) { - super(ToolMaterials.WOOD, 2, 4, settings); + super(ToolMaterials.WOOD, settings.attributeModifiers(createAttributeModifiers(2, 3))); + } + + public static AttributeModifiersComponent createAttributeModifiers(int attackDamage, float attackReach) { + return AttributeModifiersComponent.builder() + .add( + EntityAttributes.GENERIC_ATTACK_DAMAGE, + new EntityAttributeModifier( + BASE_ATTACK_DAMAGE_MODIFIER_ID, (attackDamage), EntityAttributeModifier.Operation.ADD_VALUE + ), + AttributeModifierSlot.MAINHAND + ) + .add( + UEntityAttributes.EXTENDED_ATTACK_DISTANCE, + new EntityAttributeModifier(ATTACK_REACH_MODIFIER_ID, attackReach, EntityAttributeModifier.Operation.ADD_VALUE), + AttributeModifierSlot.MAINHAND + ) + .build(); } @Override @@ -47,9 +61,9 @@ public class StaffItem extends SwordItem { for (int i = 0; i < 130; i++) { w.addParticle(new BlockStateParticleEffect(ParticleTypes.BLOCK, Blocks.OAK_LOG.getDefaultState()), - target.getX() + (target.getWorld().random.nextFloat() - 0.5F) * (dims.width + 1), - (target.getY() + dims.height / 2) + (target.getWorld().random.nextFloat() - 0.5F) * dims.height, - target.getZ() + (target.getWorld().random.nextFloat() - 0.5F) * (dims.width + 1), + target.getX() + (target.getWorld().random.nextFloat() - 0.5F) * (dims.width() + 1), + (target.getY() + dims.height() / 2) + (target.getWorld().random.nextFloat() - 0.5F) * dims.height(), + target.getZ() + (target.getWorld().random.nextFloat() - 0.5F) * (dims.width() + 1), 0, 0, 0 ); } @@ -58,7 +72,7 @@ public class StaffItem extends SwordItem { } @Override - public void appendTooltip(ItemStack stack, World world, List tooltip, TooltipContext context) { + public void appendTooltip(ItemStack stack, TooltipContext context, List tooltip, TooltipType type) { tooltip.add(Text.translatable(getTranslationKey(stack) + ".lore").formatted(Formatting.GRAY)); } @@ -84,16 +98,4 @@ public class StaffItem extends SwordItem { public UseAction getUseAction(ItemStack stack) { return UseAction.BOW; } - - @Override - public Multimap getAttributeModifiers(EquipmentSlot slot) { - Multimap multimap = HashMultimap.create(); - - if (slot == EquipmentSlot.MAINHAND) { - multimap.put(EntityAttributes.GENERIC_ATTACK_DAMAGE, new EntityAttributeModifier(ATTACK_DAMAGE_MODIFIER_ID, "Weapon modifier", getAttackDamage(), Operation.ADDITION)); - multimap.put(UEntityAttributes.EXTENDED_ATTACK_DISTANCE, new EntityAttributeModifier(ATTACK_REACH_MODIFIER, "Weapon modifier", 3, Operation.ADDITION)); - } - - return multimap; - } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/StagedFoodItem.java b/src/main/java/com/minelittlepony/unicopia/item/StagedFoodItem.java index d3a7e102..7c173140 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/StagedFoodItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/StagedFoodItem.java @@ -1,10 +1,14 @@ package com.minelittlepony.unicopia.item; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.FoodComponent; +import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; +import net.minecraft.util.Hand; import net.minecraft.world.World; public class StagedFoodItem extends Item { @@ -18,16 +22,15 @@ public class StagedFoodItem extends Item { @Override public ItemStack finishUsing(ItemStack stack, World world, LivingEntity user) { - if (isFood()) { - user.eatFood(world, stack.copy()); + FoodComponent food = stack.get(DataComponentTypes.FOOD); + if (food != null) { + user.eatFood(world, stack.copy(), food); if (user instanceof PlayerEntity player && player.getAbilities().creativeMode) { return stack; } if (stack.isDamageable() && stack.getDamage() < stack.getMaxDamage() - 1) { - stack.damage(1, user, ply -> { - // noop - }); + stack.damage(1, user, stack == user.getStackInHand(Hand.MAIN_HAND) ? EquipmentSlot.MAINHAND : EquipmentSlot.OFFHAND); return stack; } return eatingRemainder.asItem().getDefaultStack(); diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItems.java b/src/main/java/com/minelittlepony/unicopia/item/UItems.java index 1c00a00a..3f157d55 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItems.java @@ -9,6 +9,7 @@ import com.minelittlepony.unicopia.block.cloud.CloudBedBlock; import com.minelittlepony.unicopia.entity.mob.AirBalloonEntity; import com.minelittlepony.unicopia.entity.mob.UEntities; import com.minelittlepony.unicopia.item.cloud.CloudBedItem; +import com.minelittlepony.unicopia.item.component.UDataComponentTypes; import com.minelittlepony.unicopia.item.enchantment.UEnchantments; import com.minelittlepony.unicopia.item.group.ItemGroupRegistry; import com.minelittlepony.unicopia.item.group.UItemGroups; @@ -283,6 +284,7 @@ public interface UItems { static void bootstrap() { AppleItem.registerTickCallback(Items.APPLE); + FuelRegistry.INSTANCE.add(WOODEN_POLEARM, 200); FuelRegistry.INSTANCE.add(MUG, 250); FuelRegistry.INSTANCE.add(DRAGON_BREATH_SCROLL, 20000); @@ -316,6 +318,7 @@ public interface UItems { CompostingChanceRegistry.INSTANCE.add(APPLE_PIE_SLICE, 0.1F); CompostingChanceRegistry.INSTANCE.add(BUTTERFLY, 0.1F); + UDataComponentTypes.bootstrap(); UEnchantments.bootstrap(); URecipes.bootstrap(); UItemGroups.bootstrap(); diff --git a/src/main/java/com/minelittlepony/unicopia/item/WearableItem.java b/src/main/java/com/minelittlepony/unicopia/item/WearableItem.java index dd12c7a7..9222cbf7 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/WearableItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/WearableItem.java @@ -2,7 +2,6 @@ package com.minelittlepony.unicopia.item; import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate; -import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.minecraft.block.DispenserBlock; import net.minecraft.block.dispenser.DispenserBehavior; import net.minecraft.block.dispenser.ItemDispenserBehavior; @@ -13,6 +12,7 @@ import net.minecraft.item.Equipment; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.predicate.entity.EntityPredicates; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.sound.SoundEvent; import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; @@ -21,17 +21,17 @@ import net.minecraft.world.World; public abstract class WearableItem extends Item implements Equipment { - public WearableItem(FabricItemSettings settings) { + public WearableItem(Item.Settings settings) { super(configureEquipmentSlotSupplier(settings)); DispenserBlock.registerBehavior(this, DISPENSER_BEHAVIOR); TrinketsDelegate.getInstance(null).registerTrinket(this); } - private static FabricItemSettings configureEquipmentSlotSupplier(FabricItemSettings settings) { + private static Item.Settings configureEquipmentSlotSupplier(Item.Settings settings) { if (TrinketsDelegate.hasTrinkets()) { return settings; } - return settings.equipmentSlot(s -> ((WearableItem)s.getItem()).getSlotType(s)); + return settings.equipmentSlot((e, s) -> ((WearableItem)s.getItem()).getSlotType(s)); } @Override @@ -45,8 +45,8 @@ public abstract class WearableItem extends Item implements Equipment { } @Override - public SoundEvent getEquipSound() { - return ArmorMaterials.LEATHER.getEquipSound(); + public RegistryEntry getEquipSound() { + return ArmorMaterials.LEATHER.value().equipSound(); } @Deprecated diff --git a/src/main/java/com/minelittlepony/unicopia/item/WeatherJarItem.java b/src/main/java/com/minelittlepony/unicopia/item/WeatherJarItem.java index 2708e6cf..401ffaa7 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/WeatherJarItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/WeatherJarItem.java @@ -15,6 +15,7 @@ import net.minecraft.entity.EntityType; import net.minecraft.entity.LightningEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.AliasedBlockItem; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundEvent; @@ -30,7 +31,7 @@ import net.minecraft.world.WorldEvents; public class WeatherJarItem extends AliasedBlockItem implements Projectile, ProjectileDelegate.HitListener { private final Type type; - public WeatherJarItem(Block block, Settings settings, Type type) { + public WeatherJarItem(Block block, Item.Settings settings, Type type) { super(block, settings); this.type = type; Projectile.makeDispensable(this); diff --git a/src/main/java/com/minelittlepony/unicopia/item/component/UDataComponentTypes.java b/src/main/java/com/minelittlepony/unicopia/item/component/UDataComponentTypes.java new file mode 100644 index 00000000..7f3b172f --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/component/UDataComponentTypes.java @@ -0,0 +1,27 @@ +package com.minelittlepony.unicopia.item.component; + +import java.util.function.UnaryOperator; + +import com.minelittlepony.unicopia.Unicopia; +import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; +import com.minelittlepony.unicopia.container.SpellbookState; +import com.minelittlepony.unicopia.entity.mob.ButterflyEntity; +import com.mojang.serialization.Codec; + +import net.minecraft.component.ComponentType; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; + +public interface UDataComponentTypes { + ComponentType SPELL_TRAITS = register("spell_traits", builder -> builder.codec(SpellTraits.CODEC).packetCodec(SpellTraits.PACKET_CODEC).cache()); + ComponentType SPELLBOOK_STATE = register("spellbook_state", builder -> builder.codec(SpellbookState.CODEC).packetCodec(SpellbookState.PACKET_CODEC).cache()); + ComponentType GLOWING = register("glowing", builder -> builder.codec(Codec.BOOL).packetCodec(PacketCodecs.BOOL)); + ComponentType BUTTERFLY_VARIANT = register("butterfly_variant", builder -> builder.codec(ButterflyEntity.Variant.CODEC).packetCodec(ButterflyEntity.Variant.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()); + } + + static void bootstrap() { } +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/enchantment/CustomEnchantableItem.java b/src/main/java/com/minelittlepony/unicopia/item/enchantment/CustomEnchantableItem.java index 5fbec700..9a4c6483 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/enchantment/CustomEnchantableItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/enchantment/CustomEnchantableItem.java @@ -2,7 +2,9 @@ package com.minelittlepony.unicopia.item.enchantment; import net.minecraft.enchantment.Enchantment; import net.minecraft.item.ItemStack; +import net.minecraft.registry.RegistryKey; +@Deprecated public interface CustomEnchantableItem { - boolean isAcceptableEnchant(ItemStack stack, Enchantment enchantment); + boolean isAcceptableEnchant(ItemStack stack, RegistryKey enchantment); } diff --git a/src/main/java/com/minelittlepony/unicopia/item/enchantment/EnchantmentUtil.java b/src/main/java/com/minelittlepony/unicopia/item/enchantment/EnchantmentUtil.java index f518d5d3..78748e06 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/enchantment/EnchantmentUtil.java +++ b/src/main/java/com/minelittlepony/unicopia/item/enchantment/EnchantmentUtil.java @@ -1,42 +1,37 @@ package com.minelittlepony.unicopia.item.enchantment; -import java.util.Map; - import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.entity.Living; +import net.minecraft.component.type.ItemEnchantmentsComponent; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.item.ItemStack; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.random.Random; public interface EnchantmentUtil { String HEART_BOUND_CONSUMED_FLAG = "unicopia:heart_bound_consumed"; - static boolean consumeEnchantment(Enchantment enchantment, int levels, ItemStack stack) { + static boolean consumeEnchantment(RegistryEntry enchantment, int levels, ItemStack stack) { return consumeEnchantment(enchantment, levels, stack, null, 0); } - static boolean consumeEnchantment(Enchantment enchantment, int levels, ItemStack stack, @Nullable Random random, int chance) { - Map enchantments = EnchantmentHelper.get(stack); - int level = enchantments.getOrDefault(enchantment, 0); + static boolean consumeEnchantment(RegistryEntry enchantment, int levels, ItemStack stack, @Nullable Random random, int chance) { + ItemEnchantmentsComponent.Builder enchantments = new ItemEnchantmentsComponent.Builder(EnchantmentHelper.getEnchantments(stack)); + int level = enchantments.getLevel(enchantment); if (level <= 0) { return false; } if (random == null || chance <= 1 || random.nextInt(chance) == 0) { - level = Math.max(0, level - levels); - if (level == 0) { - enchantments.remove(enchantment); - } else { - enchantments.put(enchantment, level); - } - EnchantmentHelper.set(enchantments, stack); + enchantments.set(enchantment, Math.max(0, level - levels)); + EnchantmentHelper.set(stack, enchantments.build()); } return true; } @@ -53,7 +48,7 @@ public interface EnchantmentUtil { return (int)MathHelper.clamp(baseline + luckAmplifier + dolphinsGraceAmplifier - unluckAmplifier - badOmenAmplifier, -10, 10); } - static int getEffectAmplifier(LivingEntity entity, StatusEffect effect) { + static int getEffectAmplifier(LivingEntity entity, RegistryEntry effect) { if (!entity.hasStatusEffect(effect)) { return 0; } diff --git a/src/main/java/com/minelittlepony/unicopia/item/enchantment/UEnchantments.java b/src/main/java/com/minelittlepony/unicopia/item/enchantment/UEnchantments.java index 69c5b108..016a856e 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/enchantment/UEnchantments.java +++ b/src/main/java/com/minelittlepony/unicopia/item/enchantment/UEnchantments.java @@ -18,8 +18,7 @@ import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.Registries; public interface UEnchantments { - - List REGISTRY = new ArrayList<>(); + List> REGISTRY = new ArrayList<>(); /** * Makes a sound when there are interesting blocks in your area. @@ -136,8 +135,9 @@ public interface UEnchantments { static void bootstrap() { } - static T register(String name, T enchantment) { - REGISTRY.add(enchantment); - return Registry.registerReference(Registries.ENCHANTMENT, Unicopia.id(name), enchantment); + static RegistryEntry register(String name, T enchantment) { + var entry = Registry.registerReference(Registries.ENCHANTMENT, Unicopia.id(name), enchantment); + REGISTRY.add(entry); + return entry; } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinBoatEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinBoatEntity.java index 55685652..d0b5f148 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinBoatEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinBoatEntity.java @@ -10,6 +10,7 @@ import com.minelittlepony.unicopia.particle.ParticleUtils; import net.minecraft.entity.Entity; import net.minecraft.entity.data.*; +import net.minecraft.entity.data.DataTracker.Builder; import net.minecraft.entity.vehicle.BoatEntity; import net.minecraft.fluid.Fluid; import net.minecraft.nbt.NbtCompound; @@ -53,8 +54,8 @@ abstract class MixinBoatEntity extends Entity implements LavaAffine { } @Inject(method = "initDataTracker", at = @At("HEAD")) - private void onInitDataTracker(CallbackInfo info) { - dataTracker.startTracking(IS_LAVA_BOAT, false); + private void onInitDataTracker(Builder builder, CallbackInfo info) { + builder.add(IS_LAVA_BOAT, false); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinEnchantment.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEnchantment.java index 5143711c..ae883d4b 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinEnchantment.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEnchantment.java @@ -1,21 +1,9 @@ package com.minelittlepony.unicopia.mixin; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import com.minelittlepony.unicopia.item.enchantment.CustomEnchantableItem; - import net.minecraft.enchantment.Enchantment; -import net.minecraft.item.ItemStack; @Mixin(Enchantment.class) abstract class MixinEnchantment { - @Inject(method = "isAcceptableItem", at = @At("HEAD"), cancellable = true) - private void onIsAcceptableItem(ItemStack stack, CallbackInfoReturnable info) { - if (stack.getItem() instanceof CustomEnchantableItem item && !item.isAcceptableEnchant(stack, (Enchantment)(Object)this)) { - info.setReturnValue(false); - } - } + } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinEnchantmentHelper.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEnchantmentHelper.java index 0dd1aacf..57447100 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinEnchantmentHelper.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEnchantmentHelper.java @@ -1,7 +1,5 @@ package com.minelittlepony.unicopia.mixin; -import java.util.List; - import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -11,14 +9,13 @@ import com.minelittlepony.unicopia.entity.player.Pony; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.EnchantmentLevelEntry; import net.minecraft.entity.LivingEntity; -import net.minecraft.item.ItemStack; +import net.minecraft.registry.entry.RegistryEntry; @Mixin(EnchantmentHelper.class) abstract class MixinEnchantmentHelper { @Inject(method = "getEquipmentLevel", at = @At("RETURN"), cancellable = true) - private static void getEquipmentLevel(Enchantment enchantment, LivingEntity entity, CallbackInfoReturnable info) { + private static void getEquipmentLevel(RegistryEntry enchantment, LivingEntity entity, CallbackInfoReturnable info) { Pony.of(entity).ifPresent(pony -> { int initial = info.getReturnValue(); int implicitLevel = pony.getImplicitEnchantmentLevel(enchantment, initial); @@ -27,9 +24,4 @@ abstract class MixinEnchantmentHelper { } }); } - - @Inject(method = "getPossibleEntries", at = @At("RETURN")) - private static void onGetPossibleEntries(int power, ItemStack stack, boolean treasureAllowed, CallbackInfoReturnable> info) { - info.getReturnValue().removeIf(entry -> !entry.enchantment.isAcceptableItem(stack)); - } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java index cad3a18e..fac8603a 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java @@ -6,21 +6,22 @@ import java.util.Optional; import java.util.function.Supplier; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.gen.Accessor; import com.google.common.base.Suppliers; -import com.minelittlepony.unicopia.diet.DietView; import com.minelittlepony.unicopia.entity.ItemImpl; import com.minelittlepony.unicopia.entity.ItemImpl.GroundTickCallback; import com.minelittlepony.unicopia.item.ItemDuck; -import net.minecraft.item.FoodComponent; + +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.FoodComponent; import net.minecraft.item.Item; @Mixin(Item.class) -abstract class MixinItem implements ItemDuck, DietView.Holder { +abstract class MixinItem implements ItemDuck { private final List tickCallbacks = new ArrayList<>(); + + @Deprecated private final Supplier> originalFoodComponent = Suppliers.memoize(() -> { - return Optional.ofNullable(((Item)(Object)this).getFoodComponent()); + return Optional.ofNullable(((Item)(Object)this).getComponents().get(DataComponentTypes.FOOD)); }); @Override @@ -28,11 +29,7 @@ abstract class MixinItem implements ItemDuck, DietView.Holder { return tickCallbacks; } - @Override - @Mutable - @Accessor("foodComponent") - public abstract void setFoodComponent(FoodComponent food); - + @Deprecated @Override public Optional getOriginalFoodComponent() { return originalFoodComponent.get(); diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemEntity.java index e227814f..c07a01dd 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemEntity.java @@ -46,13 +46,13 @@ abstract class MixinItemEntity extends Entity implements IItemEntity { @Inject(method = "writeCustomDataToNbt(Lnet/minecraft/nbt/NbtCompound;)V", at = @At("HEAD")) private void onWriteCustomDataToTag(NbtCompound tag, CallbackInfo info) { - tag.put("unicopia_caster", get().toNBT()); + tag.put("unicopia_caster", get().toNBT(getWorld().getRegistryManager())); } @Inject(method = "readCustomDataFromNbt(Lnet/minecraft/nbt/NbtCompound;)V", at = @At("HEAD")) private void onReadCustomDataFromTag(NbtCompound tag, CallbackInfo info) { if (tag.contains("unicopia_caster")) { - get().fromNBT(tag.getCompound("unicopia_caster")); + get().fromNBT(tag.getCompound("unicopia_caster"), getWorld().getRegistryManager()); } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java index aafd1d35..538797a5 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java @@ -169,13 +169,13 @@ abstract class MixinLivingEntity extends Entity implements LivingEntityDuck, Equ @Inject(method = "writeCustomDataToNbt(Lnet/minecraft/nbt/NbtCompound;)V", at = @At("HEAD")) private void onWriteCustomDataToTag(NbtCompound tag, CallbackInfo info) { - tag.put("unicopia_caster", get().toNBT()); + tag.put("unicopia_caster", get().toNBT(getWorld().getRegistryManager())); } @Inject(method = "readCustomDataFromNbt(Lnet/minecraft/nbt/NbtCompound;)V", at = @At("HEAD")) private void onReadCustomDataFromTag(NbtCompound tag, CallbackInfo info) { if (tag.contains("unicopia_caster")) { - get().fromNBT(tag.getCompound("unicopia_caster")); + get().fromNBT(tag.getCompound("unicopia_caster"), getWorld().getRegistryManager()); } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItemStack.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItemStack.java index 81a3b67f..96c4730c 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItemStack.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItemStack.java @@ -9,16 +9,17 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.minelittlepony.unicopia.diet.DietView; -import net.minecraft.client.item.TooltipContext; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.text.Text; @Mixin(ItemStack.class) abstract class MixinItemStack { @Inject(method = "getTooltip", at = @At("RETURN")) - private void onGetTooltip(@Nullable PlayerEntity player, TooltipContext context, CallbackInfoReturnable> info) { + private void onGetTooltip(Item.TooltipContext context, @Nullable PlayerEntity player, TooltipType type, CallbackInfoReturnable> info) { ItemStack self = (ItemStack)(Object)this; - ((DietView.Holder)self.getItem()).getDiets(self).appendTooltip(self, player, info.getReturnValue(), context); + ((DietView.Holder)self.getItem()).getDiets(self).appendTooltip(self, player, info.getReturnValue(), type); } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinWorldRenderer.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinWorldRenderer.java index edcc852d..77db4d3f 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinWorldRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinWorldRenderer.java @@ -16,11 +16,11 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.minelittlepony.unicopia.client.ClientBlockDestructionManager; import com.minelittlepony.unicopia.client.UnicopiaClient; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import net.minecraft.client.render.BlockBreakingInfo; import net.minecraft.client.render.Camera; import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.player.BlockBreakingInfo; import net.minecraft.resource.SynchronousResourceReloader; import net.minecraft.util.math.RotationAxis; diff --git a/src/main/java/com/minelittlepony/unicopia/network/Channel.java b/src/main/java/com/minelittlepony/unicopia/network/Channel.java index 5cbe8e69..5b9500b9 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/Channel.java +++ b/src/main/java/com/minelittlepony/unicopia/network/Channel.java @@ -30,7 +30,7 @@ public interface Channel { S2CPacketType> SERVER_SPELLBOOK_UPDATE = SimpleNetworking.serverToClient(Unicopia.id("server_spellbook_update"), MsgSpellbookStateChanged::new); C2SPacketType> CLIENT_SPELLBOOK_UPDATE = SimpleNetworking.clientToServer(Unicopia.id("client_spellbook_update"), MsgSpellbookStateChanged::new); - S2CPacketType SERVER_RESOURCES = SimpleNetworking.serverToClient(Unicopia.id("resources"), MsgServerResources::new); + S2CPacketType SERVER_RESOURCES = SimpleNetworking.serverToClient(Unicopia.id("resources"), MsgServerResources.PACKET_CODEC); S2CPacketType SERVER_TRACKED_ENTITY_DATA = SimpleNetworking.serverToClient(Unicopia.id("tracked_entity_date"), MsgTrackedValues::new); S2CPacketType SERVER_PLAYER_ANIMATION_CHANGE = SimpleNetworking.serverToClient(Unicopia.id("player_animation_change"), MsgPlayerAnimationChange::new); diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java index 79cfab5b..4f821b58 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java @@ -1,10 +1,10 @@ package com.minelittlepony.unicopia.network; import com.minelittlepony.unicopia.entity.player.Pony; -import com.minelittlepony.unicopia.util.serialization.PacketCodec; import com.sollace.fabwork.api.packets.HandledPacket; import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.NbtCompound; @@ -21,26 +21,26 @@ public class MsgPlayerCapabilities implements HandledPacket { MsgPlayerCapabilities(PacketByteBuf buffer) { playerId = buffer.readInt(); - compoundTag = PacketCodec.COMPRESSED_NBT.read(buffer); + compoundTag = PacketCodecs.NBT_COMPOUND.decode(buffer); } public MsgPlayerCapabilities(Pony player) { playerId = player.asEntity().getId(); compoundTag = new NbtCompound(); - player.toSyncronisedNbt(compoundTag); + player.toSyncronisedNbt(compoundTag, player.asWorld().getRegistryManager()); } @Override public void toBuffer(PacketByteBuf buffer) { buffer.writeInt(playerId); - PacketCodec.COMPRESSED_NBT.write(buffer, compoundTag); + PacketCodecs.NBT_COMPOUND.encode(buffer, compoundTag); } @Override public void handle(PlayerEntity sender) { Pony player = Pony.of(sender.getWorld().getEntityById(playerId)).orElse(null); if (player != null) { - player.fromSynchronizedNbt(compoundTag); + player.fromSynchronizedNbt(compoundTag, sender.getWorld().getRegistryManager()); } } } diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgServerResources.java b/src/main/java/com/minelittlepony/unicopia/network/MsgServerResources.java index aa5186cd..09f811a2 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgServerResources.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgServerResources.java @@ -10,6 +10,9 @@ import com.minelittlepony.unicopia.diet.PonyDiets; import com.sollace.fabwork.api.packets.Packet; import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.util.Identifier; public record MsgServerResources ( @@ -17,7 +20,15 @@ public record MsgServerResources ( Map chapters, Map treeTypes, PonyDiets diets - ) implements Packet { + ) { + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + PacketCodecs.map(HashMap::new, Identifier.PACKET_CODEC, SpellTraits.PACKET_CODEC), MsgServerResources::traits, + PacketCodecs.map(HashMap::new, Identifier.PACKET_CODEC, null), MsgServerResources::chapters, + PacketCodecs.map(HashMap::new, Identifier.PACKET_CODEC, TreeTypeLoader.TreeTypeDef.PACKET_CODEC), MsgServerResources::treeTypes, + PonyDiets.PACKET_CODEC, MsgServerResources::diets, + MsgServerResources::new + ); + public MsgServerResources() { this( SpellTraits.all(), @@ -26,21 +37,4 @@ public record MsgServerResources ( PonyDiets.getInstance() ); } - - public MsgServerResources(PacketByteBuf buffer) { - this( - buffer.readMap(PacketByteBuf::readIdentifier, SpellTraits::fromPacket), - InteractionManager.getInstance().readChapters(buffer), - buffer.readMap(PacketByteBuf::readIdentifier, TreeTypeLoader.TreeTypeDef::new), - new PonyDiets(buffer) - ); - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeMap(traits, PacketByteBuf::writeIdentifier, (r, v) -> v.write(r)); - buffer.writeMap(chapters, PacketByteBuf::writeIdentifier, (r, v) -> ((SpellbookChapterLoader.Chapter)v).write(r)); - buffer.writeMap(treeTypes, PacketByteBuf::writeIdentifier, (r, v) -> v.write(r)); - diets.toBuffer(buffer); - } } diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgSpawnProjectile.java b/src/main/java/com/minelittlepony/unicopia/network/MsgSpawnProjectile.java deleted file mode 100644 index 270c069a..00000000 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgSpawnProjectile.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.minelittlepony.unicopia.network; - -import java.util.Optional; - -import com.minelittlepony.unicopia.Owned; -import com.sollace.fabwork.api.packets.Packet; - -import net.minecraft.entity.Entity; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket; - -/** - * Sent by the server to spawn a projectile entity on the client. - */ -public class MsgSpawnProjectile extends EntitySpawnS2CPacket implements Packet { - - MsgSpawnProjectile(PacketByteBuf buffer) { - super(buffer); - } - - @SuppressWarnings("unchecked") - public MsgSpawnProjectile(Entity e) { - super(e, Optional.ofNullable(e instanceof Owned ? ((Owned)e).getMaster() : null).map(Entity::getId).orElse(0)); - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - write(buffer); - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgSpellbookStateChanged.java b/src/main/java/com/minelittlepony/unicopia/network/MsgSpellbookStateChanged.java index 34a90ed9..1579a903 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgSpellbookStateChanged.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgSpellbookStateChanged.java @@ -6,6 +6,7 @@ import com.sollace.fabwork.api.packets.HandledPacket; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.RegistryByteBuf; import net.minecraft.server.network.ServerPlayerEntity; /** @@ -21,14 +22,14 @@ public record MsgSpellbookStateChanged ( return new MsgSpellbookStateChanged<>(handler.syncId, state); } - public MsgSpellbookStateChanged(PacketByteBuf buffer) { - this(buffer.readInt(), new SpellbookState().fromPacket(buffer)); + public MsgSpellbookStateChanged(RegistryByteBuf buffer) { + this(buffer.readInt(), SpellbookState.PACKET_CODEC.decode(buffer)); } @Override public void toBuffer(PacketByteBuf buffer) { buffer.writeInt(syncId); - state.toPacket(buffer); + SpellbookState.PACKET_CODEC.encode((RegistryByteBuf)buffer, state); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/network/datasync/Synchronizable.java b/src/main/java/com/minelittlepony/unicopia/network/datasync/Synchronizable.java index 07834714..94d63e9e 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/datasync/Synchronizable.java +++ b/src/main/java/com/minelittlepony/unicopia/network/datasync/Synchronizable.java @@ -5,7 +5,7 @@ import java.util.function.Consumer; public abstract class Synchronizable> { - private Optional> synchronizer = Optional.empty(); + Optional> synchronizer = Optional.empty(); @SuppressWarnings("unchecked") public void synchronize() { @@ -16,5 +16,9 @@ public abstract class Synchronizable> { this.synchronizer = Optional.of(synchronizer); } + public void copySyncronizer(T old) { + synchronizer = old.synchronizer; + } + public abstract void copyFrom(T state); } diff --git a/src/main/java/com/minelittlepony/unicopia/network/track/DataTracker.java b/src/main/java/com/minelittlepony/unicopia/network/track/DataTracker.java index b53fb7e5..05dcae7c 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/track/DataTracker.java +++ b/src/main/java/com/minelittlepony/unicopia/network/track/DataTracker.java @@ -12,6 +12,7 @@ import it.unimi.dsi.fastutil.ints.IntSet; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.network.PacketByteBuf; import net.minecraft.network.codec.PacketCodec; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; public class DataTracker { private final List> codecs = new ObjectArrayList<>(); @@ -70,18 +71,18 @@ public class DataTracker { } } - synchronized Optional getInitialPairs() { + synchronized Optional getInitialPairs(WrapperLookup lookup) { initial = false; dirtyIndices = new IntOpenHashSet(); - return Optional.of(new MsgTrackedValues.TrackerEntries(id, true, codecs, writePersistentObjects(true))); + return Optional.of(new MsgTrackedValues.TrackerEntries(id, true, codecs, writePersistentObjects(lookup, true))); } - public synchronized Optional getDirtyPairs() { + public synchronized Optional getDirtyPairs(WrapperLookup lookup) { if (initial) { - return getInitialPairs(); + return getInitialPairs(lookup); } - Map updates = writePersistentObjects(false); + Map updates = writePersistentObjects(lookup, false); if (dirtyIndices.isEmpty() && updates.isEmpty()) { return Optional.empty(); @@ -96,18 +97,18 @@ public class DataTracker { return Optional.of(new MsgTrackedValues.TrackerEntries(id, false, pairs, updates)); } - private Map writePersistentObjects(boolean initial) { + private Map writePersistentObjects(WrapperLookup lookup, boolean initial) { Map updates = new HashMap<>(); for (int i = 0; i < persistentObjects.size(); i++) { TrackableObject o = persistentObjects.get(i); TrackableObject.Status status = initial ? TrackableObject.Status.NEW : o.getStatus(); int id = i; - o.write(status).ifPresent(data -> updates.put(id, data)); + o.write(status, lookup).ifPresent(data -> updates.put(id, data)); } return updates; } - public synchronized void load(MsgTrackedValues.TrackerEntries values) { + public synchronized void load(MsgTrackedValues.TrackerEntries values, WrapperLookup lookup) { if (values.wipe()) { codecs.clear(); codecs.addAll(values.values()); @@ -124,7 +125,7 @@ public class DataTracker { for (var entry : values.objects().entrySet()) { TrackableObject o = persistentObjects.get(entry.getKey()); if (o != null) { - o.read(entry.getValue()); + o.read(entry.getValue(), lookup); } } } diff --git a/src/main/java/com/minelittlepony/unicopia/network/track/DataTrackerManager.java b/src/main/java/com/minelittlepony/unicopia/network/track/DataTrackerManager.java index 5b3cc76b..e6578cee 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/track/DataTrackerManager.java +++ b/src/main/java/com/minelittlepony/unicopia/network/track/DataTrackerManager.java @@ -12,10 +12,12 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.entity.Entity; import net.minecraft.network.listener.ClientPlayPacketListener; import net.minecraft.network.packet.Packet; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; import net.minecraft.server.network.ServerPlayerEntity; public class DataTrackerManager { private final Entity entity; + private final WrapperLookup lookup; final boolean isClient; private final List trackers = new ObjectArrayList<>(); private final List> objectTrackers = new ObjectArrayList<>(); @@ -26,6 +28,7 @@ public class DataTrackerManager { public DataTrackerManager(Entity entity) { this.entity = entity; + this.lookup = entity.getWorld().getRegistryManager(); this.isClient = entity.getWorld().isClient; } @@ -44,7 +47,7 @@ public class DataTrackerManager { DataTracker tracker = new DataTracker(trackers.size()); trackers.add(tracker); packetEmitters.add((sender, initial) -> { - var update = initial ? tracker.getInitialPairs() : tracker.getDirtyPairs(); + var update = initial ? tracker.getInitialPairs(lookup) : tracker.getDirtyPairs(lookup); if (update.isPresent()) { sender.accept(Channel.SERVER_TRACKED_ENTITY_DATA.toPacket(new MsgTrackedValues( entity.getId(), @@ -60,7 +63,7 @@ public class DataTrackerManager { ObjectTracker tracker = new ObjectTracker<>(objectTrackers.size(), objFunction); objectTrackers.add(tracker); packetEmitters.add((sender, initial) -> { - var update = initial ? tracker.getInitialPairs() : tracker.getDirtyPairs(); + var update = initial ? tracker.getInitialPairs(lookup) : tracker.getDirtyPairs(lookup); if (update.isPresent()) { sender.accept(Channel.SERVER_TRACKED_ENTITY_DATA.toPacket(new MsgTrackedValues( entity.getId(), @@ -103,13 +106,13 @@ public class DataTrackerManager { packet.updatedTrackers().ifPresent(update -> { DataTracker tracker = trackers.get(update.id()); if (tracker != null) { - tracker.load(update); + tracker.load(update, lookup); } }); packet.updatedObjects().ifPresent(update -> { ObjectTracker tracker = objectTrackers.get(update.id()); if (tracker != null) { - tracker.load(update); + tracker.load(update, lookup); } }); } diff --git a/src/main/java/com/minelittlepony/unicopia/network/track/ObjectTracker.java b/src/main/java/com/minelittlepony/unicopia/network/track/ObjectTracker.java index 8e4ef2e2..481bd514 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/track/ObjectTracker.java +++ b/src/main/java/com/minelittlepony/unicopia/network/track/ObjectTracker.java @@ -14,6 +14,7 @@ import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.network.track.TrackableObject.Status; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.network.PacketByteBuf; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; public class ObjectTracker> { private final Map trackedObjects = new Object2ObjectOpenHashMap<>(); @@ -83,14 +84,14 @@ public class ObjectTracker> { destination.quickAccess = Map.copyOf(destination.trackedObjects); } - synchronized Optional getInitialPairs() { + synchronized Optional getInitialPairs(WrapperLookup lookup) { if (trackedObjects.isEmpty()) { return Optional.empty(); } Map updates = new HashMap<>(); quickAccess.entrySet().forEach(object -> { - object.getValue().write(Status.NEW).ifPresent(data -> { + object.getValue().write(Status.NEW, lookup).ifPresent(data -> { updates.put(object.getKey(), data); }); }); @@ -98,7 +99,7 @@ public class ObjectTracker> { return Optional.of(new MsgTrackedValues.TrackerObjects(id, Set.of(), updates)); } - synchronized Optional getDirtyPairs() { + synchronized Optional getDirtyPairs(WrapperLookup lookup) { if (!trackedObjects.isEmpty()) { Map updates = new HashMap<>(); Set removedTrackableObjects = new HashSet<>(); @@ -108,7 +109,7 @@ public class ObjectTracker> { removedTrackableObjects.add(object.getKey()); return true; } - object.getValue().write(status).ifPresent(data -> { + object.getValue().write(status, lookup).ifPresent(data -> { updates.put(object.getKey(), data); }); return false; @@ -123,7 +124,7 @@ public class ObjectTracker> { return Optional.empty(); } - synchronized void load(MsgTrackedValues.TrackerObjects objects) { + synchronized void load(MsgTrackedValues.TrackerObjects objects, WrapperLookup lookup) { objects.removedValues().forEach(removedId -> { T o = trackedObjects.remove(removedId); if (o != null) { @@ -136,7 +137,7 @@ public class ObjectTracker> { o = constructor.get(); trackedObjects.put(id, o); } - o.read(data); + o.read(data, lookup); }); quickAccess = Map.copyOf(trackedObjects); } diff --git a/src/main/java/com/minelittlepony/unicopia/projectile/MagicProjectileEntity.java b/src/main/java/com/minelittlepony/unicopia/projectile/MagicProjectileEntity.java index d1434b7a..a264aabe 100644 --- a/src/main/java/com/minelittlepony/unicopia/projectile/MagicProjectileEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/projectile/MagicProjectileEntity.java @@ -170,8 +170,8 @@ public class MagicProjectileEntity extends ThrownItemEntity implements WeaklyOwn @Override public void readCustomDataFromNbt(NbtCompound compound) { super.readCustomDataFromNbt(compound); - homingTarget.fromNBT(compound.getCompound("homingTarget")); - getMasterReference().fromNBT(compound.getCompound("owner")); + homingTarget.fromNBT(compound.getCompound("homingTarget"), getWorld().getRegistryManager()); + getMasterReference().fromNBT(compound.getCompound("owner"), getWorld().getRegistryManager()); if (compound.contains("maxAge", NbtElement.INT_TYPE)) { maxAge = compound.getInt("maxAge"); } diff --git a/src/main/java/com/minelittlepony/unicopia/projectile/PhysicsBodyProjectileEntity.java b/src/main/java/com/minelittlepony/unicopia/projectile/PhysicsBodyProjectileEntity.java index d0900931..81d634b5 100644 --- a/src/main/java/com/minelittlepony/unicopia/projectile/PhysicsBodyProjectileEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/projectile/PhysicsBodyProjectileEntity.java @@ -9,6 +9,8 @@ import com.minelittlepony.unicopia.UTags; import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.entity.damage.UDamageTypes; import com.minelittlepony.unicopia.entity.mob.UEntities; +import com.minelittlepony.unicopia.item.UItems; + import net.minecraft.block.BlockState; import net.minecraft.block.ButtonBlock; import net.minecraft.block.HopperBlock; @@ -35,6 +37,7 @@ import net.minecraft.nbt.NbtOps; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.tag.BlockTags; +import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvent; import net.minecraft.util.Identifier; @@ -58,6 +61,7 @@ public class PhysicsBodyProjectileEntity extends PersistentProjectileEntity impl public PhysicsBodyProjectileEntity(EntityType type, World world, ItemStack stack) { super(type, 0, 0, 0, world, stack, null); + setStack(stack); } public PhysicsBodyProjectileEntity(World world, ItemStack stack) { @@ -66,13 +70,13 @@ public class PhysicsBodyProjectileEntity extends PersistentProjectileEntity impl public PhysicsBodyProjectileEntity(World world, @Nullable LivingEntity thrower, ItemStack stack) { super(UEntities.MUFFIN, thrower, world, stack, null); + setStack(stack); } @Override protected void initDataTracker(DataTracker.Builder builder) { super.initDataTracker(builder); - builder.add(ITEM, ItemStack.EMPTY) - .add(BOUNCY, false); + builder.add(ITEM, ItemStack.EMPTY).add(BOUNCY, false); } @Override @@ -86,6 +90,11 @@ public class PhysicsBodyProjectileEntity extends PersistentProjectileEntity impl return getDataTracker().get(ITEM); } + @Override + protected ItemStack getDefaultItemStack() { + return UItems.MUFFIN.getDefaultStack(); + } + public void setDamageType(RegistryKey damageType) { this.damageType = damageType; } @@ -149,9 +158,10 @@ public class PhysicsBodyProjectileEntity extends PersistentProjectileEntity impl } else { ItemStack stack = asItemStack(); if (stack.isIn(UTags.Items.HORSE_SHOES)) { - if (stack.damage(1 + random.nextInt(10), random, null)) { + stack.damage(1 + random.nextInt(10), (ServerWorld)getWorld(), null, i -> { playSound(USounds.Vanilla.ENTITY_ITEM_BREAK, 1, 1); - } else { + }); + if (!stack.isEmpty()) { dropStack(stack); } setStack(ItemStack.EMPTY); @@ -175,10 +185,13 @@ public class PhysicsBodyProjectileEntity extends PersistentProjectileEntity impl BlockPos buttonPos = hit.getBlockPos().offset(hit.getSide()); BlockState state = getWorld().getBlockState(buttonPos); + @Nullable + PlayerEntity player = this.getOwner() instanceof PlayerEntity p ? p : null; + if (state.isIn(BlockTags.WOODEN_BUTTONS) && state.getBlock() instanceof ButtonBlock button) { - button.powerOn(state, getWorld(), buttonPos); + button.powerOn(state, getWorld(), buttonPos, player); } else if (state.getBlock() instanceof LeverBlock lever) { - lever.togglePower(state, getWorld(), buttonPos); + lever.togglePower(state, getWorld(), buttonPos, player); } BlockPos belowPos = buttonPos.down(); @@ -195,7 +208,7 @@ public class PhysicsBodyProjectileEntity extends PersistentProjectileEntity impl break; } - if (ItemStack.canCombine(slotStack, stack) && slotStack.getCount() < slotStack.getMaxCount()) { + if (ItemStack.areItemsAndComponentsEqual(slotStack, stack) && slotStack.getCount() < slotStack.getMaxCount()) { slotStack.increment(1); discard(); break; @@ -250,8 +263,10 @@ public class PhysicsBodyProjectileEntity extends PersistentProjectileEntity impl if (!isBouncy()) { if (stack.isIn(UTags.Items.HORSE_SHOES)) { - if (stack.damage(1 + random.nextInt(10), random, null)) { + stack.damage(1 + random.nextInt(10), (ServerWorld)getWorld(), null, i -> { playSound(USounds.Vanilla.ENTITY_ITEM_BREAK, 1, 1); + }); + if (stack.isEmpty()) { discard(); return; } diff --git a/src/main/java/com/minelittlepony/unicopia/recipe/GlowingRecipe.java b/src/main/java/com/minelittlepony/unicopia/recipe/GlowingRecipe.java index 70ffa14c..49ce5cb7 100644 --- a/src/main/java/com/minelittlepony/unicopia/recipe/GlowingRecipe.java +++ b/src/main/java/com/minelittlepony/unicopia/recipe/GlowingRecipe.java @@ -22,7 +22,7 @@ public class GlowingRecipe extends ItemCombinationRecipe { ItemStack result = pair.getLeft().copy(); - ((GlowableItem)result.getItem()).setGlowing(result, pair.getRight().getItem() == Items.GLOWSTONE_DUST); + GlowableItem.setGlowing(result, pair.getRight().getItem() == Items.GLOWSTONE_DUST); return result; } @@ -39,7 +39,7 @@ public class GlowingRecipe extends ItemCombinationRecipe { @Override protected boolean isCombinationInvalid(ItemStack bangle, ItemStack dust) { - return (dust.getItem() == Items.GLOWSTONE_DUST) == ((GlowableItem)bangle.getItem()).isGlowing(bangle); + return (dust.getItem() == Items.GLOWSTONE_DUST) == GlowableItem.isGlowing(bangle); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/recipe/URecipes.java b/src/main/java/com/minelittlepony/unicopia/recipe/URecipes.java index 98c8a4fc..401f17e8 100644 --- a/src/main/java/com/minelittlepony/unicopia/recipe/URecipes.java +++ b/src/main/java/com/minelittlepony/unicopia/recipe/URecipes.java @@ -2,13 +2,11 @@ package com.minelittlepony.unicopia.recipe; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.ability.magic.spell.crafting.*; - +import com.minelittlepony.unicopia.server.world.gen.ULootTableEntryType; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; import com.mojang.serialization.MapCodec; -import net.fabricmc.fabric.api.loot.v2.LootTableEvents; -import net.minecraft.loot.LootTable; import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.codec.PacketCodec; import net.minecraft.recipe.CuttingRecipe; @@ -20,7 +18,6 @@ import net.minecraft.recipe.SpecialRecipeSerializer; import net.minecraft.recipe.StonecuttingRecipe; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; -import net.minecraft.util.Identifier; import net.minecraft.util.collection.DefaultedList; public interface URecipes { @@ -69,27 +66,6 @@ public interface URecipes { } static void bootstrap() { - LootTableEvents.MODIFY.register((res, manager, id, supplier, setter) -> { - if (!"minecraft".contentEquals(id.getNamespace())) { - return; - } - - Identifier modId = new Identifier("unicopiamc", id.getPath()); - LootTable table = manager.getLootTable(modId); - - if (table != LootTable.EMPTY) { - if (id.getPath().startsWith("blocks/") || supplier.build().pools.isEmpty()) { - for (var pool : table.pools) { - supplier.pool(pool); - } - } else { - supplier.modifyPools(poolBuilder -> { - for (var pool : table.pools) { - poolBuilder.with(pool.entries); - } - }); - } - } - }); + ULootTableEntryType.bootstrap(); } } \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/server/world/Altar.java b/src/main/java/com/minelittlepony/unicopia/server/world/Altar.java index 21f2f131..ac2980c0 100644 --- a/src/main/java/com/minelittlepony/unicopia/server/world/Altar.java +++ b/src/main/java/com/minelittlepony/unicopia/server/world/Altar.java @@ -12,15 +12,15 @@ import com.minelittlepony.unicopia.entity.mob.FloatingArtefactEntity; import com.minelittlepony.unicopia.entity.mob.SpellbookEntity; import com.minelittlepony.unicopia.entity.mob.UEntities; import com.minelittlepony.unicopia.item.UItems; -import com.minelittlepony.unicopia.util.NbtSerialisable; +import com.minelittlepony.unicopia.util.CodecUtils; import com.minelittlepony.unicopia.util.PosHelper; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; import net.minecraft.predicate.entity.EntityPredicates; import net.minecraft.registry.tag.BlockTags; import net.minecraft.server.world.ServerWorld; @@ -43,17 +43,10 @@ public record Altar( ) { private static final Direction[] HORIZONTALS = { Direction.SOUTH, Direction.WEST, Direction.NORTH, Direction.EAST }; private static final Predicate IS_PARTICIPANT = EntityPredicates.VALID_ENTITY.and(e -> e instanceof FloatingArtefactEntity || e instanceof SpellbookEntity); - public static final NbtSerialisable.Serializer SERIALIZER = NbtSerialisable.Serializer.of(nbt -> { - return new Altar( - NbtSerialisable.BLOCK_POS.read(nbt.getCompound("origin")), - new HashSet<>(NbtSerialisable.BLOCK_POS.readAll(nbt.getList("pillars", NbtElement.COMPOUND_TYPE)).toList()) - ); - }, altar -> { - NbtCompound compound = new NbtCompound(); - compound.put("origin", NbtSerialisable.BLOCK_POS.write(altar.origin)); - compound.put("pillars", NbtSerialisable.BLOCK_POS.writeAll(altar.pillars)); - return compound; - }); + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BlockPos.CODEC.fieldOf("origin").forGetter(Altar::origin), + CodecUtils.setOf(BlockPos.CODEC).fieldOf("pillars").forGetter(Altar::pillars) + ).apply(instance, Altar::new)); private static final int INNER_RADIUS = 4; private static final int PILLAR_OFFSET_FROM_CENTER = 2; diff --git a/src/main/java/com/minelittlepony/unicopia/server/world/Ether.java b/src/main/java/com/minelittlepony/unicopia/server/world/Ether.java index 10bbeb4d..6ea008b5 100644 --- a/src/main/java/com/minelittlepony/unicopia/server/world/Ether.java +++ b/src/main/java/com/minelittlepony/unicopia/server/world/Ether.java @@ -358,7 +358,7 @@ public class Ether extends PersistentState implements Tickable { @Override public void toNBT(NbtCompound compound, WrapperLookup lookup) { - entity.toNBT(compound); + entity.toNBT(compound, lookup); compound.putBoolean("removed", removed); compound.putFloat("pitch", pitch); compound.putFloat("yaw", yaw); @@ -375,7 +375,7 @@ public class Ether extends PersistentState implements Tickable { @Override public void fromNBT(NbtCompound compound, WrapperLookup lookup) { - entity.fromNBT(compound); + entity.fromNBT(compound, lookup); removed = compound.getBoolean("removed"); pitch = compound.getFloat("pitch"); yaw = compound.getFloat("yaw"); diff --git a/src/main/java/com/minelittlepony/unicopia/server/world/UnicopiaWorldProperties.java b/src/main/java/com/minelittlepony/unicopia/server/world/UnicopiaWorldProperties.java index 909a7185..1014538f 100644 --- a/src/main/java/com/minelittlepony/unicopia/server/world/UnicopiaWorldProperties.java +++ b/src/main/java/com/minelittlepony/unicopia/server/world/UnicopiaWorldProperties.java @@ -6,7 +6,9 @@ import java.util.Set; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.network.Channel; import com.minelittlepony.unicopia.network.MsgSkyAngle; +import com.minelittlepony.unicopia.util.CodecUtils; import com.minelittlepony.unicopia.util.NbtSerialisable; +import com.mojang.serialization.Codec; import net.minecraft.datafixer.DataFixTypes; import net.minecraft.entity.Entity; @@ -19,6 +21,7 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.world.PersistentState; public class UnicopiaWorldProperties extends PersistentState { + static final Codec> POS_CODEC = CodecUtils.setOf(BlockPos.CODEC); private final ServerWorld world; @@ -27,15 +30,21 @@ public class UnicopiaWorldProperties extends PersistentState { private final Set activeAltarPositions = new HashSet<>(); - public UnicopiaWorldProperties(ServerWorld world) { + public static UnicopiaWorldProperties forWorld(ServerWorld world) { + return world.getPersistentStateManager().getOrCreate( + new Type<>(() -> new UnicopiaWorldProperties(world), (nbt, lookup) -> new UnicopiaWorldProperties(world, nbt), DataFixTypes.LEVEL), "unicopia_tribes" + ); + } + + private UnicopiaWorldProperties(ServerWorld world) { this.world = world; } - public UnicopiaWorldProperties(ServerWorld world, NbtCompound tag) { + private UnicopiaWorldProperties(ServerWorld world, NbtCompound tag) { this(world); defaultRace = Race.fromName(tag.getString("defaultRace"), Race.HUMAN); tangentalSkyAngle = tag.getFloat("tangentalSkyAngle"); - activeAltarPositions.addAll(NbtSerialisable.BLOCK_POS.readAll(tag.getList("activeAltars", NbtElement.COMPOUND_TYPE)).toList()); + NbtSerialisable.decode(POS_CODEC, tag.getList("activeAltars", NbtElement.COMPOUND_TYPE)).ifPresent(activeAltarPositions::addAll); } public Race getDefaultRace() { @@ -85,13 +94,7 @@ public class UnicopiaWorldProperties extends PersistentState { public NbtCompound writeNbt(NbtCompound tag, WrapperLookup lookup) { tag.putString("defaultRace", Race.REGISTRY.getId(defaultRace).toString()); tag.putFloat("tangentalSkyAngle", tangentalSkyAngle); - tag.put("activeAltars", NbtSerialisable.BLOCK_POS.writeAll(activeAltarPositions)); + tag.put("activeAltars", NbtSerialisable.encode(POS_CODEC, activeAltarPositions)); return tag; } - - public static UnicopiaWorldProperties forWorld(ServerWorld world) { - return world.getPersistentStateManager().getOrCreate( - new Type<>(() -> new UnicopiaWorldProperties(world), (nbt, lookup) -> new UnicopiaWorldProperties(world, nbt), DataFixTypes.LEVEL), "unicopia_tribes" - ); - } } diff --git a/src/main/java/com/minelittlepony/unicopia/server/world/gen/ULootTableEntryType.java b/src/main/java/com/minelittlepony/unicopia/server/world/gen/ULootTableEntryType.java new file mode 100644 index 00000000..3dc65055 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/server/world/gen/ULootTableEntryType.java @@ -0,0 +1,31 @@ +package com.minelittlepony.unicopia.server.world.gen; + +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Stream; + +import net.fabricmc.fabric.api.loot.v3.LootTableEvents; +import net.minecraft.util.Identifier; + +public interface ULootTableEntryType { + static void bootstrap() { + Map extentionTableIds = new HashMap<>(); + LootTableEvents.MODIFY.register((key, supplier, source, registries) -> { + Identifier id = key.getValue(); + + if ("unicopiamc".equalsIgnoreCase(id.getPath())) { + extentionTableIds.put(Identifier.ofVanilla(id.getPath()), id); + } + }); + LootTableEvents.ALL_LOADED.register((resourceManager, registry) -> { + extentionTableIds.forEach((base, extra) -> { + registry.getOrEmpty(base).ifPresent(table -> { + registry.getOrEmpty(extra).ifPresent(extraTable -> { + table.pools = Stream.concat(table.pools.stream(), extraTable.pools.stream()).toList(); + }); + }); + }); + extentionTableIds.clear(); + }); + } +} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/util/CodecUtils.java b/src/main/java/com/minelittlepony/unicopia/util/CodecUtils.java index fb5cf212..b4df030f 100644 --- a/src/main/java/com/minelittlepony/unicopia/util/CodecUtils.java +++ b/src/main/java/com/minelittlepony/unicopia/util/CodecUtils.java @@ -17,9 +17,12 @@ import com.mojang.serialization.MapCodec; import net.fabricmc.fabric.api.util.TriState; import net.minecraft.item.ItemConvertible; import net.minecraft.registry.Registries; +import net.minecraft.util.dynamic.Codecs; +import net.minecraft.util.math.BlockPos; public interface CodecUtils { Codec ITEM = Registries.ITEM.getCodec().xmap(i -> () -> i, ItemConvertible::asItem); + Codec> OPTIONAL_POS = Codecs.optional(BlockPos.CODEC); /** * Combines the result of two unrelated codecs into a single object. *

diff --git a/src/main/java/com/minelittlepony/unicopia/util/serialization/PacketCodec.java b/src/main/java/com/minelittlepony/unicopia/util/serialization/PacketCodec.java deleted file mode 100644 index a315d0a9..00000000 --- a/src/main/java/com/minelittlepony/unicopia/util/serialization/PacketCodec.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.minelittlepony.unicopia.util.serialization; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Optional; -import java.util.UUID; -import java.util.function.BiConsumer; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.Supplier; - -import io.netty.buffer.ByteBufInputStream; -import io.netty.buffer.ByteBufOutputStream; -import io.netty.buffer.Unpooled; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtIo; -import net.minecraft.nbt.NbtTagSizeTracker; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.registry.Registry; -import net.minecraft.registry.RegistryKey; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; - -@Deprecated -public record PacketCodec(PacketByteBuf.PacketReader reader, PacketByteBuf.PacketWriter writer) { - public static final PacketCodec BOOLEAN = new PacketCodec<>(PacketByteBuf::readBoolean, PacketByteBuf::writeBoolean); - public static final PacketCodec FLOAT = new PacketCodec<>(PacketByteBuf::readFloat, PacketByteBuf::writeFloat); - public static final PacketCodec INT = new PacketCodec<>(PacketByteBuf::readInt, PacketByteBuf::writeInt); - public static final PacketCodec BYTE = new PacketCodec<>(PacketByteBuf::readByte, (b, v) -> b.writeByte(v)); - public static final PacketCodec LONG = new PacketCodec<>(PacketByteBuf::readLong, PacketByteBuf::writeLong); - public static final PacketCodec STRING = new PacketCodec<>(PacketByteBuf::readString, PacketByteBuf::writeString); - public static final PacketCodec UUID = new PacketCodec<>(PacketByteBuf::readUuid, PacketByteBuf::writeUuid); - public static final PacketCodec> OPTIONAL_UUID = UUID.asOptional(); - - public static final PacketCodec IDENTIFIER = new PacketCodec<>(PacketByteBuf::readIdentifier, PacketByteBuf::writeIdentifier); - - public static final PacketCodec NBT = new PacketCodec<>(PacketByteBuf::readNbt, PacketByteBuf::writeNbt); - - public static final PacketCodec RAW_BYTES = new PacketCodec<>( - buffer -> new PacketByteBuf(buffer.readBytes(buffer.readInt())), - (buffer, bytes) -> { - buffer.writeInt(bytes.writerIndex()); - buffer.writeBytes(bytes); - }); - public static final PacketCodec COMPRESSED_NBT = RAW_BYTES.xMap(buffer -> { - try (InputStream in = new ByteBufInputStream(buffer)) { - return NbtIo.readCompressed(in, NbtTagSizeTracker.ofUnlimitedBytes()); - } catch (IOException e) { - throw new RuntimeException(e); - } - }, nbt -> { - var buffer = new PacketByteBuf(Unpooled.buffer()); - try (ByteBufOutputStream out = new ByteBufOutputStream(buffer)) { - NbtIo.writeCompressed(nbt, out); - return buffer; - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - - public static final PacketCodec POS = new PacketCodec<>(PacketByteBuf::readBlockPos, PacketByteBuf::writeBlockPos); - public static final PacketCodec> OPTIONAL_POS = POS.asOptional(); - public static final PacketCodec VECTOR = new PacketCodec<>(buffer -> new Vec3d(buffer.readDouble(), buffer.readDouble(), buffer.readDouble()), (buffer, vector) -> { - buffer.writeDouble(vector.x); - buffer.writeDouble(vector.y); - buffer.writeDouble(vector.z); - }); - public static final PacketCodec> OPTIONAL_VECTOR = VECTOR.asOptional(); - public static final PacketCodec> REGISTRY_KEY = new PacketCodec<>(buffer -> { - return RegistryKey.of(RegistryKey.ofRegistry(IDENTIFIER.read(buffer)), IDENTIFIER.read(buffer)); - }, (buffer, key) -> { - IDENTIFIER.write(buffer, key.getRegistry()); - IDENTIFIER.write(buffer, key.getValue()); - }); - public static final PacketCodec>> OPTIONAL_REGISTRY_KEY = REGISTRY_KEY.asOptional(); - - public static final PacketCodec ofRegistry(Registry registry) { - return INT.xMap(registry::get, registry::getRawId); - } - - public static final > PacketCodec ofEnum(Supplier valuesGetter) { - final T[] values = valuesGetter.get(); - return INT.xMap(id -> values[MathHelper.clamp(id, 0, values.length)], Enum::ordinal); - } - - public T read(PacketByteBuf buf) { - return reader().apply(buf); - } - - public void write(PacketByteBuf buf, T value) { - writer().accept(buf, value); - } - - public PacketCodec> asOptional() { - return new PacketCodec<>(buf -> buf.readOptional(reader), (buf, v) -> buf.writeOptional(v, writer)); - } - - public PacketCodec xMap(Function to, Function from) { - return new PacketCodec<>(buf -> to.apply(reader.apply(buf)), (buf, v) -> writer.accept(buf, from.apply(v))); - } - - public PacketCodec andThen(BiFunction to, Function from, BiConsumer write) { - return new PacketCodec<>(buf -> { - return to.apply(buf, reader.apply(buf)); - }, (buf, v) -> { - writer.accept(buf, from.apply(v)); - write.accept(buf, v); - }); - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/util/serialization/PacketCodecUtils.java b/src/main/java/com/minelittlepony/unicopia/util/serialization/PacketCodecUtils.java index 7ae25a37..16af2ed5 100644 --- a/src/main/java/com/minelittlepony/unicopia/util/serialization/PacketCodecUtils.java +++ b/src/main/java/com/minelittlepony/unicopia/util/serialization/PacketCodecUtils.java @@ -1,6 +1,11 @@ package com.minelittlepony.unicopia.util.serialization; +import java.util.HashMap; +import java.util.Map; import java.util.Optional; +import java.util.function.Function; +import java.util.function.IntFunction; + import io.netty.buffer.ByteBuf; import net.minecraft.network.PacketByteBuf; import net.minecraft.network.codec.PacketCodec; @@ -30,4 +35,40 @@ public interface PacketCodecUtils { ); PacketCodec> OPTIONAL_VECTOR = PacketCodecs.optional(VECTOR); PacketCodec> OPTIONAL_POS = PacketCodecs.optional(BlockPos.PACKET_CODEC); + + static PacketCodec.ResultFunction> toMap(Function keyFunction) { + return codec -> map(HashMap::new, codec, keyFunction, -1); + } + + static > PacketCodec map( + IntFunction factory, + PacketCodec elementCodec, + Function keyFunction, + int maxSize + ) { + return new PacketCodec<>() { + @Override + public C decode(B byteBuf) { + int i = PacketCodecs.readCollectionSize(byteBuf, maxSize); + C collection = factory.apply(Math.min(i, 65536)); + + for (int j = 0; j < i; j++) { + V v = elementCodec.decode(byteBuf); + K k = keyFunction.apply(v); + collection.put(k, v); + } + + return collection; + } + + @Override + public void encode(B byteBuf, C collection) { + PacketCodecs.writeCollectionSize(byteBuf, collection.size(), maxSize); + + for (V object : collection.values()) { + elementCodec.encode(byteBuf, object); + } + } + }; + } } diff --git a/src/main/resources/unicopia.aw b/src/main/resources/unicopia.aw index 6ded9865..7d05b342 100644 --- a/src/main/resources/unicopia.aw +++ b/src/main/resources/unicopia.aw @@ -11,11 +11,9 @@ accessible class net/minecraft/client/gui/hud/InGameHud$HeartType accessible field net/minecraft/entity/mob/CreeperEntity CHARGED Lnet/minecraft/entity/data/TrackedData; accessible field net/minecraft/entity/mob/CreeperEntity IGNITED Lnet/minecraft/entity/data/TrackedData; -accessible method net/minecraft/client/render/RenderLayer$MultiPhase getPhases ()Lnet/minecraft/client/render/RenderLayer$MultiPhaseParameters; -accessible method net/minecraft/client/render/RenderPhase$TextureBase getId ()Ljava/util/Optional; -accessible field net/minecraft/client/render/RenderLayer$MultiPhaseParameters texture Lnet/minecraft/client/render/RenderPhase$TextureBase; - accessible field net/minecraft/loot/LootTable pools Ljava/util/List; +mutable field net/minecraft/loot/LootTable pools Ljava/util/List; + #accessible method net/minecraft/block/entity/SkullBlockEntity fetchProfile (Ljava/lang/String;)Ljava/util/concurrent/CompletableFuture; accessible method net/minecraft/entity/LightningEntity cleanOxidation (Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;)V