diff --git a/settings.gradle b/settings.gradle index 9f0a410..5dd4a65 100644 --- a/settings.gradle +++ b/settings.gradle @@ -15,7 +15,7 @@ plugins { stonecutter { create(rootProject) { - versions "1.21.4", "1.21.1" + versions "1.21.4", "1.21.1", "1.20.1" vcsVersion = "1.21.4" } } \ No newline at end of file diff --git a/src/main/java/me/clickism/clickvillagers/PartnerState.java b/src/main/java/me/clickism/clickvillagers/PartnerState.java index 55049f6..1d86782 100644 --- a/src/main/java/me/clickism/clickvillagers/PartnerState.java +++ b/src/main/java/me/clickism/clickvillagers/PartnerState.java @@ -14,16 +14,21 @@ public class PartnerState extends PersistentState { + //? if >=1.21.1 { private static final Type type = new Type<>( PartnerState::new, PartnerState::createFromNbt, null ); + //?} private final Map> partners = new HashMap<>(); @Override - public NbtCompound writeNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registries) { + public NbtCompound writeNbt(NbtCompound nbt + //? if >=1.21.1 + , RegistryWrapper.WrapperLookup registries + ) { NbtCompound compound = new NbtCompound(); partners.forEach((uuid, set) -> { if (set.isEmpty()) return; @@ -53,7 +58,10 @@ public void removePartner(UUID uuid, String partner) { markDirty(); } - public static PartnerState createFromNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) { + public static PartnerState createFromNbt(NbtCompound nbt + //? if >=1.21.1 + , RegistryWrapper.WrapperLookup registryLookup + ) { PartnerState state = new PartnerState(); NbtCompound compound = nbt.getCompound("TradePartnerMap"); compound.getKeys().forEach(uuid -> { @@ -68,7 +76,15 @@ public static PartnerState getServerState(MinecraftServer server) { ServerWorld world = server.getWorld(World.OVERWORLD); if (world == null) throw new IllegalStateException("Overworld is null"); PersistentStateManager persistentStateManager = world.getPersistentStateManager(); + //? if >=1.21.1 { PartnerState state = persistentStateManager.getOrCreate(type, ClickVillagers.MOD_ID); + //?} else { + /*PartnerState state = persistentStateManager.getOrCreate( + PartnerState::createFromNbt, + PartnerState::new, + ClickVillagers.MOD_ID + ); + *///?} state.markDirty(); return state; } diff --git a/src/main/java/me/clickism/clickvillagers/PickupHandler.java b/src/main/java/me/clickism/clickvillagers/PickupHandler.java index 8217239..87fc872 100644 --- a/src/main/java/me/clickism/clickvillagers/PickupHandler.java +++ b/src/main/java/me/clickism/clickvillagers/PickupHandler.java @@ -2,9 +2,14 @@ import me.clickism.clickvillagers.util.MessageType; import me.clickism.clickvillagers.util.Utils; +//? if >=1.21.1 { import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.LoreComponent; import net.minecraft.component.type.NbtComponent; +//?} else { + + +//?} import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; @@ -15,6 +20,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtList; +import net.minecraft.nbt.NbtString; import net.minecraft.text.MutableText; import net.minecraft.text.Style; import net.minecraft.text.Text; @@ -41,38 +48,70 @@ public void playSound(PlayerEntity player) { }; private static final String TYPE_KEY = "EntityType"; - - private enum PickupVillagerType { - VILLAGER, ZOMBIE_VILLAGER - } + //? if <1.21.1 + /*private static final String DATA_KEY = "ClickVillagersData";*/ public static ItemStack toItemStack(T entity) { NbtCompound nbt = new NbtCompound(); entity.writeNbt(nbt); String id = EntityType.getId(entity.getType()).toString(); nbt.putString("EntityType", id); - ItemStack itemStack = getItemStack(getDisplayName(entity), NbtComponent.of(nbt)); + ItemStack itemStack = getItemStack(getDisplayName(entity), nbt); VillagerTextures.setEntityTexture(itemStack, entity); entity.remove(Entity.RemovalReason.DISCARDED); return itemStack; } - private static ItemStack getItemStack(Text name, NbtComponent data) { + private static ItemStack getItemStack(Text name, NbtCompound nbt) { ItemStack itemStack = Items.PLAYER_HEAD.getDefaultStack(); - itemStack.set(DataComponentTypes.CUSTOM_DATA, data); - itemStack.set(DataComponentTypes.ITEM_NAME, name); - itemStack.set(DataComponentTypes.LORE, new LoreComponent(List.of( + writeCustomData(itemStack, nbt); + formatItem(itemStack, name, List.of( Text.literal("Right click to place the villager back.") - .fillStyle(Style.EMPTY.withItalic(false).withColor(Formatting.DARK_GRAY))))); + .fillStyle(Style.EMPTY.withItalic(false).withColor(Formatting.DARK_GRAY))) + ); return itemStack; } + + //? if >=1.21.1 { + private static void writeCustomData(ItemStack itemStack, NbtCompound nbt) { + itemStack.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(nbt)); + } + + @Nullable + private static NbtCompound readCustomData(ItemStack itemStack) { + NbtComponent nbt = itemStack.get(DataComponentTypes.CUSTOM_DATA); + if (nbt == null) return null; + return nbt.copyNbt(); + } + + private static void formatItem(ItemStack itemStack, Text name, List lore) { + itemStack.set(DataComponentTypes.ITEM_NAME, name); + itemStack.set(DataComponentTypes.LORE, new LoreComponent(lore)); + } + //?} else { + /*private static void writeCustomData(ItemStack itemStack, NbtCompound nbt) { + itemStack.getOrCreateNbt().put(DATA_KEY, nbt); + } + + @Nullable + private static NbtCompound readCustomData(ItemStack itemStack) { + return itemStack.getOrCreateNbt().getCompound(DATA_KEY); + } + + private static void formatItem(ItemStack itemStack, Text name, List lore) { + NbtList list = new NbtList(); + lore.forEach(text -> list.add(NbtString.of(Text.Serializer.toJson(text)))); + NbtCompound display = itemStack.getOrCreateSubNbt("display"); + display.put("Lore", list); + display.put("Name", NbtString.of(Text.Serializer.toJson(name))); + } + *///?} @Nullable public static Entity readEntityFromItemStack(World world, ItemStack itemStack) { try { - NbtComponent nbtComponent = itemStack.get(DataComponentTypes.CUSTOM_DATA); - if (nbtComponent == null) return null; - NbtCompound nbt = nbtComponent.copyNbt(); + NbtCompound nbt = readCustomData(itemStack); + if (nbt == null) return null; // PickupVillagerType type = PickupVillagerType.valueOf(nbt.getString(TYPE_KEY)); String id = nbt.getString(TYPE_KEY); if (id == null) return null; diff --git a/src/main/java/me/clickism/clickvillagers/VersionHelper.java b/src/main/java/me/clickism/clickvillagers/VersionHelper.java new file mode 100644 index 0000000..34f87ea --- /dev/null +++ b/src/main/java/me/clickism/clickvillagers/VersionHelper.java @@ -0,0 +1,15 @@ +package me.clickism.clickvillagers; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvent; +import net.minecraft.sound.SoundEvents; + +public class VersionHelper { + public static void playSound(PlayerEntity player, SoundEvent soundEvent, SoundCategory category, float volume, float pitch) { + //? if >=1.21.1 { + player.playSoundToPlayer(soundEvent, category, volume, pitch); + //?} else + /*player.playSound(soundEvent, category, volume, pitch);*/ + } +} diff --git a/src/main/java/me/clickism/clickvillagers/VillagerTextures.java b/src/main/java/me/clickism/clickvillagers/VillagerTextures.java index 66a4e00..f5b0a1f 100644 --- a/src/main/java/me/clickism/clickvillagers/VillagerTextures.java +++ b/src/main/java/me/clickism/clickvillagers/VillagerTextures.java @@ -1,13 +1,20 @@ package me.clickism.clickvillagers; +import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import com.mojang.authlib.properties.PropertyMap; +//? if >=1.21.1 { import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.ProfileComponent; +//?} else { + +//?} import net.minecraft.entity.Entity; import net.minecraft.entity.mob.ZombieVillagerEntity; import net.minecraft.entity.passive.VillagerEntity; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtHelper; import net.minecraft.village.VillagerProfession; import java.util.Map; @@ -40,13 +47,21 @@ public class VillagerTextures { public static void setEntityTexture(ItemStack itemStack, Entity entity) { setTexture(itemStack, getTexture(entity)); } - + + //? if >=1.21.1 { private static void setTexture(ItemStack itemStack, String texture) { PropertyMap propertyMap = new PropertyMap(); propertyMap.put("textures", new Property("textures", texture)); itemStack.set(DataComponentTypes.PROFILE, new ProfileComponent(Optional.empty(), Optional.of(UUID.randomUUID()), propertyMap)); } + //?} else { + /*private static void setTexture(ItemStack itemStack, String texture) { + GameProfile profile = new GameProfile(UUID.randomUUID(), null); + profile.getProperties().put("textures", new Property("textures", texture)); + itemStack.getOrCreateNbt().put("SkullOwner", NbtHelper.writeGameProfile(new NbtCompound(), profile)); + } + *///?} public static String getTexture(Entity entity) { if (entity instanceof ZombieVillagerEntity) { diff --git a/src/main/java/me/clickism/clickvillagers/AnchorHandler.java b/src/main/java/me/clickism/clickvillagers/anchor/AnchorHandler.java similarity index 74% rename from src/main/java/me/clickism/clickvillagers/AnchorHandler.java rename to src/main/java/me/clickism/clickvillagers/anchor/AnchorHandler.java index 9a6850b..2f44b83 100644 --- a/src/main/java/me/clickism/clickvillagers/AnchorHandler.java +++ b/src/main/java/me/clickism/clickvillagers/anchor/AnchorHandler.java @@ -1,20 +1,20 @@ -package me.clickism.clickvillagers; +package me.clickism.clickvillagers.anchor; -import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.passive.VillagerEntity; public class AnchorHandler { + private static final int ANCHOR_DURATION_THRESHOLD = Integer.MAX_VALUE / 4; + public static boolean isAnchored(LivingEntity entity) { return entity.getStatusEffects().stream().anyMatch(AnchorHandler::isAnchorEffect); } public static void addAnchorEffect(LivingEntity entity) { entity.addStatusEffect(new StatusEffectInstance(StatusEffects.SLOWNESS, Integer.MAX_VALUE, - StatusEffectInstance.MAX_AMPLIFIER, true, false, false)); + 255, true, false, false)); } public static void removeAnchorEffect(LivingEntity entity) { @@ -23,6 +23,6 @@ public static void removeAnchorEffect(LivingEntity entity) { protected static boolean isAnchorEffect(StatusEffectInstance effect) { return effect.getEffectType().equals(StatusEffects.SLOWNESS) - && effect.getAmplifier() == StatusEffectInstance.MAX_AMPLIFIER; + && effect.getDuration() > ANCHOR_DURATION_THRESHOLD; } } diff --git a/src/main/java/me/clickism/clickvillagers/callback/VillagerUseEntityCallback.java b/src/main/java/me/clickism/clickvillagers/callback/VillagerUseEntityCallback.java index 7a0a5c9..e9feef1 100644 --- a/src/main/java/me/clickism/clickvillagers/callback/VillagerUseEntityCallback.java +++ b/src/main/java/me/clickism/clickvillagers/callback/VillagerUseEntityCallback.java @@ -1,9 +1,7 @@ package me.clickism.clickvillagers.callback; -import me.clickism.clickvillagers.AnchorHandler; -import me.clickism.clickvillagers.PartnerState; -import me.clickism.clickvillagers.PickupHandler; -import me.clickism.clickvillagers.VillagerHandler; +import me.clickism.clickvillagers.*; +import me.clickism.clickvillagers.anchor.AnchorHandler; import me.clickism.clickvillagers.gui.VillagerClaimGui; import me.clickism.clickvillagers.gui.VillagerEditGui; import me.clickism.clickvillagers.util.MessageType; @@ -120,7 +118,7 @@ private void handleAnchor(PlayerEntity player, VillagerHandler villagerHandle } else { AnchorHandler.addAnchorEffect(entity); MessageType.CONFIRM.sendSilently(player, Text.literal("Villager anchored.")); - player.playSoundToPlayer(SoundEvents.BLOCK_BEEHIVE_SHEAR, SoundCategory.MASTER, 1, 1); + VersionHelper.playSound(player, SoundEvents.BLOCK_BEEHIVE_SHEAR, SoundCategory.MASTER, 1, 1); } } } diff --git a/src/main/java/me/clickism/clickvillagers/gui/BackButton.java b/src/main/java/me/clickism/clickvillagers/gui/BackButton.java index 154e92a..1ce7cbe 100644 --- a/src/main/java/me/clickism/clickvillagers/gui/BackButton.java +++ b/src/main/java/me/clickism/clickvillagers/gui/BackButton.java @@ -20,7 +20,10 @@ public class BackButton extends GuiElement { public BackButton(GuiInterface previous) { super(item, (index, type, action, gui) -> { previous.open(); + //? if >=1.21.1 { previous.getPlayer().playSoundToPlayer(SoundEvents.UI_LOOM_SELECT_PATTERN, SoundCategory.MASTER, 1, 1); + //?} else + /*previous.getPlayer().playSound(SoundEvents.UI_LOOM_SELECT_PATTERN, SoundCategory.MASTER, 1, 1);*/ }); } } diff --git a/src/main/java/me/clickism/clickvillagers/gui/DecoratedGui.java b/src/main/java/me/clickism/clickvillagers/gui/DecoratedGui.java index bd29b8d..684c0b7 100644 --- a/src/main/java/me/clickism/clickvillagers/gui/DecoratedGui.java +++ b/src/main/java/me/clickism/clickvillagers/gui/DecoratedGui.java @@ -12,11 +12,17 @@ public abstract class DecoratedGui extends SimpleGui { private static final GuiElementInterface BLACK = new GuiElementBuilder(Items.BLACK_STAINED_GLASS_PANE) .setName(Text.literal("x").formatted(Formatting.DARK_GRAY)) + //? if >=1.21.1 { .hideDefaultTooltip() + //?} else + /*.hideFlags()*/ .build(); private static final GuiElementInterface GRAY = new GuiElementBuilder(Items.GRAY_STAINED_GLASS_PANE) .setName(Text.literal("x").formatted(Formatting.DARK_GRAY)) + //? if >=1.21.1 { .hideDefaultTooltip() + //?} else + /*.hideFlags()*/ .build(); public DecoratedGui(ServerPlayerEntity player) { diff --git a/src/main/java/me/clickism/clickvillagers/gui/VillagerClaimGui.java b/src/main/java/me/clickism/clickvillagers/gui/VillagerClaimGui.java index 55e3f5a..b5e496e 100644 --- a/src/main/java/me/clickism/clickvillagers/gui/VillagerClaimGui.java +++ b/src/main/java/me/clickism/clickvillagers/gui/VillagerClaimGui.java @@ -16,7 +16,10 @@ public VillagerClaimGui(ServerPlayerEntity player, VillagerHandler villagerHa setSlot(13, new GuiElementBuilder(Items.GOLDEN_SHOVEL) .setName(Text.literal("🔒 ").formatted(Formatting.GOLD) .append(Text.literal("CLAIM VILLAGER").formatted(Formatting.GOLD, Formatting.BOLD))) + //? if >=1.21.1 { .hideDefaultTooltip() + //?} else + /*.hideFlags()*/ .addLoreLine(Text.literal("Click to claim this villager.").formatted(Formatting.YELLOW)) .setCallback((index, type, action, gui) -> { MessageType.CONFIRM.send(player, Text.literal("You claimed this villager.")); diff --git a/src/main/java/me/clickism/clickvillagers/gui/VillagerEditGui.java b/src/main/java/me/clickism/clickvillagers/gui/VillagerEditGui.java index d1d4a4c..7ee77d7 100644 --- a/src/main/java/me/clickism/clickvillagers/gui/VillagerEditGui.java +++ b/src/main/java/me/clickism/clickvillagers/gui/VillagerEditGui.java @@ -25,7 +25,6 @@ public VillagerEditGui(ServerPlayerEntity player, VillagerHandler villagerHan .setName(Text.literal("🌲 ").formatted(Formatting.GOLD) .append(Text.literal("CHANGE BIOME").formatted(Formatting.GOLD, Formatting.BOLD))) .addLoreLine(Text.literal("Click to change the villager's biome.").formatted(Formatting.YELLOW)) - .hideDefaultTooltip() .setCallback((index, type, action, gui) -> { MessageType.CONFIRM.playSound(player); new VillagerBiomeChangeGui(player, villagerHandler, this).open(); @@ -48,7 +47,6 @@ public VillagerEditGui(ServerPlayerEntity player, VillagerHandler villagerHan .append(Text.literal("UNCLAIM VILLAGER").formatted(Formatting.DARK_RED, Formatting.BOLD))) .addLoreLine(Text.literal("Click to unclaim this villager.").formatted(Formatting.RED, Formatting.BOLD)) .addLoreLine(Text.literal("Unclaimed villagers can be picked up by anyone.").formatted(Formatting.RED)) - .hideDefaultTooltip() .setCallback((index, type, action, gui) -> { MessageType.WARN.send(player, Text.literal("You unclaimed this villager.")); villagerHandler.setOwner(null); @@ -61,7 +59,6 @@ public VillagerEditGui(ServerPlayerEntity player, VillagerHandler villagerHan .append(Text.literal("ADD TRADING PARTNER").formatted(Formatting.WHITE, Formatting.BOLD))) .addLoreLine(Text.literal("Click to add/remove a trading partner.").formatted(Formatting.GRAY)) .addLoreLine(Text.literal("Trading partners can trade with all of your villagers.").formatted(Formatting.GRAY)) - .hideDefaultTooltip() .setCallback((index, type, action, gui) -> { MessageType.CONFIRM.playSound(player); new VillagerPartnerGui(player, this).open(); diff --git a/src/main/java/me/clickism/clickvillagers/gui/VillagerPartnerGui.java b/src/main/java/me/clickism/clickvillagers/gui/VillagerPartnerGui.java index 68dccf5..f1e0e60 100644 --- a/src/main/java/me/clickism/clickvillagers/gui/VillagerPartnerGui.java +++ b/src/main/java/me/clickism/clickvillagers/gui/VillagerPartnerGui.java @@ -1,10 +1,8 @@ package me.clickism.clickvillagers.gui; -import eu.pb4.sgui.api.ClickType; import eu.pb4.sgui.api.elements.GuiElement; import eu.pb4.sgui.api.elements.GuiElementBuilder; import eu.pb4.sgui.api.gui.AnvilInputGui; -import eu.pb4.sgui.api.gui.GuiInterface; import me.clickism.clickvillagers.PartnerState; import me.clickism.clickvillagers.util.MessageType; import net.minecraft.item.Items; @@ -16,9 +14,9 @@ public class VillagerPartnerGui extends AnvilInputGui { private final MinecraftServer server; - private final GuiInterface previous; + private final VillagerGui previous; - public VillagerPartnerGui(ServerPlayerEntity player, GuiInterface previous) { + public VillagerPartnerGui(ServerPlayerEntity player, VillagerGui previous) { super(player, false); this.server = player.getServer(); this.previous = previous; @@ -54,7 +52,7 @@ private GuiElement getConfirmButton(String input) { partnerState.addPartner(uuid, input); MessageType.CONFIRM.send(player, Text.literal("Added " + input + " to your trading partners.")); } - previous.open(); + new VillagerEditGui(player, previous.villagerHandler).open(); }); if (isPartner(input)) { builder diff --git a/src/main/java/me/clickism/clickvillagers/mixin/VillagerDataMixin.java b/src/main/java/me/clickism/clickvillagers/mixin/VillagerDataMixin.java index d328aec..a622f33 100644 --- a/src/main/java/me/clickism/clickvillagers/mixin/VillagerDataMixin.java +++ b/src/main/java/me/clickism/clickvillagers/mixin/VillagerDataMixin.java @@ -2,10 +2,13 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.mojang.datafixers.util.Either; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import me.clickism.clickvillagers.ClaimedVillagerData; +import me.clickism.clickvillagers.util.CodecUtils; +import me.clickism.clickvillagers.util.LazyCodec; import net.minecraft.util.Uuids; import net.minecraft.village.VillagerData; import org.jetbrains.annotations.Nullable; @@ -32,10 +35,10 @@ public abstract class VillagerDataMixin implements ClaimedVillagerData { ) ) private static Codec modifyCodec(Codec original) { - return Codec.lazyInitialized(() -> Codec.withAlternative( + return LazyCodec.of(() -> CodecUtils.withAlternative( RecordCodecBuilder.create( instance -> instance.group( - MapCodec.assumeMapUnsafe(original).forGetter(Function.identity()), + CodecUtils.assumeMapUnsafe(original).forGetter(Function.identity()), Uuids.CODEC.optionalFieldOf("owner").orElse(null).forGetter(villagerData -> Optional.ofNullable(((ClaimedVillagerData) villagerData).clickVillagers_Fabric$getOwner())), Codec.BOOL.fieldOf("tradingOpen").orElse(true).forGetter(villagerData -> @@ -46,7 +49,9 @@ private static Codec modifyCodec(Codec original) { claimedData.clickVillagers_Fabric$setTradingOpen(tradingOpen); return data; }) - ), original)); + ), + original + )); } @ModifyReturnValue(method = "withType", at = @At("RETURN")) diff --git a/src/main/java/me/clickism/clickvillagers/util/CodecUtils.java b/src/main/java/me/clickism/clickvillagers/util/CodecUtils.java new file mode 100644 index 0000000..575e5cc --- /dev/null +++ b/src/main/java/me/clickism/clickvillagers/util/CodecUtils.java @@ -0,0 +1,75 @@ +package me.clickism.clickvillagers.util; + +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.*; + +import java.util.function.Function; +import java.util.stream.Stream; + +/* + MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + documentation files (the Software), to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions + of the Software. + + THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO + THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + */ +public class CodecUtils { + + public static MapCodec assumeMapUnsafe(final Codec codec) { + return new MapCodec<>() { + private static final String COMPRESSED_VALUE_KEY = "value"; + + @Override + public Stream keys(final DynamicOps ops) { + return Stream.of(ops.createString(COMPRESSED_VALUE_KEY)); + } + + @Override + public DataResult decode(final DynamicOps ops, final MapLike input) { + if (ops.compressMaps()) { + final T value = input.get(COMPRESSED_VALUE_KEY); + if (value == null) { + return DataResult.error(() -> "Missing value"); + } + return codec.parse(ops, value); + } + return codec.parse(ops, ops.createMap(input.entries())); + } + + @Override + public RecordBuilder encode(final A input, final DynamicOps ops, final RecordBuilder prefix) { + final DataResult encoded = codec.encodeStart(ops, input); + if (ops.compressMaps()) { + return prefix.add(COMPRESSED_VALUE_KEY, encoded); + } + final DataResult> encodedMapResult = encoded.flatMap(ops::getMap); + return encodedMapResult.map(encodedMap -> { + encodedMap.entries().forEach(pair -> prefix.add(pair.getFirst(), pair.getSecond())); + return prefix; + }).result().orElseGet(() -> prefix.withErrorsFrom(encodedMapResult)); + } + }; + } + + public static Codec withAlternative(final Codec primary, final Codec alternative) { + return Codec.either( + primary, + alternative + ).xmap( + either -> either.map(Function.identity(), Function.identity()), + Either::left + ); + } +} diff --git a/src/main/java/me/clickism/clickvillagers/util/LazyCodec.java b/src/main/java/me/clickism/clickvillagers/util/LazyCodec.java new file mode 100644 index 0000000..1cce7bb --- /dev/null +++ b/src/main/java/me/clickism/clickvillagers/util/LazyCodec.java @@ -0,0 +1,35 @@ +package me.clickism.clickvillagers.util; + +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.DynamicOps; + +import java.util.function.Supplier; + +public class LazyCodec implements Codec { + private final Supplier> codecSupplier; + + private LazyCodec(Supplier> codecSupplier) { + this.codecSupplier = codecSupplier; + } + + @Override + public DataResult> decode(DynamicOps ops, T1 input) { + return codecSupplier.get().decode(ops, input); + } + + @Override + public DataResult encode(T input, DynamicOps ops, T1 prefix) { + return codecSupplier.get().encode(input, ops, prefix); + } + + @Override + public String toString() { + return "LazyCodec[" + codecSupplier.get().toString() + "]"; + } + + public static LazyCodec of(Supplier> codecSupplier) { + return new LazyCodec<>(codecSupplier); + } +} diff --git a/src/main/java/me/clickism/clickvillagers/util/MessageType.java b/src/main/java/me/clickism/clickvillagers/util/MessageType.java index 4953840..8a97722 100644 --- a/src/main/java/me/clickism/clickvillagers/util/MessageType.java +++ b/src/main/java/me/clickism/clickvillagers/util/MessageType.java @@ -1,5 +1,6 @@ package me.clickism.clickvillagers.util; +import me.clickism.clickvillagers.VersionHelper; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; @@ -16,8 +17,8 @@ public abstract class MessageType { ) { @Override public void playSound(PlayerEntity player) { - player.playSoundToPlayer(SoundEvents.BLOCK_NOTE_BLOCK_CHIME.value(), SoundCategory.MASTER, 1, 1); - player.playSoundToPlayer(SoundEvents.BLOCK_NOTE_BLOCK_CHIME.value(), SoundCategory.MASTER, 1, 2); + VersionHelper.playSound(player, SoundEvents.BLOCK_NOTE_BLOCK_CHIME.value(), SoundCategory.MASTER, 1, 1); + VersionHelper.playSound(player, SoundEvents.BLOCK_NOTE_BLOCK_CHIME.value(), SoundCategory.MASTER, 1, 2); } }; @@ -27,7 +28,7 @@ public void playSound(PlayerEntity player) { ) { @Override public void playSound(PlayerEntity player) { - player.playSoundToPlayer(SoundEvents.BLOCK_AMETHYST_BLOCK_RESONATE, SoundCategory.MASTER, 1, .5f); + VersionHelper.playSound(player, SoundEvents.BLOCK_AMETHYST_BLOCK_RESONATE, SoundCategory.MASTER, 1, .5f); } }; @@ -37,7 +38,7 @@ public void playSound(PlayerEntity player) { ) { @Override public void playSound(PlayerEntity player) { - player.playSoundToPlayer(SoundEvents.BLOCK_AMETHYST_BLOCK_RESONATE, SoundCategory.MASTER, 1, 1f); + VersionHelper.playSound(player, SoundEvents.BLOCK_AMETHYST_BLOCK_RESONATE, SoundCategory.MASTER, 1, 1f); } }; diff --git a/versions/1.20.1/gradle.properties b/versions/1.20.1/gradle.properties new file mode 100644 index 0000000..0af2724 --- /dev/null +++ b/versions/1.20.1/gradle.properties @@ -0,0 +1,6 @@ +mod.mc_version=~1.20.1 + +deps.yarn_mappings=1.20.1+build.10 +deps.fabric_api=0.92.2+1.20.1 + +deps.sgui=1.2.2+1.20