diff --git a/build.gradle.kts b/build.gradle.kts index b66b906e0..cc5397a07 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -29,20 +29,21 @@ allprojects { } mavenCentral() + maven("https://maven-staging.bai.lol") } java { - toolchain.languageVersion.set(JavaLanguageVersion.of(17)) + toolchain.languageVersion.set(JavaLanguageVersion.of(21)) - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 withSourcesJar() } tasks.withType { options.encoding = StandardCharsets.UTF_8.name() - options.release.set(17) + options.release.set(21) } tasks.withType { diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 70ba4bdc3..f29ffbf5a 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -19,7 +19,7 @@ dependencies { implementation("de.undercouch:gradle-download-task:5.0.5") implementation("com.squareup:javapoet:1.13.0") - implementation("com.google.code.gson:gson:2.9.0") + implementation("com.google.code.gson:gson:2.10.1") implementation("com.google.guava:guava:31.0.1-jre") // https://github.com/MinecraftForge/ForgeGradle/issues/919 diff --git a/gradle.properties b/gradle.properties index d58b274fe..0114af5e5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,21 +1,21 @@ org.gradle.jvmargs = -Xmx3G -minecraft = 1.20.4 +minecraft = 1.20.5-pre1 archiveBaseName = wthit group = mcp.mobius.waila -majorVersion = 10 +majorVersion = 11 # [rei, jei, emi] recipeViewer = none -badpackets = 0.6.0 +badpackets = 0.7.0-git-655fa14a rei = 13.0.666 jei = 1.20.2-16.0.0.28 emi = 1.0.23+1.20.2 -fabricLoader = 0.15.2 -fabricApi = 0.91.3+1.20.4 +fabricLoader = 0.15.9 +fabricApi = 0.96.15+1.20.5 modMenu = 9.0.0-pre.1 trEnergy = 3.0.0 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 887c19428..635a0457b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase = GRADLE_USER_HOME distributionPath = wrapper/dists zipStoreBase = GRADLE_USER_HOME zipStorePath = wrapper/dists -distributionUrl = https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl = https\://services.gradle.org/distributions/gradle-8.7-bin.zip diff --git a/platform/fabric/build.gradle.kts b/platform/fabric/build.gradle.kts index 3b4baac1e..efed91402 100644 --- a/platform/fabric/build.gradle.kts +++ b/platform/fabric/build.gradle.kts @@ -1,7 +1,7 @@ evaluationDependsOn(":textile") plugins { - id("fabric-loom") version "1.3.10" + id("fabric-loom") version "1.6.6" } setupPlatform() diff --git a/platform/textile/build.gradle.kts b/platform/textile/build.gradle.kts index ca751d165..5c9c6e73d 100644 --- a/platform/textile/build.gradle.kts +++ b/platform/textile/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("fabric-loom") version "1.3.10" + id("fabric-loom") version "1.6.6" } setupPlatform() diff --git a/platform/textile/src/api/java/mcp/mobius/waila/api/fabric/FabricFluidData.java b/platform/textile/src/api/java/mcp/mobius/waila/api/fabric/FabricFluidData.java index 932c27d8f..81270b9c5 100644 --- a/platform/textile/src/api/java/mcp/mobius/waila/api/fabric/FabricFluidData.java +++ b/platform/textile/src/api/java/mcp/mobius/waila/api/fabric/FabricFluidData.java @@ -4,9 +4,8 @@ import mcp.mobius.waila.api.data.FluidData.PlatformDependant; import mcp.mobius.waila.api.data.FluidData.PlatformTranslator; import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant; -import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.component.DataComponentPatch; import net.minecraft.world.level.material.Fluid; -import org.jetbrains.annotations.Nullable; /** * Fabric-specific helper for creating {@link FluidData}. @@ -45,7 +44,7 @@ public Fluid fluid(FluidVariant t) { } @Override - public @Nullable CompoundTag nbt(FluidVariant t) { + public DataComponentPatch data(FluidVariant t) { return t.getNbt(); } diff --git a/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/textile/WailaPluginTextile.java b/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/textile/WailaPluginTextile.java index da67c2f5b..660b13fb2 100644 --- a/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/textile/WailaPluginTextile.java +++ b/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/textile/WailaPluginTextile.java @@ -8,7 +8,6 @@ import mcp.mobius.waila.plugin.textile.fluid.TextileFluidDescriptor; import mcp.mobius.waila.plugin.textile.provider.FluidStorageProvider; import mcp.mobius.waila.plugin.textile.provider.ItemStorageProvider; -import net.fabricmc.fabric.api.mininglevel.v1.FabricMineableTags; import net.fabricmc.fabric.api.tag.convention.v1.ConventionalItemTags; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; @@ -54,13 +53,14 @@ public void register(IRegistrar registrar) { registrar.addToolType(new ResourceLocation("sword"), IToolType.builder() .lowestTierItem(Items.WOODEN_SWORD) - .blockTag(FabricMineableTags.SWORD_MINEABLE) + .blockTag(BlockTags.SWORD_EFFICIENT) .itemTag(ItemTags.SWORDS) .build()); + // TODO registrar.addToolType(new ResourceLocation("shears"), IToolType.builder() .lowestTierItem(Items.SHEARS) - .blockPredicate(it -> it.is(FabricMineableTags.SHEARS_MINEABLE) || it.getBlock() instanceof IShearable || it.getBlock() instanceof DoublePlantBlock) + .blockPredicate(it -> /*it.is(BlockTags.SHEARS_MINEABLE) ||*/ it.getBlock() instanceof IShearable || it.getBlock() instanceof DoublePlantBlock) .itemTag(ConventionalItemTags.SHEARS) .build()); } diff --git a/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/textile/fluid/TextileFluidDescriptor.java b/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/textile/fluid/TextileFluidDescriptor.java index 515c116c1..e80771c19 100644 --- a/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/textile/fluid/TextileFluidDescriptor.java +++ b/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/textile/fluid/TextileFluidDescriptor.java @@ -21,7 +21,7 @@ public enum TextileFluidDescriptor implements FluidDescriptor, CauldronDe @Override public void describeFluid(FluidDescriptionContext ctx, FluidDescription desc) { - var variant = FluidVariant.of(ctx.fluid(), ctx.nbt()); + var variant = FluidVariant.of(ctx.fluid(), ctx.data()); desc.name(FluidVariantAttributes.getName(variant)); var sprite = FluidVariantRendering.getSprite(variant); diff --git a/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/textile/provider/FluidStorageProvider.java b/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/textile/provider/FluidStorageProvider.java index 05fa1f8cf..0c0322793 100644 --- a/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/textile/provider/FluidStorageProvider.java +++ b/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/textile/provider/FluidStorageProvider.java @@ -30,7 +30,7 @@ public enum FluidStorageProvider implements IDataProvider { @Override public void appendData(IDataWriter data, IServerAccessor accessor, IPluginConfig config) { - data.add(FluidData.class, res -> { + data.add(FluidData.TYPE, res -> { if (cache == null || cache.getBlockEntity() != accessor.getTarget()) { cache = BlockApiCache.create(FluidStorage.SIDED, (ServerLevel) accessor.getWorld(), accessor.getTarget().getBlockPos()); } diff --git a/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/textile/provider/ItemStorageProvider.java b/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/textile/provider/ItemStorageProvider.java index c5bdde194..40d8e7153 100644 --- a/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/textile/provider/ItemStorageProvider.java +++ b/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/textile/provider/ItemStorageProvider.java @@ -30,7 +30,7 @@ public enum ItemStorageProvider implements IDataProvider { @Override public void appendData(IDataWriter data, IServerAccessor accessor, IPluginConfig config) { - data.add(ItemData.class, res -> { + data.add(ItemData.TYPE, res -> { if (cache == null || cache.getBlockEntity() != accessor.getTarget()) { cache = BlockApiCache.create(ItemStorage.SIDED, (ServerLevel) accessor.getWorld(), accessor.getTarget().getBlockPos()); } diff --git a/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/trenergy/provider/EnergyStorageProvider.java b/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/trenergy/provider/EnergyStorageProvider.java index a14ac0caa..de76550f8 100644 --- a/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/trenergy/provider/EnergyStorageProvider.java +++ b/platform/textile/src/plugin/java/mcp/mobius/waila/plugin/trenergy/provider/EnergyStorageProvider.java @@ -21,7 +21,7 @@ public enum EnergyStorageProvider implements IDataProvider { @Override public void appendData(IDataWriter data, IServerAccessor accessor, IPluginConfig config) { - data.add(EnergyData.class, res -> { + data.add(EnergyData.TYPE, res -> { if (cache == null || cache.getBlockEntity() != accessor.getTarget()) { cache = BlockApiCache.create(EnergyStorage.SIDED, (ServerLevel) accessor.getWorld(), accessor.getTarget().getBlockPos()); } diff --git a/settings.gradle.kts b/settings.gradle.kts index 669259c33..4622cb8fb 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -26,7 +26,7 @@ platform("mojmap") //platform("bukkit") platform("fabric") -platform("forge") -platform("neo") +//platform("forge") +//platform("neo") platform("textile") //platform("quilt") diff --git a/src/api/java/mcp/mobius/waila/api/IData.java b/src/api/java/mcp/mobius/waila/api/IData.java index 96f3cdf08..e6adb10a9 100644 --- a/src/api/java/mcp/mobius/waila/api/IData.java +++ b/src/api/java/mcp/mobius/waila/api/IData.java @@ -1,6 +1,7 @@ package mcp.mobius.waila.api; -import net.minecraft.network.FriendlyByteBuf; +import mcp.mobius.waila.api.__internal__.IApiService; +import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.ApiStatus; /** @@ -16,26 +17,32 @@ public interface IData { /** - * Write current data to the buffer. + * Creates a data type. + *

+ * Save the returned value to a static final variable. * - * @param buf the buffer + * @param id the data id */ - @ApiStatus.OverrideOnly - void write(FriendlyByteBuf buf); + static Type createType(ResourceLocation id) { + return IApiService.INSTANCE.createDataType(id); + } /** - * A byte buffer to data serializer, should be implemented as a reference to data constructor. + * Returns the type of the data, should be a constant variable. + * + * @see #createType(ResourceLocation) */ - @FunctionalInterface - @ApiStatus.OverrideOnly - interface Serializer { - - /** - * Read data from the buffer. - * - * @param buf the buffer - */ - T read(FriendlyByteBuf buf); + Type type(); + + + /** + * @see #createType(ResourceLocation) + */ + @SuppressWarnings("unused") + @ApiStatus.NonExtendable + interface Type { + + ResourceLocation id(); } diff --git a/src/api/java/mcp/mobius/waila/api/IDataReader.java b/src/api/java/mcp/mobius/waila/api/IDataReader.java index eb31b9526..ca242d557 100644 --- a/src/api/java/mcp/mobius/waila/api/IDataReader.java +++ b/src/api/java/mcp/mobius/waila/api/IDataReader.java @@ -20,14 +20,14 @@ public interface IDataReader { * * @param type the type of the data. */ - @Nullable T get(Class type); + @Nullable D get(IData.Type type); /** - * Invalidate the current data instance of type {@code T}, - * making {@link #get(Class)} returns {@code null} until a new instance is synced. + * Invalidate the current data instance of type {@code D}, + * making {@link #get(IData.Type)} returns {@code null} until a new instance is synced. * * @param type the type of the data */ - void invalidate(Class type); + void invalidate(IData.Type type); } diff --git a/src/api/java/mcp/mobius/waila/api/IDataWriter.java b/src/api/java/mcp/mobius/waila/api/IDataWriter.java index ae4d36c15..787b3e830 100644 --- a/src/api/java/mcp/mobius/waila/api/IDataWriter.java +++ b/src/api/java/mcp/mobius/waila/api/IDataWriter.java @@ -33,16 +33,16 @@ public interface IDataWriter { * * @see IData */ - void add(Class type, Consumer> consumer); + void add(IData.Type type, Consumer> consumer); /** * Immediately adds a typed data. *

- * Use this method only for internal data that only you use, otherwise use {@link #add(Class, Consumer)} instead. + * Use this method only for internal data that only you use, otherwise use {@link #add(IData.Type, Consumer)} instead. * * @param data the data to add * - * @throws IllegalStateException if the data is already added, whether with {@link #add(Class, Consumer)} or this method + * @throws IllegalStateException if the data is already added, whether with {@link #add(IData.Type, Consumer)} or this method */ void addImmediate(IData data); @@ -51,7 +51,7 @@ public interface IDataWriter { * * @param type the type of the data that wanted to be blocked */ - default void blockAll(Class type) { + default void blockAll(IData.Type type) { add(type, Result::block); } diff --git a/src/api/java/mcp/mobius/waila/api/IRegistrar.java b/src/api/java/mcp/mobius/waila/api/IRegistrar.java index 8ce2fccd9..b95c5d90b 100644 --- a/src/api/java/mcp/mobius/waila/api/IRegistrar.java +++ b/src/api/java/mcp/mobius/waila/api/IRegistrar.java @@ -4,7 +4,9 @@ import mcp.mobius.waila.api.__internal__.ApiSide; import mcp.mobius.waila.api.__internal__.IHarvestService; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; @@ -601,23 +603,10 @@ default void addEntityData(IDataProvider provider, Clas /** * Registers a data type used for syncing data from server to client. * - * @param id the id of the data type - * @param apiType the public type of data, to be used when {@linkplain IDataReader#get(Class) getting} it - * @param implType the actual type of data that get sent - * @param serializer the data to buffer serializer + * @param type the data type + * @param codec the data-to-buffer codec */ - void addDataType(ResourceLocation id, Class apiType, Class implType, IData.Serializer serializer); - - /** - * Registers a data type used for syncing data from server to client. - * - * @param id the id of the data type - * @param type the type of data - * @param serializer the data to buffer serializer - */ - default void addDataType(ResourceLocation id, Class type, IData.Serializer serializer) { - addDataType(id, type, type, serializer); - } + void addDataType(IData.Type type, StreamCodec codec); /** * Registers an {@link IThemeType} instance. diff --git a/src/api/java/mcp/mobius/waila/api/__internal__/IApiService.java b/src/api/java/mcp/mobius/waila/api/__internal__/IApiService.java index a2a93afa9..3c8bd0140 100644 --- a/src/api/java/mcp/mobius/waila/api/__internal__/IApiService.java +++ b/src/api/java/mcp/mobius/waila/api/__internal__/IApiService.java @@ -7,6 +7,7 @@ import com.mojang.blaze3d.vertex.BufferBuilder; import mcp.mobius.waila.api.IBlacklistConfig; +import mcp.mobius.waila.api.IData; import mcp.mobius.waila.api.IInstanceRegistry; import mcp.mobius.waila.api.IJsonConfig; import mcp.mobius.waila.api.IModInfo; @@ -79,4 +80,6 @@ public interface IApiService { List getTiers(); + IData.Type createDataType(ResourceLocation id); + } diff --git a/src/api/java/mcp/mobius/waila/api/data/BlockingDataProvider.java b/src/api/java/mcp/mobius/waila/api/data/BlockingDataProvider.java index 9c0e47c78..f437e4a57 100644 --- a/src/api/java/mcp/mobius/waila/api/data/BlockingDataProvider.java +++ b/src/api/java/mcp/mobius/waila/api/data/BlockingDataProvider.java @@ -19,11 +19,11 @@ public final class BlockingDataProvider implements IDataProvider { * @param types data types to block */ @SafeVarargs - public BlockingDataProvider(Class... types) { + public BlockingDataProvider(IData.Type... types) { this.types = types; } - private final Class[] types; + private final IData.Type[] types; @Override public void appendData(IDataWriter data, IServerAccessor accessor, IPluginConfig config) { diff --git a/src/api/java/mcp/mobius/waila/api/data/EnergyData.java b/src/api/java/mcp/mobius/waila/api/data/EnergyData.java index dc89f2f62..d090d46e9 100644 --- a/src/api/java/mcp/mobius/waila/api/data/EnergyData.java +++ b/src/api/java/mcp/mobius/waila/api/data/EnergyData.java @@ -19,6 +19,7 @@ public abstract class EnergyData implements IData { public static final ResourceLocation ID = BuiltinDataUtil.rl("energy"); + public static final Type TYPE = IData.createType(ID); /** * The default energy name translation key. @@ -55,7 +56,7 @@ public abstract class EnergyData implements IData { * @see #INFINITE */ public static IDataProvider newInfiniteProvider() { - return (data, accessor, config) -> data.add(EnergyData.class, res -> res.add(INFINITE)); + return (data, accessor, config) -> data.add(TYPE, res -> res.add(INFINITE)); } /** diff --git a/src/api/java/mcp/mobius/waila/api/data/FluidData.java b/src/api/java/mcp/mobius/waila/api/data/FluidData.java index a1d39da34..397e3f885 100644 --- a/src/api/java/mcp/mobius/waila/api/data/FluidData.java +++ b/src/api/java/mcp/mobius/waila/api/data/FluidData.java @@ -5,6 +5,7 @@ import mcp.mobius.waila.api.__internal__.ApiSide; import mcp.mobius.waila.api.__internal__.IExtraService; import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.component.DataComponentPatch; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -23,6 +24,8 @@ public abstract class FluidData implements IData { public static final ResourceLocation ID = BuiltinDataUtil.rl("fluid"); + public static final Type TYPE = IData.createType(ID); + public static final ResourceLocation CONFIG_DISPLAY_UNIT = BuiltinDataUtil.rl("fluid.display_unit"); /** @@ -163,17 +166,17 @@ public static PlatformDependant of(PlatformTranslator translator, int * Adds a fluid entry. * * @param fluid the fluid instance, will be normalized as the source fluid if it is a {@link FlowingFluid} - * @param nbt the fluid's NBT data, will NOT be modified so it safe to not {@linkplain CompoundTag#copy() copy} it + * @param data the fluid's NBT data, will NOT be modified so it safe to not {@linkplain CompoundTag#copy() copy} it * @param stored the stored amount of the fluid, in the specified unit * @param capacity the maximum capacity of this slot, in the specified unit */ - public FluidData add(Fluid fluid, @Nullable CompoundTag nbt, double stored, double capacity) { + public FluidData add(Fluid fluid, DataComponentPatch data, double stored, double capacity) { capacity = Math.max(capacity, 0.0); stored = Mth.clamp(stored, 0.0, capacity); if (capacity == 0) capacity = Double.POSITIVE_INFINITY; var source = fluid instanceof FlowingFluid flowing ? flowing.getSource() : fluid; - implAdd(source, nbt, stored, capacity); + implAdd(source, data, stored, capacity); return this; } @@ -188,7 +191,7 @@ public static abstract class PlatformDependant extends FluidData { */ public PlatformDependant add(T stack, double capacity) { var translator = translator(); - return add(translator.fluid(stack), translator.nbt(stack), translator.amount(stack), capacity); + return add(translator.fluid(stack), translator.data(stack), translator.amount(stack), capacity); } /** @@ -200,12 +203,12 @@ public PlatformDependant add(T stack, double capacity) { */ public PlatformDependant add(T variant, double stored, double capacity) { var translator = translator(); - return add(translator.fluid(variant), translator.nbt(variant), stored, capacity); + return add(translator.fluid(variant), translator.data(variant), stored, capacity); } @Override - public PlatformDependant add(Fluid fluid, @Nullable CompoundTag nbt, double stored, double capacity) { - super.add(fluid, nbt, stored, capacity); + public PlatformDependant add(Fluid fluid, DataComponentPatch data, double stored, double capacity) { + super.add(fluid, data, stored, capacity); return this; } @@ -283,7 +286,7 @@ public interface FluidDescriptionContext { /** * Returns the fluid's NBT data. */ - @Nullable CompoundTag nbt(); + DataComponentPatch data(); } @@ -311,7 +314,7 @@ public interface PlatformTranslator { /** * Returns the nbt of the platform object. */ - @Nullable CompoundTag nbt(T t); + DataComponentPatch data(T t); /** * Returns the amount of the platform object. @@ -327,7 +330,7 @@ public interface PlatformTranslator { protected abstract PlatformTranslator translator(); - protected abstract void implAdd(Fluid fluid, @Nullable CompoundTag nbt, double stored, double capacity); + protected abstract void implAdd(Fluid fluid, DataComponentPatch data, double stored, double capacity); // ----------------------------------------------------------------------------------------------------------------------------------------------- // TODO: Remove diff --git a/src/api/java/mcp/mobius/waila/api/data/ItemData.java b/src/api/java/mcp/mobius/waila/api/data/ItemData.java index 3966e0577..8e44987cd 100644 --- a/src/api/java/mcp/mobius/waila/api/data/ItemData.java +++ b/src/api/java/mcp/mobius/waila/api/data/ItemData.java @@ -20,6 +20,8 @@ public abstract class ItemData implements IData { public static final ResourceLocation ID = BuiltinDataUtil.rl("item"); + public static final Type TYPE = IData.createType(ID); + public static final ResourceLocation CONFIG_SYNC_NBT = BuiltinDataUtil.rl("item.nbt"); public static final ResourceLocation CONFIG_MAX_HEIGHT = BuiltinDataUtil.rl("item.max_height"); public static final ResourceLocation CONFIG_SORT_BY_COUNT = BuiltinDataUtil.rl("item.sort_by_count"); diff --git a/src/api/java/mcp/mobius/waila/api/data/ProgressData.java b/src/api/java/mcp/mobius/waila/api/data/ProgressData.java index 0b5b8e458..93a4be087 100644 --- a/src/api/java/mcp/mobius/waila/api/data/ProgressData.java +++ b/src/api/java/mcp/mobius/waila/api/data/ProgressData.java @@ -21,6 +21,7 @@ public abstract class ProgressData implements IData { public static final ResourceLocation ID = BuiltinDataUtil.rl("progress"); + public static final Type TYPE = IData.createType(ID); /** * Creates a progress data. diff --git a/src/main/java/mcp/mobius/waila/access/DataReader.java b/src/main/java/mcp/mobius/waila/access/DataReader.java index 9f8886920..eb42b7023 100644 --- a/src/main/java/mcp/mobius/waila/access/DataReader.java +++ b/src/main/java/mcp/mobius/waila/access/DataReader.java @@ -7,7 +7,8 @@ import mcp.mobius.waila.api.IDataReader; import mcp.mobius.waila.registry.Registrar; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; public enum DataReader implements IDataReader { @@ -23,17 +24,17 @@ public CompoundTag raw() { } @Override - public @Nullable T get(Class type) { + public @Nullable D get(IData.Type type) { return null; } @Override - public void invalidate(Class type) { + public void invalidate(IData.Type type) { } }; private CompoundTag raw; - private final Map, IData> typed = new HashMap<>(); + private final Map typed = new HashMap<>(); private boolean clean; DataReader() { @@ -49,12 +50,10 @@ public void reset(@Nullable CompoundTag raw) { this.typed.clear(); } - @SuppressWarnings("unchecked") - public static IData readTypedPacket(FriendlyByteBuf buf) { + public static IData readTypedPacket(RegistryFriendlyByteBuf buf) { var id = buf.readResourceLocation(); - var serializer = (IData.Serializer) Registrar.get().dataId2Serializer.get(id); - - return serializer.read(buf); + var serializer = Registrar.get().dataCodecs.get(id); + return serializer.decode(buf); } @Override @@ -64,19 +63,18 @@ public CompoundTag raw() { @Override @SuppressWarnings("unchecked") - public @Nullable T get(Class type) { - return (T) typed.get(type); + public @Nullable D get(IData.Type type) { + return (D) typed.get(type.id()); } @Override - public void invalidate(Class type) { - typed.remove(type); + public void invalidate(IData.Type type) { + typed.remove(type.id()); } public void add(IData data) { clean = false; - - typed.put(Registrar.get().impl2ApiDataType.get(data.getClass()), data); + typed.put(data.type().id(), data); } } diff --git a/src/main/java/mcp/mobius/waila/access/DataType.java b/src/main/java/mcp/mobius/waila/access/DataType.java new file mode 100644 index 000000000..88f105f07 --- /dev/null +++ b/src/main/java/mcp/mobius/waila/access/DataType.java @@ -0,0 +1,17 @@ +package mcp.mobius.waila.access; + +import mcp.mobius.waila.api.IData; +import mcp.mobius.waila.registry.Registrar; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceLocation; + +public record DataType(ResourceLocation id) implements IData.Type { + + public static final StreamCodec CODEC = ResourceLocation.STREAM_CODEC + .cast() + .dispatch( + data -> data.type().id(), + id -> Registrar.get().dataCodecs.get(id)); + +} diff --git a/src/main/java/mcp/mobius/waila/access/DataWriter.java b/src/main/java/mcp/mobius/waila/access/DataWriter.java index 859004f51..92ac1611f 100644 --- a/src/main/java/mcp/mobius/waila/access/DataWriter.java +++ b/src/main/java/mcp/mobius/waila/access/DataWriter.java @@ -32,8 +32,8 @@ public enum DataWriter implements IDataWriter { private final Function rawPacket; private final Function typedPacket; - private final Map, IData> immediate = new HashMap<>(); - private final Map, List>>> lazy = new HashMap<>(); + private final Map, IData> immediate = new HashMap<>(); + private final Map, List>>> lazy = new HashMap<>(); private CompoundTag raw; private boolean clean; @@ -113,7 +113,7 @@ public CompoundTag raw() { } @Override - public void add(Class type, Consumer> consumer) { + public void add(IData.Type type, Consumer> consumer) { assertType(type); clean = false; @@ -123,7 +123,7 @@ public void add(Class type, Consumer> consumer) { @Override public void addImmediate(IData data) { - var type = data.getClass(); + var type = data.type(); assertType(type); if (lazy.containsKey(type) && !lazy.get(type).isEmpty()) throw new IllegalStateException("Data is already lazily added"); @@ -142,8 +142,8 @@ public void tryAppend(Player player, P provider, A accessor, PluginConfig } } - private void assertType(Class type) { - Preconditions.checkArgument(Registrar.get().dataType2Id.containsKey(type), "Data type is not registered"); + private void assertType(IData.Type type) { + Preconditions.checkArgument(Registrar.get().dataCodecs.containsKey(type.id()), "Data type is not registered"); Preconditions.checkState(!immediate.containsKey(type), "Data is already immediately added"); } diff --git a/src/main/java/mcp/mobius/waila/command/ServerCommand.java b/src/main/java/mcp/mobius/waila/command/ServerCommand.java index bb4a8acd7..0ecd9433b 100644 --- a/src/main/java/mcp/mobius/waila/command/ServerCommand.java +++ b/src/main/java/mcp/mobius/waila/command/ServerCommand.java @@ -17,6 +17,7 @@ import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.arguments.coordinates.BlockPosArgument; +import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.Component; import net.minecraft.server.MinecraftServer; @@ -54,7 +55,7 @@ protected void register(ArgumentBuilderBuilder command) { source.sendSuccess(() -> Component.translatable(dedicated ? Tl.Command.SERVER_DUMP_SUCCESS : Tl.Command.LOCAL_DUMP_SUCCESS, pathComponent), false); var entity = source.getEntity(); if (entity instanceof ServerPlayer player && !server.isSingleplayerOwner(player.getGameProfile())) { - PacketSender.s2c(player).send(new GenerateClientDumpPlayS2CPacket.Payload()); + PacketSender.s2c(player).send(GenerateClientDumpPlayS2CPacket.PAYLOAD); } return 1; } else { @@ -82,7 +83,7 @@ protected void register(ArgumentBuilderBuilder command) { } else if (world.getBlockEntity(pos) instanceof BaseContainerBlockEntityAccess container) { container.wthit_lockKey(new LockCode(lock)); var key = new ItemStack(Items.NAME_TAG); - key.setHoverName(Component.literal(lock)); + key.set(DataComponents.CUSTOM_NAME, Component.literal(lock)); player.setItemInHand(InteractionHand.MAIN_HAND, key); source.sendSuccess(() -> Component.literal("Locked container " + pos.toShortString() + " with lock \"" + lock + "\""), false); return 1; diff --git a/src/main/java/mcp/mobius/waila/gui/screen/PluginConfigScreen.java b/src/main/java/mcp/mobius/waila/gui/screen/PluginConfigScreen.java index 04a3f0e00..971ea6df3 100644 --- a/src/main/java/mcp/mobius/waila/gui/screen/PluginConfigScreen.java +++ b/src/main/java/mcp/mobius/waila/gui/screen/PluginConfigScreen.java @@ -19,7 +19,7 @@ import mcp.mobius.waila.gui.widget.value.EnumValue; import mcp.mobius.waila.gui.widget.value.InputValue; import mcp.mobius.waila.gui.widget.value.IntInputValue; -import mcp.mobius.waila.network.common.VersionPayload; +import mcp.mobius.waila.network.common.VersionCommonPacket; import mcp.mobius.waila.registry.Registrar; import net.minecraft.ChatFormatting; import net.minecraft.Util; @@ -109,7 +109,7 @@ public ConfigListWidget getOptions() { if (entry.blocksClientEdit() && minecraft.getCurrentServer() != null) { if (entry.getServerValue() == null) { - value.disable(PacketSender.c2s().canSend(VersionPayload.ID) + value.disable(PacketSender.c2s().canSend(VersionCommonPacket.Payload.ID) ? Tl.Config.SERVER_MISSING_OPTION : Tl.Config.SERVER_MISSING_MOD); value.setValue(entry.getClientOnlyValue()); diff --git a/src/main/java/mcp/mobius/waila/network/Packet.java b/src/main/java/mcp/mobius/waila/network/Packet.java index dedfedef2..efe82b775 100644 --- a/src/main/java/mcp/mobius/waila/network/Packet.java +++ b/src/main/java/mcp/mobius/waila/network/Packet.java @@ -1,38 +1,11 @@ package mcp.mobius.waila.network; -import lol.bai.badpackets.api.config.ClientConfigPacketReceiver; -import lol.bai.badpackets.api.config.ServerConfigPacketReceiver; -import lol.bai.badpackets.api.play.ClientPlayPacketReceiver; -import lol.bai.badpackets.api.play.ServerPlayPacketReceiver; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; +public interface Packet { -public sealed interface Packet

extends FriendlyByteBuf.Reader

{ - - ResourceLocation id(); - - P read(FriendlyByteBuf buf); - - @Override - default P apply(FriendlyByteBuf buf) { - return read(buf); + default void common() { } - non-sealed interface ConfigC2S

extends Packet

, ServerConfigPacketReceiver

{ - - } - - non-sealed interface ConfigS2C

extends Packet

, ClientConfigPacketReceiver

{ - - } - - non-sealed interface PlayC2S

extends Packet

, ServerPlayPacketReceiver

{ - - } - - non-sealed interface PlayS2C

extends Packet

, ClientPlayPacketReceiver

{ - + default void client() { } } diff --git a/src/main/java/mcp/mobius/waila/network/Packets.java b/src/main/java/mcp/mobius/waila/network/Packets.java index d64bccf0f..ea9c8f4a0 100644 --- a/src/main/java/mcp/mobius/waila/network/Packets.java +++ b/src/main/java/mcp/mobius/waila/network/Packets.java @@ -1,82 +1,65 @@ package mcp.mobius.waila.network; +import java.util.List; + import lol.bai.badpackets.api.PacketSender; import lol.bai.badpackets.api.config.ConfigPackets; import lol.bai.badpackets.api.play.PlayPackets; -import mcp.mobius.waila.network.Packet.ConfigC2S; -import mcp.mobius.waila.network.Packet.ConfigS2C; -import mcp.mobius.waila.network.Packet.PlayC2S; -import mcp.mobius.waila.network.Packet.PlayS2C; -import mcp.mobius.waila.network.common.VersionPayload; -import mcp.mobius.waila.network.common.c2s.VersionCommonC2SPacket; +import mcp.mobius.waila.network.common.VersionCommonPacket; import mcp.mobius.waila.network.common.s2c.BlacklistSyncCommonS2CPacket; import mcp.mobius.waila.network.common.s2c.ConfigSyncCommonS2CPacket; import mcp.mobius.waila.network.common.s2c.PluginSyncCommonS2CPacket; -import mcp.mobius.waila.network.config.s2c.VersionConfigS2CPacket; import mcp.mobius.waila.network.play.c2s.BlockDataRequestPlayC2SPacket; import mcp.mobius.waila.network.play.c2s.ConfigSyncRequestPlayC2SPacket; import mcp.mobius.waila.network.play.c2s.EntityDataRequestPlayC2SPacket; import mcp.mobius.waila.network.play.c2s.RawDataRequestContextPlayC2SPacket; import mcp.mobius.waila.network.play.c2s.TypedDataRequestContextPlayC2SPacket; import mcp.mobius.waila.network.play.s2c.GenerateClientDumpPlayS2CPacket; -import mcp.mobius.waila.network.play.s2c.RawDataResponsePlayS2CPacket; import mcp.mobius.waila.network.play.s2c.TypedDataResponsePlayS2CPacket; import static mcp.mobius.waila.mcless.network.NetworkConstants.NETWORK_VERSION; public class Packets { - public static void initServer() { - // Common - register(new VersionCommonC2SPacket()); + private static final List PACKETS = List.of( + new VersionCommonPacket(), + + new BlacklistSyncCommonS2CPacket(), + new ConfigSyncRequestPlayC2SPacket(), + new PluginSyncCommonS2CPacket(), - // Play - register(new BlockDataRequestPlayC2SPacket()); - register(new ConfigSyncRequestPlayC2SPacket()); - register(new EntityDataRequestPlayC2SPacket()); - register(new RawDataRequestContextPlayC2SPacket()); - register(new TypedDataRequestContextPlayC2SPacket()); + new BlockDataRequestPlayC2SPacket(), + new ConfigSyncRequestPlayC2SPacket(), + new EntityDataRequestPlayC2SPacket(), + new RawDataRequestContextPlayC2SPacket(), + new TypedDataRequestContextPlayC2SPacket(), + + new GenerateClientDumpPlayS2CPacket(), + new RawDataRequestContextPlayC2SPacket(), + new TypedDataResponsePlayS2CPacket() + ); + + public static void initServer() { + PACKETS.forEach(Packet::common); - ConfigPackets.registerServerReadyCallback((handler, sender, server) -> - sendS2CHandshakePackets(sender)); + ConfigPackets.registerServerReadyCallback(Packets::sendS2CHandshakePackets); // Older vanilla version doesn't have config stage and instead handshake happens on play stage - PlayPackets.registerServerReadyCallback((handler, sender, server) -> { - if (sender.canSend(VersionPayload.ID)) { - sendS2CHandshakePackets(sender); + PlayPackets.registerServerReadyCallback(context -> { + if (context.canSend(VersionCommonPacket.TYPE)) { + sendS2CHandshakePackets(context); } }); } public static void initClient() { - // Common - register(new PluginSyncCommonS2CPacket()); - register(new ConfigSyncCommonS2CPacket()); - register(new BlacklistSyncCommonS2CPacket()); - - // Config - register(new VersionConfigS2CPacket()); - - // Play - register(new GenerateClientDumpPlayS2CPacket()); - register(new RawDataResponsePlayS2CPacket()); - register(new TypedDataResponsePlayS2CPacket()); - - ConfigPackets.registerClientReadyCallback((handler, sender, client) -> - sendVersionPacket(sender)); - } - - @SuppressWarnings({"rawtypes", "unchecked"}) - private static void register(Packet packet) { - if (packet instanceof ConfigC2S config) ConfigPackets.registerServerReceiver(config.id(), config, config); - if (packet instanceof ConfigS2C config) ConfigPackets.registerClientReceiver(config.id(), config, config); + PACKETS.forEach(Packet::client); - if (packet instanceof PlayC2S play) PlayPackets.registerServerReceiver(play.id(), play, play); - if (packet instanceof PlayS2C play) PlayPackets.registerClientReceiver(play.id(), play, play); + ConfigPackets.registerClientReadyCallback(Packets::sendVersionPacket); } private static void sendVersionPacket(PacketSender sender) { - sender.send(new VersionPayload(NETWORK_VERSION)); + sender.send(new VersionCommonPacket.Payload(NETWORK_VERSION)); } private static void sendS2CHandshakePackets(PacketSender sender) { diff --git a/src/main/java/mcp/mobius/waila/network/common/VersionCommonPacket.java b/src/main/java/mcp/mobius/waila/network/common/VersionCommonPacket.java new file mode 100644 index 000000000..8ef02554a --- /dev/null +++ b/src/main/java/mcp/mobius/waila/network/common/VersionCommonPacket.java @@ -0,0 +1,57 @@ +package mcp.mobius.waila.network.common; + +import java.util.function.Consumer; + +import lol.bai.badpackets.api.config.ConfigPackets; +import lol.bai.badpackets.api.play.PlayPackets; +import mcp.mobius.waila.Waila; +import mcp.mobius.waila.api.WailaConstants; +import mcp.mobius.waila.network.Packet; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; + +import static mcp.mobius.waila.mcless.network.NetworkConstants.NETWORK_VERSION; + +public class VersionCommonPacket implements Packet { + + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(Waila.id("version")); + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_INT, Payload::version, + Payload::new); + + @Override + public void common() { + ConfigPackets.registerServerChannel(TYPE, CODEC); + ConfigPackets.registerClientChannel(TYPE, CODEC); + PlayPackets.registerServerChannel(TYPE, CODEC); + + ConfigPackets.registerServerReceiver(TYPE, (context, payload) -> receive(context.handler()::disconnect, payload)); + PlayPackets.registerServerReceiver(TYPE, (context, payload) -> receive(context.handler()::disconnect, payload)); + } + + @Override + public void client() { + ConfigPackets.registerClientReceiver(TYPE, (context, payload) -> receive(context::disconnect, payload)); + } + + private void receive(Consumer disconnector, Payload payload) { + if (payload.version() != NETWORK_VERSION) disconnector.accept(Component.literal( + WailaConstants.MOD_NAME + " network version mismatch! " + + "Server version is " + NETWORK_VERSION + " while client version is " + payload.version())); + } + + public record Payload( + int version + ) implements CustomPacketPayload { + + @Override + public Type type() { + return TYPE; + } + + } + +} diff --git a/src/main/java/mcp/mobius/waila/network/common/VersionPayload.java b/src/main/java/mcp/mobius/waila/network/common/VersionPayload.java deleted file mode 100644 index 277118056..000000000 --- a/src/main/java/mcp/mobius/waila/network/common/VersionPayload.java +++ /dev/null @@ -1,25 +0,0 @@ -package mcp.mobius.waila.network.common; - -import mcp.mobius.waila.Waila; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.NotNull; - -public record VersionPayload( - int version -) implements CustomPacketPayload { - - public static final ResourceLocation ID = Waila.id("version"); - - @Override - public void write(FriendlyByteBuf buf) { - buf.writeVarInt(version); - } - - @Override - public @NotNull ResourceLocation id() { - return ID; - } - -} diff --git a/src/main/java/mcp/mobius/waila/network/common/c2s/VersionCommonC2SPacket.java b/src/main/java/mcp/mobius/waila/network/common/c2s/VersionCommonC2SPacket.java deleted file mode 100644 index 6dbc9ac8a..000000000 --- a/src/main/java/mcp/mobius/waila/network/common/c2s/VersionCommonC2SPacket.java +++ /dev/null @@ -1,49 +0,0 @@ -package mcp.mobius.waila.network.common.c2s; - -import lol.bai.badpackets.api.PacketSender; -import mcp.mobius.waila.api.WailaConstants; -import mcp.mobius.waila.network.Packet; -import mcp.mobius.waila.network.common.VersionPayload; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.network.ServerCommonPacketListenerImpl; -import net.minecraft.server.network.ServerConfigurationPacketListenerImpl; -import net.minecraft.server.network.ServerGamePacketListenerImpl; - -import static mcp.mobius.waila.mcless.network.NetworkConstants.NETWORK_VERSION; - -public class VersionCommonC2SPacket implements - Packet.ConfigC2S, - Packet.PlayC2S { - - @Override - public ResourceLocation id() { - return VersionPayload.ID; - } - - @Override - public VersionPayload read(FriendlyByteBuf buf) { - return new VersionPayload(buf.readVarInt()); - } - - private void receive(ServerCommonPacketListenerImpl handler, VersionPayload payload) { - if (payload.version() != NETWORK_VERSION) handler.disconnect(Component.literal( - WailaConstants.MOD_NAME + " network version mismatch! " + - "Server version is " + NETWORK_VERSION + " while client version is " + payload.version())); - } - - @Override - public void receive(MinecraftServer server, ServerConfigurationPacketListenerImpl handler, VersionPayload payload, PacketSender responseSender, TaskFinisher taskFinisher) { - receive(handler, payload); - } - - @Override - public void receive(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, VersionPayload payload, PacketSender responseSender) { - receive(handler, payload); - } - - -} diff --git a/src/main/java/mcp/mobius/waila/network/common/s2c/BlacklistSyncCommonS2CPacket.java b/src/main/java/mcp/mobius/waila/network/common/s2c/BlacklistSyncCommonS2CPacket.java index eb65b892c..5a5557ef3 100644 --- a/src/main/java/mcp/mobius/waila/network/common/s2c/BlacklistSyncCommonS2CPacket.java +++ b/src/main/java/mcp/mobius/waila/network/common/s2c/BlacklistSyncCommonS2CPacket.java @@ -3,50 +3,40 @@ import java.util.HashSet; import java.util.Set; -import lol.bai.badpackets.api.PacketSender; +import lol.bai.badpackets.api.config.ConfigPackets; +import lol.bai.badpackets.api.play.PlayPackets; import mcp.mobius.waila.Waila; import mcp.mobius.waila.network.Packet; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientConfigurationPacketListenerImpl; -import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.NotNull; -public class BlacklistSyncCommonS2CPacket implements - Packet.ConfigS2C, - Packet.PlayS2C { +public class BlacklistSyncCommonS2CPacket implements Packet { - public static final ResourceLocation ID = Waila.id("blacklist"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(Waila.id("blacklist")); + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.collection(HashSet::new, ByteBufCodecs.STRING_UTF8), Payload::blockRules, + ByteBufCodecs.collection(HashSet::new, ByteBufCodecs.STRING_UTF8), Payload::blockEntityRules, + ByteBufCodecs.collection(HashSet::new, ByteBufCodecs.STRING_UTF8), Payload::entityRules, + Payload::new); @Override - public ResourceLocation id() { - return ID; + public void common() { + ConfigPackets.registerClientChannel(TYPE, CODEC); + PlayPackets.registerClientChannel(TYPE, CODEC); } @Override - public Payload read(FriendlyByteBuf buf) { - return new Payload( - buf.readCollection(HashSet::new, FriendlyByteBuf::readUtf), - buf.readCollection(HashSet::new, FriendlyByteBuf::readUtf), - buf.readCollection(HashSet::new, FriendlyByteBuf::readUtf)); + public void client() { + ConfigPackets.registerClientReceiver(TYPE, (context, payload) -> receive(payload)); + PlayPackets.registerClientReceiver(TYPE, (context, payload) -> receive(payload)); } private static void receive(Payload payload) { Waila.BLACKLIST_CONFIG.get().getView().sync(payload.blockRules, payload.blockEntityRules, payload.entityRules); } - @Override - public void receive(Minecraft client, ClientConfigurationPacketListenerImpl handler, Payload payload, PacketSender responseSender) { - receive(payload); - } - - @Override - public void receive(Minecraft client, ClientPacketListener handler, Payload payload, PacketSender responseSender) { - receive(payload); - } - public record Payload( Set blockRules, Set blockEntityRules, @@ -58,15 +48,8 @@ public Payload() { } @Override - public void write(@NotNull FriendlyByteBuf buf) { - buf.writeCollection(blockRules, FriendlyByteBuf::writeUtf); - buf.writeCollection(blockEntityRules, FriendlyByteBuf::writeUtf); - buf.writeCollection(entityRules, FriendlyByteBuf::writeUtf); - } - - @Override - public @NotNull ResourceLocation id() { - return ID; + public Type type() { + return TYPE; } } diff --git a/src/main/java/mcp/mobius/waila/network/common/s2c/ConfigSyncCommonS2CPacket.java b/src/main/java/mcp/mobius/waila/network/common/s2c/ConfigSyncCommonS2CPacket.java index fa4597f64..c5ae6617f 100644 --- a/src/main/java/mcp/mobius/waila/network/common/s2c/ConfigSyncCommonS2CPacket.java +++ b/src/main/java/mcp/mobius/waila/network/common/s2c/ConfigSyncCommonS2CPacket.java @@ -5,41 +5,58 @@ import java.util.stream.Collectors; import com.google.gson.Gson; -import lol.bai.badpackets.api.PacketSender; +import lol.bai.badpackets.api.config.ConfigPackets; +import lol.bai.badpackets.api.play.PlayPackets; import mcp.mobius.waila.Waila; import mcp.mobius.waila.config.ConfigEntry; import mcp.mobius.waila.config.PluginConfig; import mcp.mobius.waila.network.Packet; import mcp.mobius.waila.util.Log; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientConfigurationPacketListenerImpl; -import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.NotNull; import static mcp.mobius.waila.mcless.network.NetworkConstants.CONFIG_BOOL; import static mcp.mobius.waila.mcless.network.NetworkConstants.CONFIG_DOUBLE; import static mcp.mobius.waila.mcless.network.NetworkConstants.CONFIG_INT; import static mcp.mobius.waila.mcless.network.NetworkConstants.CONFIG_STRING; -public class ConfigSyncCommonS2CPacket implements - Packet.ConfigS2C, - Packet.PlayS2C { - - public static final ResourceLocation ID = Waila.id("config"); +public class ConfigSyncCommonS2CPacket implements Packet { private static final Log LOG = Log.create(); private static final Gson GSON = new Gson(); - - @Override - public ResourceLocation id() { - return ID; - } - - @Override - public Payload read(FriendlyByteBuf buf) { + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(Waila.id("config")); + public static final StreamCodec CODEC = StreamCodec.ofMember((p, buf) -> { + var groups = p.map.keySet().stream() + .collect(Collectors.groupingBy(ResourceLocation::getNamespace)); + + buf.writeVarInt(groups.size()); + groups.forEach((namespace, entries) -> { + buf.writeUtf(namespace); + buf.writeVarInt(entries.size()); + entries.forEach(e -> { + buf.writeUtf(e.getPath()); + var v = p.map.get(e); + if (v instanceof Boolean z) { + buf.writeByte(CONFIG_BOOL); + buf.writeBoolean(z); + } else if (v instanceof Integer i) { + buf.writeByte(CONFIG_INT); + buf.writeVarInt(i); + } else if (v instanceof Double d) { + buf.writeByte(CONFIG_DOUBLE); + buf.writeDouble(d); + } else if (v instanceof String str) { + buf.writeByte(CONFIG_STRING); + buf.writeUtf(str); + } else if (v instanceof Enum en) { + buf.writeByte(CONFIG_STRING); + buf.writeUtf(en.name()); + } + }); + }); + }, buf -> { Map map = new HashMap<>(); var groupSize = buf.readVarInt(); for (var i = 0; i < groupSize; i++) { @@ -58,6 +75,18 @@ public Payload read(FriendlyByteBuf buf) { } return new Payload(map); + }); + + @Override + public void common() { + ConfigPackets.registerClientChannel(TYPE, CODEC); + PlayPackets.registerClientChannel(TYPE, CODEC); + } + + @Override + public void client() { + ConfigPackets.registerClientReceiver(TYPE, (context, payload) -> receive(payload)); + PlayPackets.registerClientReceiver(TYPE, (context, payload) -> receive(payload)); } private static void receive(Payload payload) { @@ -82,16 +111,6 @@ private static void receive(Payload payload) { LOG.info("Received config from the server: {}", GSON.toJson(map)); } - @Override - public void receive(Minecraft client, ClientConfigurationPacketListenerImpl handler, Payload payload, PacketSender responseSender) { - receive(payload); - } - - @Override - public void receive(Minecraft client, ClientPacketListener handler, Payload payload, PacketSender responseSender) { - receive(payload); - } - public record Payload( Map map ) implements CustomPacketPayload { @@ -103,40 +122,8 @@ public Payload() { } @Override - public void write(@NotNull FriendlyByteBuf buf) { - var groups = map.keySet().stream() - .collect(Collectors.groupingBy(ResourceLocation::getNamespace)); - - buf.writeVarInt(groups.size()); - groups.forEach((namespace, entries) -> { - buf.writeUtf(namespace); - buf.writeVarInt(entries.size()); - entries.forEach(e -> { - buf.writeUtf(e.getPath()); - var v = map.get(e); - if (v instanceof Boolean z) { - buf.writeByte(CONFIG_BOOL); - buf.writeBoolean(z); - } else if (v instanceof Integer i) { - buf.writeByte(CONFIG_INT); - buf.writeVarInt(i); - } else if (v instanceof Double d) { - buf.writeByte(CONFIG_DOUBLE); - buf.writeDouble(d); - } else if (v instanceof String str) { - buf.writeByte(CONFIG_STRING); - buf.writeUtf(str); - } else if (v instanceof Enum en) { - buf.writeByte(CONFIG_STRING); - buf.writeUtf(en.name()); - } - }); - }); - } - - @Override - public @NotNull ResourceLocation id() { - return ID; + public Type type() { + return TYPE; } } diff --git a/src/main/java/mcp/mobius/waila/network/common/s2c/PluginSyncCommonS2CPacket.java b/src/main/java/mcp/mobius/waila/network/common/s2c/PluginSyncCommonS2CPacket.java index 2d86e5c78..b0b9320e9 100644 --- a/src/main/java/mcp/mobius/waila/network/common/s2c/PluginSyncCommonS2CPacket.java +++ b/src/main/java/mcp/mobius/waila/network/common/s2c/PluginSyncCommonS2CPacket.java @@ -1,34 +1,38 @@ package mcp.mobius.waila.network.common.s2c; +import java.util.ArrayList; import java.util.List; -import lol.bai.badpackets.api.PacketSender; +import lol.bai.badpackets.api.config.ConfigPackets; +import lol.bai.badpackets.api.play.PlayPackets; import mcp.mobius.waila.Waila; import mcp.mobius.waila.api.IPluginInfo; import mcp.mobius.waila.network.Packet; import mcp.mobius.waila.plugin.PluginInfo; import mcp.mobius.waila.plugin.PluginLoader; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientConfigurationPacketListenerImpl; -import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; -public class PluginSyncCommonS2CPacket implements - Packet.ConfigS2C, - Packet.PlayS2C { +public class PluginSyncCommonS2CPacket implements Packet { - public static final ResourceLocation ID = Waila.id("plugin"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(Waila.id("plugin")); + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.collection(ArrayList::new, ResourceLocation.STREAM_CODEC), Payload::plugins, + Payload::new); @Override - public ResourceLocation id() { - return ID; + public void common() { + ConfigPackets.registerClientChannel(TYPE, CODEC); + PlayPackets.registerClientChannel(TYPE, CODEC); } @Override - public Payload read(FriendlyByteBuf buf) { - return new Payload(buf.readList(FriendlyByteBuf::readResourceLocation)); + public void client() { + ConfigPackets.registerClientReceiver(TYPE, (context, payload) -> receive(payload)); + PlayPackets.registerClientReceiver(TYPE, (context, payload) -> receive(payload)); } private static void receive(Payload payload) { @@ -41,16 +45,6 @@ private static void receive(Payload payload) { PluginLoader.INSTANCE.loadPlugins(); } - @Override - public void receive(Minecraft client, ClientConfigurationPacketListenerImpl handler, Payload payload, PacketSender responseSender) { - receive(payload); - } - - @Override - public void receive(Minecraft client, ClientPacketListener handler, Payload payload, PacketSender responseSender) { - receive(payload); - } - public record Payload( List plugins ) implements CustomPacketPayload { @@ -63,13 +57,8 @@ public Payload() { } @Override - public void write(FriendlyByteBuf buf) { - buf.writeCollection(plugins, FriendlyByteBuf::writeResourceLocation); - } - - @Override - public ResourceLocation id() { - return ID; + public Type type() { + return TYPE; } } diff --git a/src/main/java/mcp/mobius/waila/network/config/s2c/VersionConfigS2CPacket.java b/src/main/java/mcp/mobius/waila/network/config/s2c/VersionConfigS2CPacket.java deleted file mode 100644 index 09d62c349..000000000 --- a/src/main/java/mcp/mobius/waila/network/config/s2c/VersionConfigS2CPacket.java +++ /dev/null @@ -1,43 +0,0 @@ -package mcp.mobius.waila.network.config.s2c; - -import lol.bai.badpackets.api.PacketSender; -import lol.bai.badpackets.api.config.ConfigPackets; -import mcp.mobius.waila.api.WailaConstants; -import mcp.mobius.waila.network.Packet; -import mcp.mobius.waila.network.common.VersionPayload; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientConfigurationPacketListenerImpl; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; - -import static mcp.mobius.waila.mcless.network.NetworkConstants.NETWORK_VERSION; - -public class VersionConfigS2CPacket implements Packet.ConfigS2C { - - @Override - public ResourceLocation id() { - return VersionPayload.ID; - } - - @Override - public VersionPayload read(FriendlyByteBuf buf) { - return new VersionPayload(buf.readVarInt()); - } - - private Component receive(VersionPayload payload) { - return payload.version() != NETWORK_VERSION - ? Component.literal(WailaConstants.MOD_NAME + " network version mismatch! Server version is " + payload.version() + " while client version is " + NETWORK_VERSION) - : null; - } - - @Override - public void receive(Minecraft client, ClientConfigurationPacketListenerImpl handler, VersionPayload payload, PacketSender responseSender) { - var disconnectReason = receive(payload); - - if (disconnectReason != null) { - ConfigPackets.disconnect(handler, disconnectReason); - } - } - -} diff --git a/src/main/java/mcp/mobius/waila/network/play/c2s/BlockDataRequestPlayC2SPacket.java b/src/main/java/mcp/mobius/waila/network/play/c2s/BlockDataRequestPlayC2SPacket.java index d3ea21706..eae0449df 100644 --- a/src/main/java/mcp/mobius/waila/network/play/c2s/BlockDataRequestPlayC2SPacket.java +++ b/src/main/java/mcp/mobius/waila/network/play/c2s/BlockDataRequestPlayC2SPacket.java @@ -1,6 +1,6 @@ package mcp.mobius.waila.network.play.c2s; -import lol.bai.badpackets.api.PacketSender; +import lol.bai.badpackets.api.play.PlayPackets; import mcp.mobius.waila.Waila; import mcp.mobius.waila.access.DataReader; import mcp.mobius.waila.access.DataWriter; @@ -12,68 +12,61 @@ import mcp.mobius.waila.registry.Registrar; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.BlockHitResult; -import org.jetbrains.annotations.NotNull; -public class BlockDataRequestPlayC2SPacket implements Packet.PlayC2S { +public class BlockDataRequestPlayC2SPacket implements Packet { - public static final ResourceLocation ID = Waila.id("block"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(Waila.id("block")); + public static final StreamCodec CODEC = StreamCodec.ofMember( + (p, buf) -> buf.writeBlockHitResult(p.hitResult), + buf -> new Payload(buf.readBlockHitResult())); @Override - public ResourceLocation id() { - return ID; - } - - @Override - public Payload read(FriendlyByteBuf buf) { - return new Payload(buf.readBlockHitResult()); - } - - @Override - public void receive(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, Payload payload, PacketSender responseSender) { - var hitResult = payload.hitResult; - - var registrar = Registrar.get(); - var world = player.level(); - var pos = hitResult.getBlockPos(); - - //noinspection deprecation - if (!world.hasChunkAt(pos)) { - return; - } - - var blockEntity = world.getBlockEntity(pos); - if (blockEntity == null) { - return; - } - - var state = world.getBlockState(pos); - var raw = DataWriter.SERVER.reset(); - IServerAccessor accessor = ServerAccessor.INSTANCE.set(world, player, hitResult, blockEntity); - - for (var provider : registrar.blockData.get(blockEntity)) { - DataWriter.SERVER.tryAppend(player, provider.instance(), accessor, PluginConfig.SERVER, IDataProvider::appendData); - } - - for (var provider : registrar.blockData.get(state.getBlock())) { - DataWriter.SERVER.tryAppend(player, provider.instance(), accessor, PluginConfig.SERVER, IDataProvider::appendData); - } - - raw.putInt("x", pos.getX()); - raw.putInt("y", pos.getY()); - raw.putInt("z", pos.getZ()); - //noinspection ConstantConditions - raw.putString("id", BuiltInRegistries.BLOCK_ENTITY_TYPE.getKey(blockEntity.getType()).toString()); - raw.putLong("WailaTime", System.currentTimeMillis()); - - DataWriter.SERVER.send(responseSender, player); - DataReader.SERVER.reset(null); + public void common() { + PlayPackets.registerServerChannel(TYPE, CODEC); + PlayPackets.registerServerReceiver(TYPE, (context, payload) -> { + var player = context.player(); + var hitResult = payload.hitResult; + + var registrar = Registrar.get(); + var world = player.level(); + var pos = hitResult.getBlockPos(); + + //noinspection deprecation + if (!world.hasChunkAt(pos)) { + return; + } + + var blockEntity = world.getBlockEntity(pos); + if (blockEntity == null) { + return; + } + + var state = world.getBlockState(pos); + var raw = DataWriter.SERVER.reset(); + IServerAccessor accessor = ServerAccessor.INSTANCE.set(world, player, hitResult, blockEntity); + + for (var provider : registrar.blockData.get(blockEntity)) { + DataWriter.SERVER.tryAppend(player, provider.instance(), accessor, PluginConfig.SERVER, IDataProvider::appendData); + } + + for (var provider : registrar.blockData.get(state.getBlock())) { + DataWriter.SERVER.tryAppend(player, provider.instance(), accessor, PluginConfig.SERVER, IDataProvider::appendData); + } + + raw.putInt("x", pos.getX()); + raw.putInt("y", pos.getY()); + raw.putInt("z", pos.getZ()); + //noinspection ConstantConditions + raw.putString("id", BuiltInRegistries.BLOCK_ENTITY_TYPE.getKey(blockEntity.getType()).toString()); + raw.putLong("WailaTime", System.currentTimeMillis()); + + DataWriter.SERVER.send(context, player); + DataReader.SERVER.reset(null); + }); } public record Payload( @@ -81,13 +74,8 @@ public record Payload( ) implements CustomPacketPayload { @Override - public void write(FriendlyByteBuf buf) { - buf.writeBlockHitResult(hitResult); - } - - @Override - public @NotNull ResourceLocation id() { - return ID; + public Type type() { + return TYPE; } } diff --git a/src/main/java/mcp/mobius/waila/network/play/c2s/ConfigSyncRequestPlayC2SPacket.java b/src/main/java/mcp/mobius/waila/network/play/c2s/ConfigSyncRequestPlayC2SPacket.java index 612648ab2..beea3e0bf 100644 --- a/src/main/java/mcp/mobius/waila/network/play/c2s/ConfigSyncRequestPlayC2SPacket.java +++ b/src/main/java/mcp/mobius/waila/network/play/c2s/ConfigSyncRequestPlayC2SPacket.java @@ -1,46 +1,37 @@ package mcp.mobius.waila.network.play.c2s; -import lol.bai.badpackets.api.PacketSender; +import lol.bai.badpackets.api.play.PlayPackets; import mcp.mobius.waila.Waila; import mcp.mobius.waila.network.Packet; import mcp.mobius.waila.network.common.s2c.BlacklistSyncCommonS2CPacket; import mcp.mobius.waila.network.common.s2c.ConfigSyncCommonS2CPacket; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.network.ServerGamePacketListenerImpl; -public class ConfigSyncRequestPlayC2SPacket implements Packet.PlayC2S { +public class ConfigSyncRequestPlayC2SPacket implements Packet { - public static final ResourceLocation ID = Waila.id("config_sync_req"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(Waila.id("config_sync_req")); + public static final Payload PAYLOAD = new Payload(); + public static final StreamCodec CODEC = StreamCodec.unit(PAYLOAD); @Override - public ResourceLocation id() { - return ID; + public void common() { + PlayPackets.registerServerChannel(TYPE, CODEC); + PlayPackets.registerServerReceiver(TYPE, (context, payload) -> { + context.send(new BlacklistSyncCommonS2CPacket.Payload()); + context.send(new ConfigSyncCommonS2CPacket.Payload()); + }); } - @Override - public Payload read(FriendlyByteBuf buf) { - return new Payload(); - } + public static class Payload implements CustomPacketPayload { - @Override - public void receive(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, Payload payload, PacketSender responseSender) { - responseSender.send(new BlacklistSyncCommonS2CPacket.Payload()); - responseSender.send(new ConfigSyncCommonS2CPacket.Payload()); - } - - public record Payload() implements CustomPacketPayload { - - @Override - public void write(FriendlyByteBuf buf) { + private Payload() { } @Override - public ResourceLocation id() { - return ID; + public Type type() { + return TYPE; } } diff --git a/src/main/java/mcp/mobius/waila/network/play/c2s/EntityDataRequestPlayC2SPacket.java b/src/main/java/mcp/mobius/waila/network/play/c2s/EntityDataRequestPlayC2SPacket.java index 3a30e6c6e..4ee3fdaa9 100644 --- a/src/main/java/mcp/mobius/waila/network/play/c2s/EntityDataRequestPlayC2SPacket.java +++ b/src/main/java/mcp/mobius/waila/network/play/c2s/EntityDataRequestPlayC2SPacket.java @@ -1,6 +1,6 @@ package mcp.mobius.waila.network.play.c2s; -import lol.bai.badpackets.api.PacketSender; +import lol.bai.badpackets.api.play.PlayPackets; import mcp.mobius.waila.Waila; import mcp.mobius.waila.access.DataReader; import mcp.mobius.waila.access.DataWriter; @@ -11,55 +11,54 @@ import mcp.mobius.waila.network.Packet; import mcp.mobius.waila.registry.Registrar; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.NotNull; -public class EntityDataRequestPlayC2SPacket implements Packet.PlayC2S { +public class EntityDataRequestPlayC2SPacket implements Packet { - public static final ResourceLocation ID = Waila.id("entity"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(Waila.id("entity")); + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_INT, Payload::entityId, + StreamCodec.composite( + ByteBufCodecs.DOUBLE, Vec3::x, + ByteBufCodecs.DOUBLE, Vec3::y, + ByteBufCodecs.DOUBLE, Vec3::z, + Vec3::new), Payload::hitPos, + Payload::new); @Override - public ResourceLocation id() { - return ID; - } - - @Override - public Payload read(FriendlyByteBuf buf) { - return new Payload(buf.readVarInt(), new Vec3(buf.readDouble(), buf.readDouble(), buf.readDouble())); - } - - @Override - public void receive(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, Payload payload, PacketSender responseSender) { - var entityId = payload.entityId; - var hitPos = payload.hitPos; - - var registrar = Registrar.get(); - var world = player.level(); - var entity = world.getEntity(entityId); - - if (entity == null) { - return; - } - - var raw = DataWriter.SERVER.reset(); - IServerAccessor accessor = ServerAccessor.INSTANCE.set(world, player, new EntityHitResult(entity, hitPos), entity); - - for (var provider : registrar.entityData.get(entity)) { - DataWriter.SERVER.tryAppend(player, provider.instance(), accessor, PluginConfig.SERVER, IDataProvider::appendData); - } - - raw.putInt("WailaEntityID", entity.getId()); - raw.putLong("WailaTime", System.currentTimeMillis()); - - DataWriter.SERVER.send(responseSender, player); - DataReader.SERVER.reset(null); + public void common() { + PlayPackets.registerServerChannel(TYPE, CODEC); + PlayPackets.registerServerReceiver(TYPE, (context, payload) -> { + var player = context.player(); + var entityId = payload.entityId; + var hitPos = payload.hitPos; + + var registrar = Registrar.get(); + var world = player.level(); + var entity = world.getEntity(entityId); + + if (entity == null) { + return; + } + + var raw = DataWriter.SERVER.reset(); + IServerAccessor accessor = ServerAccessor.INSTANCE.set(world, player, new EntityHitResult(entity, hitPos), entity); + + for (var provider : registrar.entityData.get(entity)) { + DataWriter.SERVER.tryAppend(player, provider.instance(), accessor, PluginConfig.SERVER, IDataProvider::appendData); + } + + raw.putInt("WailaEntityID", entity.getId()); + raw.putLong("WailaTime", System.currentTimeMillis()); + + DataWriter.SERVER.send(context, player); + DataReader.SERVER.reset(null); + }); } public record Payload( @@ -68,16 +67,8 @@ public record Payload( ) implements CustomPacketPayload { @Override - public void write(FriendlyByteBuf buf) { - buf.writeVarInt(entityId); - buf.writeDouble(hitPos.x); - buf.writeDouble(hitPos.y); - buf.writeDouble(hitPos.z); - } - - @Override - public @NotNull ResourceLocation id() { - return ID; + public Type type() { + return TYPE; } } diff --git a/src/main/java/mcp/mobius/waila/network/play/c2s/RawDataRequestContextPlayC2SPacket.java b/src/main/java/mcp/mobius/waila/network/play/c2s/RawDataRequestContextPlayC2SPacket.java index 69c37d2cc..948c222ba 100644 --- a/src/main/java/mcp/mobius/waila/network/play/c2s/RawDataRequestContextPlayC2SPacket.java +++ b/src/main/java/mcp/mobius/waila/network/play/c2s/RawDataRequestContextPlayC2SPacket.java @@ -1,35 +1,26 @@ package mcp.mobius.waila.network.play.c2s; -import lol.bai.badpackets.api.PacketSender; +import lol.bai.badpackets.api.play.PlayPackets; import mcp.mobius.waila.Waila; import mcp.mobius.waila.access.DataReader; import mcp.mobius.waila.network.Packet; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.network.ServerGamePacketListenerImpl; -import org.jetbrains.annotations.NotNull; -public class RawDataRequestContextPlayC2SPacket implements Packet.PlayC2S { +public class RawDataRequestContextPlayC2SPacket implements Packet { - public static final ResourceLocation ID = Waila.id("ctx"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(Waila.id("ctx")); + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.COMPOUND_TAG, Payload::ctx, + Payload::new); @Override - public ResourceLocation id() { - return ID; - } - - @Override - public Payload read(FriendlyByteBuf buf) { - return new Payload(buf.readNbt()); - } - - @Override - public void receive(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, Payload payload, PacketSender responseSender) { - DataReader.SERVER.reset(payload.ctx); + public void common() { + PlayPackets.registerServerChannel(TYPE, CODEC); + PlayPackets.registerServerReceiver(TYPE, (context, payload) -> DataReader.SERVER.reset(payload.ctx)); } public record Payload( @@ -37,13 +28,8 @@ public record Payload( ) implements CustomPacketPayload { @Override - public void write(FriendlyByteBuf buf) { - buf.writeNbt(ctx); - } - - @Override - public @NotNull ResourceLocation id() { - return ID; + public Type type() { + return TYPE; } } diff --git a/src/main/java/mcp/mobius/waila/network/play/c2s/TypedDataRequestContextPlayC2SPacket.java b/src/main/java/mcp/mobius/waila/network/play/c2s/TypedDataRequestContextPlayC2SPacket.java index 784fa8aab..57f87846b 100644 --- a/src/main/java/mcp/mobius/waila/network/play/c2s/TypedDataRequestContextPlayC2SPacket.java +++ b/src/main/java/mcp/mobius/waila/network/play/c2s/TypedDataRequestContextPlayC2SPacket.java @@ -1,36 +1,26 @@ package mcp.mobius.waila.network.play.c2s; -import lol.bai.badpackets.api.PacketSender; +import lol.bai.badpackets.api.play.PlayPackets; import mcp.mobius.waila.Waila; import mcp.mobius.waila.access.DataReader; +import mcp.mobius.waila.access.DataType; import mcp.mobius.waila.api.IData; import mcp.mobius.waila.network.Packet; -import mcp.mobius.waila.registry.Registrar; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.network.ServerGamePacketListenerImpl; -import org.jetbrains.annotations.NotNull; -public class TypedDataRequestContextPlayC2SPacket implements Packet.PlayC2S { +public class TypedDataRequestContextPlayC2SPacket implements Packet { - public static final ResourceLocation ID = Waila.id("ctx_typed"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(Waila.id("ctx_typed")); + public static final StreamCodec CODEC = StreamCodec.composite( + DataType.CODEC, Payload::ctx, + Payload::new); @Override - public ResourceLocation id() { - return ID; - } - - @Override - public Payload read(FriendlyByteBuf buf) { - return new Payload(DataReader.readTypedPacket(buf)); - } - - @Override - public void receive(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, Payload payload, PacketSender responseSender) { - DataReader.SERVER.add(payload.ctx); + public void common() { + PlayPackets.registerServerChannel(TYPE, CODEC); + PlayPackets.registerServerReceiver(TYPE, (context, payload) -> DataReader.SERVER.add(payload.ctx)); } public record Payload( @@ -38,14 +28,8 @@ public record Payload( ) implements CustomPacketPayload { @Override - public void write(FriendlyByteBuf buf) { - buf.writeResourceLocation(Registrar.get().dataType2Id.get(ctx.getClass())); - ctx.write(buf); - } - - @Override - public @NotNull ResourceLocation id() { - return ID; + public Type type() { + return TYPE; } } diff --git a/src/main/java/mcp/mobius/waila/network/play/s2c/GenerateClientDumpPlayS2CPacket.java b/src/main/java/mcp/mobius/waila/network/play/s2c/GenerateClientDumpPlayS2CPacket.java index 963bb08e4..ebafac151 100644 --- a/src/main/java/mcp/mobius/waila/network/play/s2c/GenerateClientDumpPlayS2CPacket.java +++ b/src/main/java/mcp/mobius/waila/network/play/s2c/GenerateClientDumpPlayS2CPacket.java @@ -1,53 +1,49 @@ package mcp.mobius.waila.network.play.s2c; -import lol.bai.badpackets.api.PacketSender; +import lol.bai.badpackets.api.play.PlayPackets; import mcp.mobius.waila.Waila; import mcp.mobius.waila.buildconst.Tl; import mcp.mobius.waila.debug.DumpGenerator; import mcp.mobius.waila.network.Packet; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.NotNull; -public class GenerateClientDumpPlayS2CPacket implements Packet.PlayS2C { +public class GenerateClientDumpPlayS2CPacket implements Packet { - public static final ResourceLocation ID = Waila.id("generate_client_dump"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(Waila.id("generate_client_dump")); + public static final Payload PAYLOAD = new Payload(); + public static final StreamCodec CODEC = StreamCodec.unit(PAYLOAD); @Override - public ResourceLocation id() { - return ID; + public void common() { + PlayPackets.registerClientChannel(TYPE, CODEC); } @Override - public Payload read(FriendlyByteBuf buf) { - return new Payload(); + public void client() { + PlayPackets.registerClientReceiver(TYPE, (context, payload) -> { + var client = context.client(); + var path = DumpGenerator.generate(DumpGenerator.CLIENT); + if (path != null && client.player != null) { + Component pathComponent = Component.literal(path.toString()).withStyle(style -> style + .withUnderlined(true) + .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_FILE, path.toString()))); + client.player.displayClientMessage(Component.translatable(Tl.Command.CLIENT_DUMP_SUCCESS, pathComponent), false); + } + }); } - @Override - public void receive(Minecraft client, ClientPacketListener handler, Payload payload, PacketSender responseSender) { - var path = DumpGenerator.generate(DumpGenerator.CLIENT); - if (path != null && client.player != null) { - Component pathComponent = Component.literal(path.toString()).withStyle(style -> style - .withUnderlined(true) - .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_FILE, path.toString()))); - client.player.displayClientMessage(Component.translatable(Tl.Command.CLIENT_DUMP_SUCCESS, pathComponent), false); - } - } + public static class Payload implements CustomPacketPayload { - public record Payload() implements CustomPacketPayload { - - @Override - public void write(@NotNull FriendlyByteBuf buf) { + private Payload() { } @Override - public @NotNull ResourceLocation id() { - return ID; + public Type type() { + return TYPE; } } diff --git a/src/main/java/mcp/mobius/waila/network/play/s2c/RawDataResponsePlayS2CPacket.java b/src/main/java/mcp/mobius/waila/network/play/s2c/RawDataResponsePlayS2CPacket.java index c3974c709..69320a9a6 100644 --- a/src/main/java/mcp/mobius/waila/network/play/s2c/RawDataResponsePlayS2CPacket.java +++ b/src/main/java/mcp/mobius/waila/network/play/s2c/RawDataResponsePlayS2CPacket.java @@ -1,34 +1,30 @@ package mcp.mobius.waila.network.play.s2c; -import lol.bai.badpackets.api.PacketSender; +import lol.bai.badpackets.api.play.PlayPackets; import mcp.mobius.waila.Waila; import mcp.mobius.waila.access.DataReader; import mcp.mobius.waila.network.Packet; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.NotNull; -public class RawDataResponsePlayS2CPacket implements Packet.PlayS2C { +public class RawDataResponsePlayS2CPacket implements Packet { - public static final ResourceLocation ID = Waila.id("data"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(Waila.id("data")); + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.COMPOUND_TAG, Payload::data, + Payload::new); @Override - public ResourceLocation id() { - return ID; + public void common() { + PlayPackets.registerClientChannel(TYPE, CODEC); } @Override - public Payload read(FriendlyByteBuf buf) { - return new Payload(buf.readNbt()); - } - - @Override - public void receive(Minecraft client, ClientPacketListener handler, Payload payload, PacketSender responseSender) { - DataReader.CLIENT.reset(payload.data); + public void client() { + PlayPackets.registerClientReceiver(TYPE, (context, payload) -> DataReader.CLIENT.reset(payload.data)); } public record Payload( @@ -36,13 +32,8 @@ public record Payload( ) implements CustomPacketPayload { @Override - public void write(FriendlyByteBuf buf) { - buf.writeNbt(data); - } - - @Override - public @NotNull ResourceLocation id() { - return ID; + public Type type() { + return TYPE; } } diff --git a/src/main/java/mcp/mobius/waila/network/play/s2c/TypedDataResponsePlayS2CPacket.java b/src/main/java/mcp/mobius/waila/network/play/s2c/TypedDataResponsePlayS2CPacket.java index f52a8bbe7..499f898f6 100644 --- a/src/main/java/mcp/mobius/waila/network/play/s2c/TypedDataResponsePlayS2CPacket.java +++ b/src/main/java/mcp/mobius/waila/network/play/s2c/TypedDataResponsePlayS2CPacket.java @@ -1,35 +1,32 @@ package mcp.mobius.waila.network.play.s2c; -import lol.bai.badpackets.api.PacketSender; +import lol.bai.badpackets.api.play.PlayPackets; import mcp.mobius.waila.Waila; import mcp.mobius.waila.access.DataReader; +import mcp.mobius.waila.access.DataType; import mcp.mobius.waila.api.IData; import mcp.mobius.waila.network.Packet; -import mcp.mobius.waila.registry.Registrar; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientPacketListener; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.NotNull; -public class TypedDataResponsePlayS2CPacket implements Packet.PlayS2C { +public class TypedDataResponsePlayS2CPacket implements Packet { public static final ResourceLocation ID = Waila.id("data_typed"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec CODEC = StreamCodec.composite( + DataType.CODEC, Payload::data, + Payload::new); @Override - public ResourceLocation id() { - return ID; + public void common() { + PlayPackets.registerClientChannel(TYPE, CODEC); } @Override - public Payload read(FriendlyByteBuf buf) { - return new Payload(DataReader.readTypedPacket(buf)); - } - - @Override - public void receive(Minecraft client, ClientPacketListener handler, Payload payload, PacketSender responseSender) { - DataReader.CLIENT.add(payload.data); + public void client() { + PlayPackets.registerClientReceiver(TYPE, (context, payload) -> DataReader.CLIENT.add(payload.data)); } public record Payload( @@ -37,14 +34,8 @@ public record Payload( ) implements CustomPacketPayload { @Override - public void write(FriendlyByteBuf buf) { - buf.writeResourceLocation(Registrar.get().dataType2Id.get(data.getClass())); - data.write(buf); - } - - @Override - public @NotNull ResourceLocation id() { - return ID; + public Type type() { + return TYPE; } } diff --git a/src/main/java/mcp/mobius/waila/plugin/PluginLoader.java b/src/main/java/mcp/mobius/waila/plugin/PluginLoader.java index 413b7ac3a..40ead7053 100644 --- a/src/main/java/mcp/mobius/waila/plugin/PluginLoader.java +++ b/src/main/java/mcp/mobius/waila/plugin/PluginLoader.java @@ -57,7 +57,7 @@ public static void reloadServerPlugins(MinecraftServer server) { server.getPlayerList().getPlayers().forEach(player -> { var sender = PacketSender.s2c(player); - if (!sender.canSend(PluginSyncCommonS2CPacket.ID)) return; + if (!sender.canSend(PluginSyncCommonS2CPacket.TYPE)) return; if (!server.isSingleplayerOwner(player.getGameProfile())) { sender.send(new PluginSyncCommonS2CPacket.Payload()); @@ -71,8 +71,8 @@ public static void reloadServerPlugins(MinecraftServer server) { public static void reloadClientPlugins() { INSTANCE.loadPlugins(); - if (Minecraft.getInstance().getConnection() != null && PacketSender.c2s().canSend(ConfigSyncRequestPlayC2SPacket.ID)) { - PacketSender.c2s().send(new ConfigSyncRequestPlayC2SPacket.Payload()); + if (Minecraft.getInstance().getConnection() != null && PacketSender.c2s().canSend(ConfigSyncRequestPlayC2SPacket.TYPE)) { + PacketSender.c2s().send(ConfigSyncRequestPlayC2SPacket.PAYLOAD); } } diff --git a/src/main/java/mcp/mobius/waila/registry/Registrar.java b/src/main/java/mcp/mobius/waila/registry/Registrar.java index 3896e97c1..6c7814b90 100644 --- a/src/main/java/mcp/mobius/waila/registry/Registrar.java +++ b/src/main/java/mcp/mobius/waila/registry/Registrar.java @@ -35,6 +35,8 @@ import net.minecraft.Util; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; @@ -80,9 +82,7 @@ public class Registrar implements IRegistrar { public final BiMap> themeTypes = HashBiMap.create(); - public final Map, Class> impl2ApiDataType = new HashMap<>(); - public final Map, ResourceLocation> dataType2Id = new HashMap<>(); - public final Map> dataId2Serializer = new HashMap<>(); + public final Map> dataCodecs = new HashMap<>(); @Nullable public IObjectPicker picker = null; @@ -328,14 +328,11 @@ public void addEntityData(IDataProvider provider, Class @Override - public void addDataType(ResourceLocation id, Class apiType, Class implType, IData.Serializer serializer) { + @SuppressWarnings("unchecked") + public void addDataType(IData.Type type, StreamCodec codec) { assertLock(); - Preconditions.checkArgument(!dataId2Serializer.containsKey(id), "Data type with id %s already present", id); - - impl2ApiDataType.put(implType, apiType); - dataType2Id.put(apiType, id); - dataType2Id.put(implType, id); - dataId2Serializer.put(id, serializer); + Preconditions.checkArgument(!dataCodecs.containsKey(type.id()), "Data type with id %s already present", type.id()); + dataCodecs.put(type.id(), (StreamCodec) codec); } @Override diff --git a/src/main/java/mcp/mobius/waila/service/ApiService.java b/src/main/java/mcp/mobius/waila/service/ApiService.java index 1389a317a..fe0f8ea1c 100644 --- a/src/main/java/mcp/mobius/waila/service/ApiService.java +++ b/src/main/java/mcp/mobius/waila/service/ApiService.java @@ -3,14 +3,15 @@ import java.lang.reflect.Type; import java.nio.file.Path; import java.util.Collection; -import java.util.Comparator; import java.util.LinkedHashSet; import java.util.List; import com.google.common.collect.Streams; import com.mojang.blaze3d.vertex.BufferBuilder; import mcp.mobius.waila.Waila; +import mcp.mobius.waila.access.DataType; import mcp.mobius.waila.api.IBlacklistConfig; +import mcp.mobius.waila.api.IData; import mcp.mobius.waila.api.IInstanceRegistry; import mcp.mobius.waila.api.IJsonConfig; import mcp.mobius.waila.api.IModInfo; @@ -31,6 +32,7 @@ import mcp.mobius.waila.util.ModInfo; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.core.Registry; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; @@ -42,7 +44,8 @@ import net.minecraft.world.item.TieredItem; import net.minecraft.world.item.Tiers; import net.minecraft.world.item.TippedArrowItem; -import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.PotionContents; +import net.minecraft.world.item.enchantment.ItemEnchantments; import org.joml.Matrix4f; public abstract class ApiService implements IApiService { @@ -53,20 +56,20 @@ public IModInfo getModInfo(ItemStack stack) { if (ResourceLocation.DEFAULT_NAMESPACE.equals(BuiltInRegistries.ITEM.getKey(item).getNamespace())) { if (item instanceof EnchantedBookItem) { - var enchantmentsNbt = EnchantedBookItem.getEnchantments(stack); - if (enchantmentsNbt.size() == 1) { - var enchantmentNbt = enchantmentsNbt.getCompound(0); - var id = ResourceLocation.tryParse(enchantmentNbt.getString("id")); - if (id != null && BuiltInRegistries.ENCHANTMENT.containsKey(id)) { - return IModInfo.get(id.getNamespace()); - } + var enchantments = stack.getOrDefault(DataComponents.STORED_ENCHANTMENTS, ItemEnchantments.EMPTY); + if (enchantments.size() == 1) for (var entry : enchantments.entrySet()) { + var id = BuiltInRegistries.ENCHANTMENT.getKey(entry.getKey().value()); + if (id != null) return IModInfo.get(id); + break; } } else if (item instanceof PotionItem || item instanceof TippedArrowItem) { - var potionType = PotionUtils.getPotion(stack); - var id = BuiltInRegistries.POTION.getKey(potionType); - return IModInfo.get(id.getNamespace()); + var potion = stack.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY).potion().orElse(null); + if (potion != null) { + var id = BuiltInRegistries.POTION.getKey(potion.value()); + if (id != null) return IModInfo.get(id); + } } else if (item instanceof SpawnEggItem spawnEggItem) { - var id = BuiltInRegistries.ENTITY_TYPE.getKey(spawnEggItem.getType(null)); + var id = BuiltInRegistries.ENTITY_TYPE.getKey(spawnEggItem.getType(stack)); return IModInfo.get(id.getNamespace()); } } @@ -177,7 +180,12 @@ public List getTiers() { } } - return Streams.concat(vanilla.stream(), custom.stream()).sorted(Comparator.comparingInt(Tier::getLevel)).toList(); + return Streams.concat(vanilla.stream(), custom.stream()).toList(); + } + + @Override + public IData.Type createDataType(ResourceLocation id) { + return new DataType<>(id); } } diff --git a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/data/EnergyDataImpl.java b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/data/EnergyDataImpl.java index 02c39f959..c2f5f04b3 100644 --- a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/data/EnergyDataImpl.java +++ b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/data/EnergyDataImpl.java @@ -3,12 +3,20 @@ import java.util.HashMap; import java.util.Map; +import mcp.mobius.waila.api.IData; import mcp.mobius.waila.api.data.EnergyData; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; public class EnergyDataImpl extends EnergyData { + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.DOUBLE, EnergyDataImpl::stored, + ByteBufCodecs.DOUBLE, EnergyDataImpl::capacity, + EnergyDataImpl::new); + private final double stored; private final double capacity; @@ -17,15 +25,9 @@ public EnergyDataImpl(double stored, double capacity) { this.capacity = capacity; } - public EnergyDataImpl(FriendlyByteBuf buf) { - this.stored = buf.readDouble(); - this.capacity = buf.readDouble(); - } - @Override - public void write(FriendlyByteBuf buf) { - buf.writeDouble(stored); - buf.writeDouble(capacity); + public Type type() { + return TYPE; } public double stored() { diff --git a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/data/FluidDataImpl.java b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/data/FluidDataImpl.java index 70add2f35..4259e2c11 100644 --- a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/data/FluidDataImpl.java +++ b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/data/FluidDataImpl.java @@ -5,14 +5,16 @@ import java.util.List; import java.util.Map; +import mcp.mobius.waila.api.IData; import mcp.mobius.waila.api.data.FluidData; import mcp.mobius.waila.buildconst.Tl; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.component.DataComponentPatch; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; @@ -22,38 +24,53 @@ public class FluidDataImpl extends FluidData.PlatformDependant { - private final List> entries; - private final PlatformTranslator proxy; - private final Unit unit; - - public FluidDataImpl(@Nullable FluidData.PlatformTranslator proxy, Unit unit, int slotCountHint) { - this.entries = slotCountHint == -1 ? new ArrayList<>() : new ArrayList<>(slotCountHint); - this.proxy = proxy; - this.unit = unit; - } - - public FluidDataImpl(FriendlyByteBuf buf) { - proxy = null; - unit = buf.readEnum(Unit.class); + public static final StreamCodec CODEC = StreamCodec.ofMember((d, buf) -> { + buf.writeEnum(d.unit); + buf.writeVarInt(d.entries.size()); + for (var entry : d.entries) { + if (entry.isEmpty()) { + buf.writeBoolean(true); + } else { + buf.writeBoolean(false); + buf.writeById(BuiltInRegistries.FLUID::getId, entry.fluid); + DataComponentPatch.STREAM_CODEC.encode(buf, entry.data); + buf.writeDouble(entry.stored); + buf.writeDouble(entry.capacity); + } + } + }, buf -> { + var unit = buf.readEnum(Unit.class); var size = buf.readVarInt(); - entries = new ArrayList<>(size); + var d = new FluidDataImpl(null, unit, size); for (var i = 0; i < size; i++) { if (buf.readBoolean()) continue; var id = buf.readVarInt(); var fluid = BuiltInRegistries.FLUID.byId(id); - var nbt = buf.readNbt(); + var data = DataComponentPatch.STREAM_CODEC.decode(buf); var stored = buf.readDouble(); var capacity = buf.readDouble(); - add(fluid, nbt, stored, capacity); + d.add(fluid, data, stored, capacity); } + + return d; + }); + + private final List> entries; + private final PlatformTranslator proxy; + private final Unit unit; + + public FluidDataImpl(@Nullable FluidData.PlatformTranslator proxy, Unit unit, int slotCountHint) { + this.entries = slotCountHint == -1 ? new ArrayList<>() : new ArrayList<>(slotCountHint); + this.proxy = proxy; + this.unit = unit; } @Override - protected void implAdd(Fluid fluid, @Nullable CompoundTag nbt, double stored, double capacity) { - entries.add(new Entry<>(fluid, nbt, stored, capacity)); + protected void implAdd(Fluid fluid, DataComponentPatch data, double stored, double capacity) { + entries.add(new Entry<>(fluid, data, stored, capacity)); } @Override @@ -62,21 +79,8 @@ protected PlatformTranslator translator() { } @Override - public void write(FriendlyByteBuf buf) { - buf.writeEnum(unit); - buf.writeVarInt(entries.size()); - - for (var entry : entries) { - if (entry.isEmpty()) { - buf.writeBoolean(true); - } else { - buf.writeBoolean(false); - buf.writeId(BuiltInRegistries.FLUID, entry.fluid); - buf.writeNbt(entry.nbt); - buf.writeDouble(entry.stored); - buf.writeDouble(entry.capacity); - } - } + public Type type() { + return TYPE; } public Unit unit() { @@ -90,13 +94,13 @@ public List> entries() { public static class Entry implements FluidDescriptionContext { private final T fluid; - private final @Nullable CompoundTag nbt; + private final DataComponentPatch data; private final double stored; private final double capacity; - private Entry(T fluid, @Nullable CompoundTag nbt, double stored, double capacity) { + private Entry(T fluid, DataComponentPatch data, double stored, double capacity) { this.fluid = fluid; - this.nbt = nbt; + this.data = data; this.stored = stored; this.capacity = capacity; } @@ -111,9 +115,8 @@ public T fluid() { } @Override - @Nullable - public CompoundTag nbt() { - return nbt; + public DataComponentPatch data() { + return data; } public double stored() { @@ -137,7 +140,8 @@ public static class FluidDescription implements FluidData.FluidDescription { private static final Component UNKNOWN_FLUID_NAME = Component.translatable(Tl.Tooltip.Extra.UNKNOWN_FLUID); - private static final FluidDescriptor UNKNOWN_FLUID_DESC = (ctx, desc) -> {}; + private static final FluidDescriptor UNKNOWN_FLUID_DESC = (ctx, desc) -> { + }; private static final CauldronDescriptor NULL_CAULDRON_DESC = state -> null; private TextureAtlasSprite sprite; diff --git a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/data/ItemDataImpl.java b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/data/ItemDataImpl.java index 344c08508..2f18c6237 100644 --- a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/data/ItemDataImpl.java +++ b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/data/ItemDataImpl.java @@ -3,55 +3,62 @@ import java.util.ArrayList; import java.util.Objects; +import mcp.mobius.waila.api.IData; import mcp.mobius.waila.api.IPluginConfig; import mcp.mobius.waila.api.data.ItemData; +import net.minecraft.core.component.DataComponentPatch; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.ItemStack; public class ItemDataImpl extends ItemData { - private final IPluginConfig config; - private boolean syncNbt; - - public ItemDataImpl(IPluginConfig config) { - this.config = config; - } + public static final StreamCodec CODEC = StreamCodec.ofMember((d, buf) -> { + var syncNbt = d.config.getBoolean(CONFIG_SYNC_NBT); + buf.writeBoolean(syncNbt); + buf.writeVarInt(d.items.size()); - public ItemDataImpl(FriendlyByteBuf buf) { - this.config = null; + for (var stack : d.items) { + if (stack.isEmpty()) { + buf.writeBoolean(true); + } else { + buf.writeBoolean(false); + buf.writeById(BuiltInRegistries.ITEM::getId, stack.getItem()); + buf.writeVarInt(stack.getCount()); + if (syncNbt) DataComponentPatch.STREAM_CODEC.encode(buf, stack.getComponentsPatch()); + } + } + }, buf -> { + var d = new ItemDataImpl(null); - syncNbt = buf.readBoolean(); + d.syncNbt = buf.readBoolean(); var size = buf.readVarInt(); - ensureSpace(size); + d.ensureSpace(size); for (var i = 0; i < size; i++) { if (buf.readBoolean()) continue; - var item = buf.readById(BuiltInRegistries.ITEM); + var item = buf.readById(BuiltInRegistries.ITEM::byId); var count = buf.readVarInt(); var stack = new ItemStack(Objects.requireNonNull(item), count); - if (syncNbt) stack.setTag(buf.readNbt()); - add(stack); + if (d.syncNbt) stack.applyComponents(DataComponentPatch.STREAM_CODEC.decode(buf)); + d.add(stack); } + + return d; + }); + + private final IPluginConfig config; + private boolean syncNbt; + + public ItemDataImpl(IPluginConfig config) { + this.config = config; } @Override - public void write(FriendlyByteBuf buf) { - var syncNbt = config.getBoolean(CONFIG_SYNC_NBT); - buf.writeBoolean(syncNbt); - buf.writeVarInt(items.size()); - - for (var stack : items) { - if (stack.isEmpty()) { - buf.writeBoolean(true); - } else { - buf.writeBoolean(false); - buf.writeId(BuiltInRegistries.ITEM, stack.getItem()); - buf.writeVarInt(stack.getCount()); - if (syncNbt) buf.writeNbt(stack.getTag()); - } - } + public Type type() { + return TYPE; } public ArrayList items() { diff --git a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/data/ProgressDataImpl.java b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/data/ProgressDataImpl.java index e2ab8960d..b37fc8608 100644 --- a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/data/ProgressDataImpl.java +++ b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/data/ProgressDataImpl.java @@ -2,47 +2,49 @@ import java.util.ArrayList; +import mcp.mobius.waila.api.IData; import mcp.mobius.waila.api.data.ProgressData; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.ItemStack; public class ProgressDataImpl extends ProgressData { - private final float ratio; + public static final StreamCodec CODEC = StreamCodec.ofMember((d, buf) -> { + buf.writeFloat(d.ratio); - public ProgressDataImpl(float ratio) { - this.ratio = ratio; - } + buf.writeVarInt(d.input.size()); + for (var stack : d.input) { + ItemStack.STREAM_CODEC.encode(buf, stack); + } - public ProgressDataImpl(FriendlyByteBuf buf) { - this.ratio = buf.readFloat(); + buf.writeVarInt(d.output.size()); + for (var stack : d.output) { + ItemStack.STREAM_CODEC.encode(buf, stack); + } + }, buf -> { + var ratio = buf.readFloat(); + var d = new ProgressDataImpl(ratio); var inputSize = buf.readVarInt(); - input.ensureCapacity(inputSize); + d.input.ensureCapacity(inputSize); for (var i = 0; i < inputSize; i++) { - input.add(buf.readItem()); + d.input.add(ItemStack.STREAM_CODEC.decode(buf)); } var outputSize = buf.readVarInt(); - output.ensureCapacity(outputSize); + d.output.ensureCapacity(outputSize); for (var i = 0; i < outputSize; i++) { - output.add(buf.readItem()); + d.output.add(ItemStack.STREAM_CODEC.decode(buf)); } - } - @Override - public void write(FriendlyByteBuf buf) { - buf.writeFloat(ratio); + return d; + }); - buf.writeVarInt(input.size()); - for (var stack : input) { - buf.writeItem(stack); - } + private final float ratio; - buf.writeVarInt(output.size()); - for (var stack : output) { - buf.writeItem(stack); - } + public ProgressDataImpl(float ratio) { + this.ratio = ratio; } public float ratio() { @@ -57,4 +59,9 @@ public ArrayList output() { return output; } + @Override + public Type type() { + return TYPE; + } + } diff --git a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/DataProvider.java b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/DataProvider.java index 7a176e806..587279880 100644 --- a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/DataProvider.java +++ b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/DataProvider.java @@ -22,36 +22,34 @@ import mcp.mobius.waila.api.WailaConstants; import mcp.mobius.waila.plugin.extra.config.ExtraBlacklistConfig; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.block.entity.BlockEntity; public abstract class DataProvider implements IBlockComponentProvider, IEntityComponentProvider { - public static final Map> INSTANCES = new HashMap<>(); + public static final Map, DataProvider> INSTANCES = new HashMap<>(); - private final ResourceLocation id; - private final Class apiType; - private final Class implType; - private final IData.Serializer serializer; + private final IData.Type type; + private final StreamCodec codec; protected final ResourceLocation enabledBlockOption; protected final ResourceLocation enabledEntityOption; protected final IJsonConfig blacklistConfig; - protected DataProvider(ResourceLocation id, Class apiType, Class implType, IData.Serializer serializer) { - this.id = id; - this.apiType = apiType; - this.implType = implType; - this.serializer = serializer; + protected DataProvider(IData.Type type, StreamCodec codec) { + this.type = type; + this.codec = codec; enabledBlockOption = createConfigKey("enabled_block"); enabledEntityOption = createConfigKey("enabled_entity"); - var tagId = new ResourceLocation(WailaConstants.NAMESPACE, "extra/" + id.getPath() + "_blacklist"); + var tagId = new ResourceLocation(WailaConstants.NAMESPACE, "extra/" + type.id().getPath() + "_blacklist"); blacklistConfig = IJsonConfig.of(ExtraBlacklistConfig.class) - .file(WailaConstants.NAMESPACE + "/extra/" + id.getPath() + "_blacklist") + .file(WailaConstants.NAMESPACE + "/extra/" + type.id().getPath() + "_blacklist") .gson(new GsonBuilder() .setPrettyPrinting() .registerTypeAdapter(ExtraBlacklistConfig.class, new ExtraBlacklistConfig.Adapter(tagId)) @@ -60,7 +58,7 @@ protected DataProvider(ResourceLocation id, Class apiType, Class implType, blacklistConfig.save(); - INSTANCES.put(id, this); + INSTANCES.put(type, this); } public void register(IRegistrar registrar, int priority) { @@ -69,7 +67,7 @@ public void register(IRegistrar registrar, int priority) { registerAdditions(registrar, priority); registrar.addConfig(createConfigKey("blacklist"), blacklistConfig.getPath()); - registrar.addDataType(id, apiType, implType, serializer); + registrar.addDataType(type, codec); registrar.addComponent((IBlockComponentProvider) this, TooltipPosition.BODY, BlockEntity.class, priority); registrar.addComponent((IEntityComponentProvider) this, TooltipPosition.BODY, Entity.class, priority); registrar.addBlockData(new BlockDataProvider(), BlockEntity.class, 0); @@ -77,7 +75,7 @@ public void register(IRegistrar registrar, int priority) { } protected final ResourceLocation createConfigKey(String path) { - return new ResourceLocation(WailaConstants.NAMESPACE + "x", id.getPath() + "." + path); + return new ResourceLocation(WailaConstants.NAMESPACE + "x", type.id().getPath() + "." + path); } protected void registerAdditions(IRegistrar registrar, int priority) { @@ -87,7 +85,7 @@ protected void registerAdditions(IRegistrar registrar, int priority) { @SuppressWarnings("unchecked") protected void appendBody(ITooltip tooltip, IDataReader reader, IPluginConfig config, ResourceLocation objectId) { - var data = (I) reader.get(apiType); + var data = (I) reader.get(type); if (data == null) return; appendBody(tooltip, data, config, objectId); @@ -123,7 +121,7 @@ public void appendData(IDataWriter data, IServerAccessor accessor, if (!config.getBoolean(enabledBlockOption) || blacklistConfig.get().getView().blockFilter.matches(state.getBlock()) || blacklistConfig.get().getView().blockEntityFilter.matches(blockEntityType)) { - data.blockAll(apiType); + data.blockAll(type); } } @@ -136,7 +134,7 @@ public void appendData(IDataWriter data, IServerAccessor accessor, IPlug var entityType = accessor.getTarget().getType(); if (!config.getBoolean(enabledEntityOption) || blacklistConfig.get().getView().entityFilter.matches(entityType)) { - data.blockAll(apiType); + data.blockAll(type); } } diff --git a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/EnergyProvider.java b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/EnergyProvider.java index 21bcb68de..bb3827f09 100644 --- a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/EnergyProvider.java +++ b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/EnergyProvider.java @@ -35,7 +35,7 @@ public class EnergyProvider extends DataProvider { private static final TagKey> INFINITE_ENTITY_TAG = TagKey.create(Registries.ENTITY_TYPE, INFINITE_TAG_ID); private EnergyProvider() { - super(EnergyData.ID, EnergyData.class, EnergyDataImpl.class, EnergyDataImpl::new); + super(EnergyData.TYPE, EnergyDataImpl.CODEC); } @Override @@ -74,7 +74,7 @@ private static class InfiniteEnergyBlockProvider implements IDataProvider accessor, IPluginConfig config) { - data.add(EnergyData.class, res -> { + data.add(EnergyData.TYPE, res -> { var target = accessor.getTarget(); if (target.getBlockState().is(INFINITE_BLOCK_TAG) @@ -90,7 +90,7 @@ private static class InfiniteEnergyEntityProvider implements IDataProvider accessor, IPluginConfig config) { - data.add(EnergyData.class, res -> { + data.add(EnergyData.TYPE, res -> { if (accessor.getTarget().getType().is(INFINITE_ENTITY_TAG)) { res.add(EnergyData.INFINITE); } diff --git a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/FluidProvider.java b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/FluidProvider.java index 8050abe37..e7e2d0bff 100644 --- a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/FluidProvider.java +++ b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/FluidProvider.java @@ -23,7 +23,7 @@ public class FluidProvider extends DataProvider { private static final String INFINITE = "∞"; private FluidProvider() { - super(FluidData.ID, FluidData.class, FluidDataImpl.class, FluidDataImpl::new); + super(FluidData.TYPE, FluidDataImpl.CODEC); } @Override @@ -70,7 +70,7 @@ private class CauldronProvider implements IBlockComponentProvider { @Override public void appendBody(ITooltip tooltip, IBlockAccessor accessor, IPluginConfig config) { - if (accessor.getData().get(FluidData.class) != null) return; + if (accessor.getData().get(FluidData.TYPE) != null) return; if (!config.getBoolean(enabledBlockOption)) return; if (blacklistConfig.get().getView().blockFilter.matches(accessor.getBlock())) return; diff --git a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/ItemProvider.java b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/ItemProvider.java index 207bce43b..613bd8738 100644 --- a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/ItemProvider.java +++ b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/ItemProvider.java @@ -16,7 +16,7 @@ import mcp.mobius.waila.api.data.ProgressData; import mcp.mobius.waila.plugin.extra.data.ItemDataImpl; import mcp.mobius.waila.plugin.extra.data.ProgressDataImpl; -import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.component.DataComponentPatch; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -25,13 +25,12 @@ public class ItemProvider extends DataProvider { public static final ItemProvider INSTANCE = new ItemProvider(); - private static final CompoundTag EMPTY = new CompoundTag(); private @Nullable ItemData lastData = null; private @Nullable ItemListComponent lastItemsComponent = null; protected ItemProvider() { - super(ItemData.ID, ItemData.class, ItemDataImpl.class, ItemDataImpl::new); + super(ItemData.TYPE, ItemDataImpl.CODEC); } @Override @@ -43,7 +42,7 @@ protected void registerAdditions(IRegistrar registrar, int priority) { @Override protected void appendBody(ITooltip tooltip, IDataReader reader, IPluginConfig config, ResourceLocation objectId) { - var progress = (ProgressDataImpl) reader.get(ProgressData.class); + var progress = (ProgressDataImpl) reader.get(ProgressData.TYPE); if (progress == null || progress.ratio() == 0f) { super.appendBody(tooltip, reader, config, objectId); } @@ -60,7 +59,7 @@ protected void appendBody(ITooltip tooltip, ItemDataImpl data, IPluginConfig con lastItemsComponent = null; Map merged = new LinkedHashMap<>(); - Map> unique = new HashMap<>(); + Map> unique = new HashMap<>(); for (var stack : data.items()) { if (stack.isEmpty()) continue; @@ -75,8 +74,7 @@ protected void appendBody(ITooltip tooltip, ItemDataImpl data, IPluginConfig con merged.put(item, stack.copy()); } } else { - var nbt = stack.getTag(); - if (nbt == null) nbt = EMPTY; + var nbt = stack.getComponentsPatch(); if (unique.computeIfAbsent(item, i -> new HashSet<>()).add(nbt)) { merged.put(new ItemWithNbt(item, nbt), stack.copy()); @@ -96,7 +94,7 @@ protected void appendBody(ITooltip tooltip, ItemDataImpl data, IPluginConfig con tooltip.setLine(ItemData.ID, lastItemsComponent = new ItemListComponent(stream.toList(), config.getInt(ItemData.CONFIG_MAX_HEIGHT))); } - private record ItemWithNbt(Item item, CompoundTag tag) { + private record ItemWithNbt(Item item, DataComponentPatch tag) { } diff --git a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/ProgressProvider.java b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/ProgressProvider.java index a4998efaa..48e5ae735 100644 --- a/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/ProgressProvider.java +++ b/src/pluginExtra/java/mcp/mobius/waila/plugin/extra/provider/ProgressProvider.java @@ -13,7 +13,7 @@ public class ProgressProvider extends DataProvider tag; + public final @Nullable TagKey incorrect; private final Supplier tlKey; public ToolTier(Tier tier, int index) { this.tier = tier; this.index = index; - this.tag = IApiService.INSTANCE.getTierTag(tier); + this.incorrect = tier.getIncorrectBlocksForDrops(); this.tlKey = Suppliers.memoize(() -> { - String key; - - if (tag != null) { - var vanilla = VANILLA_TIER_TL_KEYS.get().get(tag.location()); - key = vanilla != null ? vanilla : tag.location().toLanguageKey(); - } else { - key = String.valueOf(tier.getLevel()); - } + var vanilla = VANILLA_TIER_TL_KEYS.get().get(incorrect.location()); + var key = vanilla != null ? vanilla : incorrect.location().toLanguageKey(); return Tl.Tooltip.Harvest.TIER + "." + key; }); @@ -83,7 +77,7 @@ public String tlKey() { public boolean isEqualTo(ToolTier other) { if (this == other) return true; if (this.tier == other.tier) return true; - if (this.tag != null && other.tag != null) return this.tag.location().equals(other.tag.location()); + if (this.incorrect != null && other.incorrect != null) return this.incorrect.location().equals(other.incorrect.location()); return false; } diff --git a/src/pluginTest/java/mcp/mobius/waila/plugin/test/ComplexDataTest.java b/src/pluginTest/java/mcp/mobius/waila/plugin/test/ComplexDataTest.java index b7d003e77..4edc1f882 100644 --- a/src/pluginTest/java/mcp/mobius/waila/plugin/test/ComplexDataTest.java +++ b/src/pluginTest/java/mcp/mobius/waila/plugin/test/ComplexDataTest.java @@ -9,8 +9,10 @@ import mcp.mobius.waila.api.IServerAccessor; import mcp.mobius.waila.api.ITooltip; import mcp.mobius.waila.api.component.PairComponent; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.entity.ChestBlockEntity; @@ -22,28 +24,23 @@ public enum ComplexDataTest implements IBlockComponentProvider, IDataProvider DATA = IData.createType(ENABLED); + public static final StreamCodec DATA_CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, Data::value, + Data::new); - private final String value; - - public Data(String value) { - this.value = value; - } - - public Data(FriendlyByteBuf buf) { - this(buf.readUtf()); - } + public record Data(String value) implements IData { @Override - public void write(FriendlyByteBuf buf) { - buf.writeUtf(value); + public Type type() { + return DATA; } } @Override public void appendBody(ITooltip tooltip, IBlockAccessor accessor, IPluginConfig config) { - var data = accessor.getData().get(Data.class); + var data = accessor.getData().get(DATA); if (data != null) tooltip.addLine(new PairComponent(Component.literal("data"), Component.literal(data.value))); } @@ -51,7 +48,7 @@ public void appendBody(ITooltip tooltip, IBlockAccessor accessor, IPluginConfig public void appendData(IDataWriter data, IServerAccessor accessor, IPluginConfig config) { if (!config.getBoolean(ENABLED)) return; - if (config.getBoolean(MULTIPLE_ADDITION)) data.add(Data.class, result -> { + if (config.getBoolean(MULTIPLE_ADDITION)) data.add(DATA, result -> { result.add(new Data("one")); try { result.add(new Data("two")); @@ -60,8 +57,8 @@ public void appendData(IDataWriter data, IServerAccessor acces } }); - if (config.getBoolean(BLOCK)) data.add(Data.class, IDataWriter.Result::block); - data.add(Data.class, ctx -> ctx.add(new Data("moe moe kyun"))); + if (config.getBoolean(BLOCK)) data.add(DATA, IDataWriter.Result::block); + data.add(DATA, ctx -> ctx.add(new Data("moe moe kyun"))); } } diff --git a/src/pluginTest/java/mcp/mobius/waila/plugin/test/ExtraTest.java b/src/pluginTest/java/mcp/mobius/waila/plugin/test/ExtraTest.java index 101cd37b1..271ed9f34 100644 --- a/src/pluginTest/java/mcp/mobius/waila/plugin/test/ExtraTest.java +++ b/src/pluginTest/java/mcp/mobius/waila/plugin/test/ExtraTest.java @@ -26,7 +26,7 @@ public enum ExtraTest implements IDataProvider { @Override public void appendData(IDataWriter data, IServerAccessor accessor, IPluginConfig config) { - if (config.getBoolean(ENERGY)) data.add(EnergyData.class, res -> { + if (config.getBoolean(ENERGY)) data.add(EnergyData.TYPE, res -> { tickEnergy++; if (tickEnergy == 500) tickEnergy = 0; @@ -35,7 +35,7 @@ public void appendData(IDataWriter data, IServerAccessor acces else res.add(EnergyData.of(tickEnergy * 100L, 50000L)); }); - if (config.getBoolean(FLUID)) data.add(FluidData.class, res -> { + if (config.getBoolean(FLUID)) data.add(FluidData.TYPE, res -> { tickWater++; if (tickWater == 500) tickWater = 0; diff --git a/src/pluginTest/java/mcp/mobius/waila/plugin/test/RequestDataTest.java b/src/pluginTest/java/mcp/mobius/waila/plugin/test/RequestDataTest.java index f44b87350..22a08f14c 100644 --- a/src/pluginTest/java/mcp/mobius/waila/plugin/test/RequestDataTest.java +++ b/src/pluginTest/java/mcp/mobius/waila/plugin/test/RequestDataTest.java @@ -1,6 +1,7 @@ package mcp.mobius.waila.plugin.test; import com.google.common.base.Preconditions; +import io.netty.buffer.ByteBuf; import mcp.mobius.waila.api.IBlockAccessor; import mcp.mobius.waila.api.IBlockComponentProvider; import mcp.mobius.waila.api.IData; @@ -9,8 +10,9 @@ import mcp.mobius.waila.api.IPluginConfig; import mcp.mobius.waila.api.IServerAccessor; import mcp.mobius.waila.api.ITooltip; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.entity.BarrelBlockEntity; @@ -22,13 +24,16 @@ public enum RequestDataTest implements IBlockComponentProvider, IDataProvider CTX = IData.createType(new ResourceLocation("test:data.ctx.ctx")); + public static final StreamCodec CTX_CODEC = ByteBufCodecs.STRING_UTF8.map(Ctx::new, Ctx::msg); + + public static final IData.Type DATA = IData.createType(new ResourceLocation("test:data.ctx.data")); + public static final StreamCodec DATA_CODEC = ByteBufCodecs.STRING_UTF8.map(Data::new, Data::msg); @Override public void appendDataContext(IDataWriter ctx, IBlockAccessor accessor, IPluginConfig config) { Preconditions.checkState(accessor.getData().raw().isEmpty()); - Preconditions.checkState(accessor.getData().get(Data.class) == null); + Preconditions.checkState(accessor.getData().get(DATA) == null); if (!config.getBoolean(ENABLED)) return; @@ -43,8 +48,8 @@ public void appendData(IDataWriter data, IServerAccessor acce data.raw().putString("kyk", raw.getString("kyk")); } - data.add(Data.class, res -> { - var ctx = accessor.getContext().get(Ctx.class); + data.add(DATA, res -> { + var ctx = accessor.getContext().get(CTX); if (ctx == null) return; res.add(new Data(ctx.msg)); @@ -58,7 +63,7 @@ public void appendBody(ITooltip tooltip, IBlockAccessor accessor, IPluginConfig tooltip.addLine(Component.literal(raw.getString("kyk"))); } - var data = accessor.getData().get(Data.class); + var data = accessor.getData().get(DATA); if (data != null) { tooltip.addLine(Component.literal(data.msg)); } @@ -68,13 +73,9 @@ public record Ctx( String msg ) implements IData { - public Ctx(FriendlyByteBuf buf) { - this(buf.readUtf()); - } - @Override - public void write(FriendlyByteBuf buf) { - buf.writeUtf(msg); + public Type type() { + return CTX; } } @@ -83,13 +84,9 @@ public record Data( String msg ) implements IData { - public Data(FriendlyByteBuf buf) { - this(buf.readUtf()); - } - @Override - public void write(FriendlyByteBuf buf) { - buf.writeUtf(msg); + public Type type() { + return DATA; } } diff --git a/src/pluginTest/java/mcp/mobius/waila/plugin/test/WailaPluginTest.java b/src/pluginTest/java/mcp/mobius/waila/plugin/test/WailaPluginTest.java index 15f8a68f1..70827ca91 100644 --- a/src/pluginTest/java/mcp/mobius/waila/plugin/test/WailaPluginTest.java +++ b/src/pluginTest/java/mcp/mobius/waila/plugin/test/WailaPluginTest.java @@ -73,7 +73,7 @@ public void register(IRegistrar registrar) { registrar.addConfig(ComplexDataTest.ENABLED, false); registrar.addConfig(ComplexDataTest.BLOCK, false); registrar.addConfig(ComplexDataTest.MULTIPLE_ADDITION, false); - registrar.addDataType(ComplexDataTest.ENABLED, ComplexDataTest.Data.class, ComplexDataTest.Data::new); + registrar.addDataType(ComplexDataTest.DATA, ComplexDataTest.DATA_CODEC); registrar.addComponent(ComplexDataTest.INSTANCE, TooltipPosition.BODY, ChestBlock.class); registrar.addBlockData(ComplexDataTest.INSTANCE, ChestBlock.class); @@ -91,8 +91,8 @@ public void register(IRegistrar registrar) { registrar.addConfig(RequestDataTest.ENABLED, false); registrar.addConfig(RequestDataTest.RAW, false); registrar.addConfig(RequestDataTest.TYPED, false); - registrar.addDataType(RequestDataTest.CTX, RequestDataTest.Ctx.class, RequestDataTest.Ctx::new); - registrar.addDataType(RequestDataTest.DATA, RequestDataTest.Data.class, RequestDataTest.Data::new); + registrar.addDataType(RequestDataTest.CTX, RequestDataTest.CTX_CODEC); + registrar.addDataType(RequestDataTest.DATA, RequestDataTest.DATA_CODEC); registrar.addDataContext(RequestDataTest.INSTANCE, BarrelBlockEntity.class); registrar.addBlockData(RequestDataTest.INSTANCE, BarrelBlockEntity.class); registrar.addComponent(RequestDataTest.INSTANCE, TooltipPosition.BODY, BarrelBlockEntity.class); diff --git a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/WailaPluginVanilla.java b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/WailaPluginVanilla.java index 6916c4046..9e9a9b128 100644 --- a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/WailaPluginVanilla.java +++ b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/WailaPluginVanilla.java @@ -128,8 +128,8 @@ public void register(IRegistrar registrar) { registrar.addComponent(PandaProvider.INSTANCE, BODY, Panda.class); registrar.addComponent(BeaconProvider.INSTANCE, BODY, BeaconBlockEntity.class); registrar.addComponent(MobEffectProvider.INSTANCE, BODY, LivingEntity.class); - registrar.addDataType(BeaconProvider.DATA, BeaconProvider.Data.class, BeaconProvider.Data::new); - registrar.addDataType(MobEffectProvider.DATA, MobEffectProvider.Data.class, MobEffectProvider.Data::new); + registrar.addDataType(BeaconProvider.DATA, BeaconProvider.DATA_CODEC); + registrar.addDataType(MobEffectProvider.DATA, MobEffectProvider.DATA_CODEC); registrar.addBlockData(BeaconProvider.INSTANCE, BeaconBlockEntity.class); registrar.addEntityData(EntityAttributesProvider.INSTANCE, Entity.class); registrar.addEntityData(MobEffectProvider.INSTANCE, LivingEntity.class); @@ -211,7 +211,7 @@ public void register(IRegistrar registrar) { registrar.addConfig(Options.BOOK_ENCHANTMENT_DISPLAY_MODE, EnchantmentDisplayMode.CYCLE); registrar.addConfig(Options.BOOK_ENCHANTMENT_CYCLE_TIMING, 500); registrar.addConfig(Options.BOOK_WRITTEN, true); - registrar.addDataType(ChiseledBookShelfProvider.DATA, ChiseledBookShelfProvider.Data.class, ChiseledBookShelfProvider.Data::new); + registrar.addDataType(ChiseledBookShelfProvider.DATA, ChiseledBookShelfProvider.DATA_CODEC); registrar.addIcon(ChiseledBookShelfProvider.INSTANCE, ChiseledBookShelfBlock.class); registrar.addComponent(ChiseledBookShelfProvider.INSTANCE, HEAD, ChiseledBookShelfBlock.class); registrar.addComponent(ChiseledBookShelfProvider.INSTANCE, BODY, ChiseledBookShelfBlock.class); diff --git a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/BaseContainerProvider.java b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/BaseContainerProvider.java index 2213326b8..8d97c499f 100644 --- a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/BaseContainerProvider.java +++ b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/BaseContainerProvider.java @@ -16,7 +16,7 @@ public enum BaseContainerProvider implements IDataProvider accessor, IPluginConfig config) { var target = (BaseContainerBlockEntityAccess) accessor.getTarget(); if (!target.wthit_lockKey().unlocksWith(accessor.getPlayer().getMainHandItem())) { - data.blockAll(ItemData.class); + data.blockAll(ItemData.TYPE); } } diff --git a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/BeaconProvider.java b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/BeaconProvider.java index 6c5847c34..1970c219a 100644 --- a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/BeaconProvider.java +++ b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/BeaconProvider.java @@ -10,9 +10,11 @@ import mcp.mobius.waila.api.ITooltip; import mcp.mobius.waila.mixin.BeaconBlockEntityAccess; import mcp.mobius.waila.plugin.vanilla.config.Options; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.level.block.entity.BeaconBlockEntity; @@ -22,7 +24,11 @@ public enum BeaconProvider implements IBlockComponentProvider, IDataProvider DATA = IData.createType(new ResourceLocation("beacon")); + public static final StreamCodec DATA_CODEC = StreamCodec.composite( + ByteBufCodecs.registry(Registries.MOB_EFFECT), Data::primary, + ByteBufCodecs.registry(Registries.MOB_EFFECT), Data::secondary, + Data::new); private MutableComponent getText(MobEffect effect) { return effect.getDisplayName().copy(); @@ -32,7 +38,7 @@ private MutableComponent getText(MobEffect effect) { public void appendBody(ITooltip tooltip, IBlockAccessor accessor, IPluginConfig config) { if (!config.getBoolean(Options.ATTRIBUTE_BEACON_EFFECTS)) return; - var data = accessor.getData().get(Data.class); + var data = accessor.getData().get(DATA); if (data == null) return; if (data.primary != null) { @@ -48,7 +54,7 @@ public void appendBody(ITooltip tooltip, IBlockAccessor accessor, IPluginConfig @Override public void appendData(IDataWriter data, IServerAccessor accessor, IPluginConfig config) { - if (config.getBoolean(Options.ATTRIBUTE_BEACON_EFFECTS)) data.add(Data.class, res -> { + if (config.getBoolean(Options.ATTRIBUTE_BEACON_EFFECTS)) data.add(DATA, res -> { var beacon = (BeaconBlockEntity & BeaconBlockEntityAccess) accessor.getTarget(); res.add(new Data(beacon.wthit_primaryPower(), beacon.wthit_levels() >= 4 ? beacon.wthit_secondaryPower() : null)); }); @@ -59,16 +65,9 @@ public record Data( @Nullable MobEffect secondary ) implements IData { - public Data(FriendlyByteBuf buf) { - this( - buf.readNullable(b -> b.readById(BuiltInRegistries.MOB_EFFECT)), - buf.readNullable(b -> b.readById(BuiltInRegistries.MOB_EFFECT))); - } - @Override - public void write(FriendlyByteBuf buf) { - buf.writeNullable(primary, (b, m) -> b.writeId(BuiltInRegistries.MOB_EFFECT, m)); - buf.writeNullable(secondary, (b, m) -> b.writeId(BuiltInRegistries.MOB_EFFECT, m)); + public Type type() { + return DATA; } } diff --git a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/ChiseledBookShelfProvider.java b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/ChiseledBookShelfProvider.java index 7e0ef5a2e..724a2762f 100644 --- a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/ChiseledBookShelfProvider.java +++ b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/ChiseledBookShelfProvider.java @@ -1,5 +1,6 @@ package mcp.mobius.waila.plugin.vanilla.provider; +import java.util.ArrayList; import java.util.List; import mcp.mobius.waila.api.IBlockAccessor; @@ -20,7 +21,9 @@ import mcp.mobius.waila.mixin.ChiseledBookShelfBlockEntityAccess; import mcp.mobius.waila.plugin.vanilla.config.Options; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.HorizontalDirectionalBlock; @@ -31,7 +34,10 @@ public enum ChiseledBookShelfProvider implements IBlockComponentProvider, IDataP INSTANCE; - public static final ResourceLocation DATA = new ResourceLocation("chiseled_bookshelf"); + public static final IData.Type DATA = IData.createType(new ResourceLocation("chiseled_bookshelf")); + public static final StreamCodec DATA_CODEC = StreamCodec.composite( + ByteBufCodecs.collection(ArrayList::new, ItemStack.STREAM_CODEC), Data::items, + Data::new); private int lastUpdateId = 0; private ItemStack hitItem = ItemStack.EMPTY; @@ -43,7 +49,7 @@ private void init(IBlockAccessor accessor, IPluginConfig config) { hitItem = ItemStack.EMPTY; if (!config.getBoolean(Options.BOOK_BOOKSHELF)) return; - var data = accessor.getData().get(Data.class); + var data = accessor.getData().get(DATA); if (data == null) return; var blockstate = accessor.getBlockState(); @@ -95,9 +101,9 @@ public void appendTail(ITooltip tooltip, IBlockAccessor accessor, IPluginConfig @Override public void appendData(IDataWriter data, IServerAccessor accessor, IPluginConfig config) { - data.blockAll(ItemData.class); + data.blockAll(ItemData.TYPE); - if (config.getBoolean(Options.BOOK_BOOKSHELF)) data.add(Data.class, res -> { + if (config.getBoolean(Options.BOOK_BOOKSHELF)) data.add(DATA, res -> { var bookshelf = (ChiseledBookShelfBlockEntityAccess) accessor.getTarget(); res.add(new Data(bookshelf.wthit_items())); }); @@ -107,13 +113,9 @@ public record Data( List items ) implements IData { - public Data(FriendlyByteBuf buf) { - this(buf.readList(FriendlyByteBuf::readItem)); - } - @Override - public void write(FriendlyByteBuf buf) { - buf.writeCollection(items, FriendlyByteBuf::writeItem); + public Type type() { + return DATA; } } diff --git a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/ContainerEntityProvider.java b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/ContainerEntityProvider.java index e5e6deef5..5f0c5a2ca 100644 --- a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/ContainerEntityProvider.java +++ b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/ContainerEntityProvider.java @@ -15,7 +15,7 @@ public enum ContainerEntityProvider implements IDataProvider { @Override public void appendData(IDataWriter data, IServerAccessor accessor, IPluginConfig config) { - data.add(ItemData.class, res -> { + data.add(ItemData.TYPE, res -> { var entity = accessor.getTarget(); if (entity instanceof ContainerEntity container && container.getLootTable() != null) { diff --git a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/EnderChestProvider.java b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/EnderChestProvider.java index 238220536..8c4cd1b51 100644 --- a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/EnderChestProvider.java +++ b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/EnderChestProvider.java @@ -13,7 +13,7 @@ public enum EnderChestProvider implements IDataProvider { @Override public void appendData(IDataWriter data, IServerAccessor accessor, IPluginConfig config) { - data.add(ItemData.class, res -> res.add(ItemData + data.add(ItemData.TYPE, res -> res.add(ItemData .of(config) .vanilla(accessor.getPlayer().getEnderChestInventory()))); } diff --git a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/FurnaceProvider.java b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/FurnaceProvider.java index 879e0a976..1ae55446a 100644 --- a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/FurnaceProvider.java +++ b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/FurnaceProvider.java @@ -15,7 +15,7 @@ public enum FurnaceProvider implements IDataProvider @Override public void appendData(IDataWriter data, IServerAccessor accessor, IPluginConfig config) { - data.add(ProgressData.class, res -> { + data.add(ProgressData.TYPE, res -> { var furnace = accessor.getTarget(); var access = (AbstractFurnaceBlockEntityAccess) furnace; diff --git a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/HopperContainerProvider.java b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/HopperContainerProvider.java index 653270635..afbb4dca2 100644 --- a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/HopperContainerProvider.java +++ b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/HopperContainerProvider.java @@ -14,7 +14,7 @@ public enum HopperContainerProvider implements IDataProvider { @Override public void appendData(IDataWriter data, IServerAccessor accessor, IPluginConfig config) { - data.add(ItemData.class, res -> { + data.add(ItemData.TYPE, res -> { var container = HopperBlockEntity.getContainerAt(accessor.getWorld(), accessor.getTarget().getBlockPos()); if (container != null) res.add(ItemData.of(config).vanilla(container)); }); diff --git a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/HorseProvider.java b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/HorseProvider.java index 7cd452171..d3a4d4743 100644 --- a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/HorseProvider.java +++ b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/HorseProvider.java @@ -27,7 +27,8 @@ public void appendBody(ITooltip tooltip, IEntityAccessor accessor, IPluginConfig if (config.getBoolean(Options.ATTRIBUTE_HORSE_JUMP_HEIGHT)) { AbstractHorse horse = accessor.getEntity(); - var jumpStrength = horse.getCustomJump(); + // TODO: validate + var jumpStrength = horse.getAttribute(Attributes.JUMP_STRENGTH).getBaseValue(); var jumpHeight = -0.1817584952f * Math.pow(jumpStrength, 3) + 3.689713992f * Math.pow(jumpStrength, 2) + 2.128599134f * jumpStrength - 0.343930367f; ChatFormatting format; diff --git a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/ItemEntityProvider.java b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/ItemEntityProvider.java index 6ecd10428..56940fa73 100644 --- a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/ItemEntityProvider.java +++ b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/ItemEntityProvider.java @@ -1,7 +1,6 @@ package mcp.mobius.waila.plugin.vanilla.provider; import java.util.ArrayList; -import java.util.Objects; import mcp.mobius.waila.api.IEntityAccessor; import mcp.mobius.waila.api.IEntityComponentProvider; @@ -14,18 +13,17 @@ import mcp.mobius.waila.api.component.ItemComponent; import mcp.mobius.waila.plugin.vanilla.config.EnchantmentDisplayMode; import mcp.mobius.waila.plugin.vanilla.config.Options; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.StringUtil; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.EnchantedBookItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.item.WrittenBookItem; -import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.EnchantmentInstance; +import net.minecraft.world.item.enchantment.ItemEnchantments; import org.jetbrains.annotations.Nullable; public enum ItemEntityProvider implements IEntityComponentProvider { @@ -80,18 +78,15 @@ public static void appendBookProperties(ITooltip tooltip, ItemStack stack, IPlug if (mode == EnchantmentDisplayMode.CYCLE) { var enchantmentTiming = config.getInt(Options.BOOK_ENCHANTMENT_CYCLE_TIMING); - var enchantmentsTag = EnchantedBookItem.getEnchantments(stack); + var enchantmentsComponent = stack.getOrDefault(DataComponents.STORED_ENCHANTMENTS, ItemEnchantments.EMPTY); var now = System.currentTimeMillis(); var enchantments = new ArrayList(); var curses = new ArrayList(); - for (var i = 0; i < enchantmentsTag.size(); i++) { - var enchantmentTag = enchantmentsTag.getCompound(i); - var enchantment = BuiltInRegistries.ENCHANTMENT.get(EnchantmentHelper.getEnchantmentId(enchantmentTag)); - if (enchantment == null) continue; - - var level = EnchantmentHelper.getEnchantmentLevel(enchantmentTag); + for (var entry : enchantmentsComponent.entrySet()) { + var enchantment = entry.getKey().value(); + var level = entry.getIntValue(); var instance = new EnchantmentInstance(enchantment, level); if (enchantment.isCurse()) curses.add(instance); @@ -117,15 +112,15 @@ public static void appendBookProperties(ITooltip tooltip, ItemStack stack, IPlug tooltip.addLine(instance.enchantment.getFullname(instance.level)); } } else { - var enchantments = EnchantmentHelper.getEnchantments(stack); + var enchantments = stack.getOrDefault(DataComponents.STORED_ENCHANTMENTS, ItemEnchantments.EMPTY); if (mode == EnchantmentDisplayMode.COMBINED) { MutableComponent enchantmentLine = null; MutableComponent curseLine = null; for (var entry : enchantments.entrySet()) { - var enchantment = entry.getKey(); - int level = entry.getValue(); + var enchantment = entry.getKey().value(); + var level = entry.getIntValue(); var name = enchantment.getFullname(level); if (enchantment.isCurse()) { @@ -146,21 +141,22 @@ public static void appendBookProperties(ITooltip tooltip, ItemStack stack, IPlug if (enchantmentLine != null) tooltip.addLine(enchantmentLine); if (curseLine != null) tooltip.addLine(curseLine); } else { - enchantments.forEach((enchantment, level) -> tooltip.addLine(enchantment.getFullname(level))); + for (var entry : enchantments.entrySet()) { + tooltip.addLine(entry.getKey().value().getFullname(entry.getIntValue())); + } } } } else if (stack.is(Items.WRITTEN_BOOK)) { - if (!config.getBoolean(Options.BOOK_WRITTEN) || !stack.hasTag()) return; + if (!config.getBoolean(Options.BOOK_WRITTEN)) return; - var tag = Objects.requireNonNull(stack.getTag()); - var author = tag.getString(WrittenBookItem.TAG_AUTHOR); - var generation = WrittenBookItem.getGeneration(stack); + var tag = stack.get(DataComponents.WRITTEN_BOOK_CONTENT); + if (tag == null) return; - if (!StringUtil.isNullOrEmpty(author)) { - tooltip.addLine(Component.translatable("book.byAuthor", author)); + if (!StringUtil.isNullOrEmpty(tag.author())) { + tooltip.addLine(Component.translatable("book.byAuthor", tag.author())); } - tooltip.addLine(Component.translatable("book.generation." + generation)); + tooltip.addLine(Component.translatable("book.generation." + tag.generation())); } } diff --git a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/JukeboxProvider.java b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/JukeboxProvider.java index 2f14fa3e2..2a17c4f89 100644 --- a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/JukeboxProvider.java +++ b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/JukeboxProvider.java @@ -19,7 +19,7 @@ public enum JukeboxProvider implements IBlockComponentProvider, IDataProvider acc var text = stack.getItem() instanceof RecordItem ? Component.translatable(stack.getDescriptionId() + ".desc") : stack.getDisplayName(); - data.raw().putString("record", Component.Serializer.toJson(text)); + data.raw().putString("record", Component.Serializer.toJson(text, accessor.getWorld().registryAccess())); } } } diff --git a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/MobEffectProvider.java b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/MobEffectProvider.java index 23622a336..425008ef8 100644 --- a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/MobEffectProvider.java +++ b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/MobEffectProvider.java @@ -1,7 +1,7 @@ package mcp.mobius.waila.plugin.vanilla.provider; +import java.util.ArrayList; import java.util.List; -import java.util.Objects; import mcp.mobius.waila.api.IData; import mcp.mobius.waila.api.IDataProvider; @@ -14,9 +14,10 @@ import mcp.mobius.waila.plugin.vanilla.config.Options; import net.minecraft.ChatFormatting; import net.minecraft.client.resources.language.I18n; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.effect.MobEffectCategory; import net.minecraft.world.effect.MobEffectInstance; @@ -26,13 +27,16 @@ public enum MobEffectProvider implements IEntityComponentProvider, IDataProvider INSTANCE; - public static final ResourceLocation DATA = new ResourceLocation("mob_effects"); + public static final IData.Type DATA = IData.createType(new ResourceLocation("mob_effects")); + public static final StreamCodec DATA_CODEC = StreamCodec.composite( + ByteBufCodecs.collection(ArrayList::new, MobEffectInstance.STREAM_CODEC), Data::list, + Data::new); @Override public void appendBody(ITooltip tooltip, IEntityAccessor accessor, IPluginConfig config) { if (!config.getBoolean(Options.ATTRIBUTE_MOB_EFFECTS)) return; - var data = accessor.getData().get(Data.class); + var data = accessor.getData().get(DATA); if (data == null) return; data.list.forEach(it -> { @@ -47,7 +51,7 @@ public void appendBody(ITooltip tooltip, IEntityAccessor accessor, IPluginConfig } } - if (it.getEffect().getCategory() == MobEffectCategory.HARMFUL) text.withStyle(ChatFormatting.RED); + if (it.getEffect().value().getCategory() == MobEffectCategory.HARMFUL) text.withStyle(ChatFormatting.RED); tooltip.addLine(text); }); @@ -55,7 +59,7 @@ public void appendBody(ITooltip tooltip, IEntityAccessor accessor, IPluginConfig @Override public void appendData(IDataWriter data, IServerAccessor accessor, IPluginConfig config) { - if (config.getBoolean(Options.ATTRIBUTE_MOB_EFFECTS)) data.add(Data.class, res -> res.add(new Data(accessor + if (config.getBoolean(Options.ATTRIBUTE_MOB_EFFECTS)) data.add(DATA, res -> res.add(new Data(accessor .getTarget() .getActiveEffects() .stream() @@ -67,20 +71,9 @@ public record Data( List list ) implements IData { - public Data(FriendlyByteBuf buf) { - this(buf.readList(b -> { - var effect = b.readById(BuiltInRegistries.MOB_EFFECT); - var amplifier = b.readVarInt(); - return new MobEffectInstance(Objects.requireNonNull(effect), -1, amplifier); - })); - } - @Override - public void write(FriendlyByteBuf buf) { - buf.writeCollection(list, (b, m) -> { - b.writeId(BuiltInRegistries.MOB_EFFECT, m.getEffect()); - b.writeVarInt(m.getAmplifier()); - }); + public Type type() { + return DATA; } } diff --git a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/PlayerHeadProvider.java b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/PlayerHeadProvider.java index ea47a5503..fd665733c 100644 --- a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/PlayerHeadProvider.java +++ b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/PlayerHeadProvider.java @@ -7,7 +7,7 @@ import mcp.mobius.waila.api.ITooltipComponent; import mcp.mobius.waila.api.component.ItemComponent; import mcp.mobius.waila.plugin.vanilla.config.Options; -import net.minecraft.nbt.NbtUtils; +import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -26,9 +26,7 @@ public enum PlayerHeadProvider implements IBlockComponentProvider { public ITooltipComponent getIcon(IBlockAccessor accessor, IPluginConfig config) { SkullBlockEntity skull = accessor.getBlockEntity(); if (skull != null && skull.getOwnerProfile() != null) { - var tag = PLAYER_HEAD_STACK.getOrCreateTag(); - var skullOwner = tag.getCompound("SkullOwner"); - tag.put("SkullOwner", NbtUtils.writeGameProfile(skullOwner, skull.getOwnerProfile())); + PLAYER_HEAD_STACK.set(DataComponents.PROFILE, skull.getOwnerProfile()); return new ItemComponent(PLAYER_HEAD_STACK); } return null; @@ -38,8 +36,8 @@ public ITooltipComponent getIcon(IBlockAccessor accessor, IPluginConfig config) public void appendBody(ITooltip tooltip, IBlockAccessor accessor, IPluginConfig config) { if (config.getBoolean(Options.PLAYER_HEAD_NAME)) { SkullBlockEntity skull = accessor.getBlockEntity(); - if (skull != null && skull.getOwnerProfile() != null && !StringUtils.isBlank(skull.getOwnerProfile().getName())) { - tooltip.addLine(Component.translatable(skull.getOwnerProfile().getName())); + if (skull != null && skull.getOwnerProfile() != null && !StringUtils.isBlank(skull.getOwnerProfile().gameProfile().getName())) { + tooltip.addLine(Component.translatable(skull.getOwnerProfile().gameProfile().getName())); } } } diff --git a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/RandomizableContainerProvider.java b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/RandomizableContainerProvider.java index 65d9fef37..defe364a4 100644 --- a/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/RandomizableContainerProvider.java +++ b/src/pluginVanilla/java/mcp/mobius/waila/plugin/vanilla/provider/RandomizableContainerProvider.java @@ -15,7 +15,7 @@ public enum RandomizableContainerProvider implements IDataProvider accessor, IPluginConfig config) { if (((RandomizableContainerBlockEntityAccess) accessor.getTarget()).wthit_lootTable() != null) { - data.blockAll(ItemData.class); + data.blockAll(ItemData.TYPE); } }