diff --git a/xplat/src/client/java/gay/pridecraft/joy/mixin/client/minecraft/MixinCapeFeatureRenderer.java b/xplat/src/client/java/gay/pridecraft/joy/mixin/client/minecraft/MixinCapeFeatureRenderer.java new file mode 100644 index 0000000..9544e0d --- /dev/null +++ b/xplat/src/client/java/gay/pridecraft/joy/mixin/client/minecraft/MixinCapeFeatureRenderer.java @@ -0,0 +1,28 @@ +package gay.pridecraft.joy.mixin.client.minecraft; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import gay.pridecraft.joy.tags.JoyItemTags; +import net.minecraft.client.render.entity.feature.CapeFeatureRenderer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +/** + * @author Ampflower + * @since 1.0.0 + **/ +@Mixin(CapeFeatureRenderer.class) +public class MixinCapeFeatureRenderer { + @WrapOperation( + method = "render", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z")) + private static boolean isElytra(ItemStack self, Item ref, Operation operation) { + if (self.isIn(JoyItemTags.ELYTRA)) { + return true; + } + return operation.call(self, ref); + } +} diff --git a/xplat/src/client/resources/joy.client.mixins.json b/xplat/src/client/resources/joy.client.mixins.json index 228755b..e37ae6a 100644 --- a/xplat/src/client/resources/joy.client.mixins.json +++ b/xplat/src/client/resources/joy.client.mixins.json @@ -5,10 +5,8 @@ "refmap": "client-joy.refmap.json", "compatibilityLevel": "JAVA_21", "client": [ - "BipedEntityModelMixin", - "ClientPlayNetworkHandlerMixin", - "PlayerEntityRendererMixin", - "SplashTextResourceSupplierMixin" + "BipedEntityModelMixin", "ClientPlayNetworkHandlerMixin", "PlayerEntityRendererMixin", + "SplashTextResourceSupplierMixin", "minecraft.MixinCapeFeatureRenderer" ], "injectors": { "defaultRequire": 1 diff --git a/xplat/src/datagen/java/gay/pridecraft/joy/data/JoyData.java b/xplat/src/datagen/java/gay/pridecraft/joy/data/JoyData.java index 9b4e3e8..fb23957 100644 --- a/xplat/src/datagen/java/gay/pridecraft/joy/data/JoyData.java +++ b/xplat/src/datagen/java/gay/pridecraft/joy/data/JoyData.java @@ -23,6 +23,7 @@ public class JoyData implements DataGeneratorEntrypoint { pack.addProvider(JoyBlockLootProvider::new); pack.addProvider(JoyBlockTagProvider::new); pack.addProvider(JoyEntityTagProvider::new); + pack.addProvider(JoyItemTagProvider::new); pack.addProvider(JoyModelProvider::new); for (final var translation : Bootstrap.getMissingTranslations()) { diff --git a/xplat/src/datagen/java/gay/pridecraft/joy/data/JoyItemTagProvider.java b/xplat/src/datagen/java/gay/pridecraft/joy/data/JoyItemTagProvider.java new file mode 100644 index 0000000..07f1428 --- /dev/null +++ b/xplat/src/datagen/java/gay/pridecraft/joy/data/JoyItemTagProvider.java @@ -0,0 +1,31 @@ +package gay.pridecraft.joy.data; + +import gay.pridecraft.joy.registry.JoyItems; +import gay.pridecraft.joy.tags.JoyItemTags; +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider; +import net.minecraft.item.Items; +import net.minecraft.registry.RegistryWrapper; + +import java.util.concurrent.CompletableFuture; + +/** + * @author Ampflower + * @since 1.0.0 + **/ +public class JoyItemTagProvider extends FabricTagProvider.ItemTagProvider { + public JoyItemTagProvider(final FabricDataOutput output, final CompletableFuture completableFuture) { + super(output, completableFuture); + } + + @Override + protected void configure(final RegistryWrapper.WrapperLookup wrapperLookup) { + getOrCreateTagBuilder(JoyItemTags.ELYTRA).add( + Items.ELYTRA, + JoyItems.PRIDE_ELYTRA + ); + getOrCreateTagBuilder(JoyItemTags.GLIDERS).addTag( + JoyItemTags.ELYTRA + ); + } +} diff --git a/xplat/src/main/java/gay/pridecraft/joy/mixin/minecraft/MixinLivingEntity.java b/xplat/src/main/java/gay/pridecraft/joy/mixin/minecraft/MixinLivingEntity.java new file mode 100644 index 0000000..680d2ea --- /dev/null +++ b/xplat/src/main/java/gay/pridecraft/joy/mixin/minecraft/MixinLivingEntity.java @@ -0,0 +1,28 @@ +package gay.pridecraft.joy.mixin.minecraft; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import gay.pridecraft.joy.tags.JoyItemTags; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +/** + * @author Ampflower + * @since 1.0.0 + **/ +@Mixin(LivingEntity.class) +public class MixinLivingEntity { + @WrapOperation( + method = "tickFallFlying", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z")) + private static boolean isElytra(ItemStack self, Item ref, Operation operation) { + if (self.isIn(JoyItemTags.GLIDERS)) { + return true; + } + return operation.call(self, ref); + } +} diff --git a/xplat/src/main/java/gay/pridecraft/joy/mixin/minecraft/MixinPlayerEntity.java b/xplat/src/main/java/gay/pridecraft/joy/mixin/minecraft/MixinPlayerEntity.java new file mode 100644 index 0000000..3e7172e --- /dev/null +++ b/xplat/src/main/java/gay/pridecraft/joy/mixin/minecraft/MixinPlayerEntity.java @@ -0,0 +1,28 @@ +package gay.pridecraft.joy.mixin.minecraft; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import gay.pridecraft.joy.tags.JoyItemTags; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +/** + * @author Ampflower + * @since 1.0.0 + **/ +@Mixin(PlayerEntity.class) +public class MixinPlayerEntity { + @WrapOperation( + method = "checkFallFlying", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z")) + private static boolean isElytra(ItemStack self, Item ref, Operation operation) { + if (self.isIn(JoyItemTags.GLIDERS)) { + return true; + } + return operation.call(self, ref); + } +} diff --git a/xplat/src/main/java/gay/pridecraft/joy/tags/JoyItemTags.java b/xplat/src/main/java/gay/pridecraft/joy/tags/JoyItemTags.java new file mode 100644 index 0000000..9ab0b4b --- /dev/null +++ b/xplat/src/main/java/gay/pridecraft/joy/tags/JoyItemTags.java @@ -0,0 +1,25 @@ +package gay.pridecraft.joy.tags; + +import gay.pridecraft.joy.JoyUtil; +import net.minecraft.item.Item; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.tag.TagKey; +import net.minecraft.util.Identifier; + +/** + * @author Ampflower + * @since 1.0.0 + **/ +public final class JoyItemTags { + public static final TagKey + GLIDERS = common("gliders"), + ELYTRA = common("elytra"); + + private static TagKey joy(String name) { + return TagKey.of(RegistryKeys.ITEM, JoyUtil.id(name)); + } + + private static TagKey common(String name) { + return TagKey.of(RegistryKeys.ITEM, Identifier.of("c", name)); + } +} diff --git a/xplat/src/main/resources/assets/joy/lang/en_us.json b/xplat/src/main/resources/assets/joy/lang/en_us.json index 70607e0..423599c 100644 --- a/xplat/src/main/resources/assets/joy/lang/en_us.json +++ b/xplat/src/main/resources/assets/joy/lang/en_us.json @@ -187,5 +187,8 @@ "tooltip.joy.owner.rename": "%s of %s", "tag.item.joy.plushies": "Plushies", - "tag.item.joy.sharks": "Shark Plushies" + "tag.item.joy.sharks": "Shark Plushies", + + "tag.item.c.gliders": "Gliders", + "tag.item.c.elytra": "Elytra" } diff --git a/xplat/src/main/resources/joy.mixins.json b/xplat/src/main/resources/joy.mixins.json index c8d387f..5b9f9c9 100644 --- a/xplat/src/main/resources/joy.mixins.json +++ b/xplat/src/main/resources/joy.mixins.json @@ -6,7 +6,7 @@ "compatibilityLevel": "JAVA_21", "mixins": [ "AllayEntityMixin", "LivingEntityMixin", "PaintingVariantsMixin", - "minecraft.AccessorPoi" + "minecraft.AccessorPoi", "minecraft.MixinLivingEntity", "minecraft.MixinPlayerEntity" ], "injectors": { "defaultRequire": 1