From f3ceaa8c72beea77e2a3ef6452c09fb8bbd5cee6 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 10 Jun 2022 18:25:24 +0200 Subject: [PATCH] [Feature] Trinket Support for BE-Elytra --- build.gradle | 4 + gradle.properties | 3 +- .../java/org/betterx/betterend/BetterEnd.java | 12 ++- .../betterend/client/BetterEndClient.java | 5 + .../client/render/ArmoredElytraLayer.java | 8 +- .../integration/trinkets/Elytra.java | 101 ++++++++++++++++++ .../integration/trinkets/ElytraClient.java | 22 ++++ .../data/trinkets/entities/betterend.json | 8 ++ .../data/trinkets/tags/items/chest/cape.json | 7 ++ src/main/resources/fabric.mod.json | 5 +- 10 files changed, 166 insertions(+), 9 deletions(-) create mode 100644 src/main/java/org/betterx/betterend/integration/trinkets/Elytra.java create mode 100644 src/main/java/org/betterx/betterend/integration/trinkets/ElytraClient.java create mode 100644 src/main/resources/data/trinkets/entities/betterend.json create mode 100644 src/main/resources/data/trinkets/tags/items/chest/cape.json diff --git a/build.gradle b/build.gradle index acbcea3f..fd146bd8 100644 --- a/build.gradle +++ b/build.gradle @@ -24,6 +24,7 @@ repositories { maven { url "https://maven.shedaniel.me/" } maven { url 'https://jitpack.io' } maven { url 'https://maven.terraformersmc.com/releases' } + maven { url "https://ladysnake.jfrog.io/artifactory/mods" } flatDir { dirs 'libs' } @@ -48,6 +49,9 @@ dependencies { } useOptional "me.shedaniel:RoughlyEnoughItems-fabric:${project.rei_version}" useOptional "me.shedaniel:RoughlyEnoughItems-api-fabric:${project.rei_version}" + + modImplementation "dev.emi:trinkets:${project.trinkets_version}" + } def useOptional(String dep) { diff --git a/gradle.properties b/gradle.properties index 10f454e1..1541e28d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,5 +14,6 @@ archives_base_name=better-end # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api patchouli_version=55-FABRIC-SNAPSHOT -bclib_version=2.0.4 +bclib_version=2.0.5 rei_version=9.0.472 +trinkets_version=3.4.0 diff --git a/src/main/java/org/betterx/betterend/BetterEnd.java b/src/main/java/org/betterx/betterend/BetterEnd.java index c695d6b4..d53e8651 100644 --- a/src/main/java/org/betterx/betterend/BetterEnd.java +++ b/src/main/java/org/betterx/betterend/BetterEnd.java @@ -8,6 +8,7 @@ import org.betterx.betterend.commands.CommandRegistry; import org.betterx.betterend.config.Configs; import org.betterx.betterend.effects.EndPotions; import org.betterx.betterend.integration.Integrations; +import org.betterx.betterend.integration.trinkets.Elytra; import org.betterx.betterend.recipe.*; import org.betterx.betterend.registry.*; import org.betterx.betterend.util.BonemealPlants; @@ -24,9 +25,9 @@ import net.fabricmc.loader.api.FabricLoader; public class BetterEnd implements ModInitializer { public static final String MOD_ID = "betterend"; public static final Logger LOGGER = new Logger(MOD_ID); - public static final boolean RUNS_FALL_FLYING_LIB = FabricLoader.getInstance() - .getModContainer("fallflyinglib") - .isPresent(); + public static final boolean RUNS_TRINKETS = FabricLoader.getInstance() + .getModContainer("trinkets") + .isPresent(); @Override public void onInitialize() { @@ -77,11 +78,14 @@ public class BetterEnd implements ModInitializer { EndStructures.addBiomeStructures(biomeID, biome); } }); - + if (RUNS_TRINKETS) { + Elytra.register(); + } } public static ResourceLocation makeID(String path) { return new ResourceLocation(MOD_ID, path); } + } diff --git a/src/main/java/org/betterx/betterend/client/BetterEndClient.java b/src/main/java/org/betterx/betterend/client/BetterEndClient.java index cccd4b26..1463c2eb 100644 --- a/src/main/java/org/betterx/betterend/client/BetterEndClient.java +++ b/src/main/java/org/betterx/betterend/client/BetterEndClient.java @@ -5,6 +5,7 @@ import org.betterx.bclib.util.TranslationHelper; import org.betterx.betterend.BetterEnd; import org.betterx.betterend.client.render.BetterEndSkyRenderer; import org.betterx.betterend.events.ItemTooltipCallback; +import org.betterx.betterend.integration.trinkets.ElytraClient; import org.betterx.betterend.interfaces.MultiModelItem; import org.betterx.betterend.item.CrystaliteArmor; import org.betterx.betterend.registry.*; @@ -56,6 +57,10 @@ public class BetterEndClient implements ClientModInitializer { if (ClientOptions.isCustomSky()) { DimensionRenderingRegistry.registerSkyRenderer(Level.END, new BetterEndSkyRenderer()); } + + if (BetterEnd.RUNS_TRINKETS) { + ElytraClient.register(); + } } public static void registerTooltips() { diff --git a/src/main/java/org/betterx/betterend/client/render/ArmoredElytraLayer.java b/src/main/java/org/betterx/betterend/client/render/ArmoredElytraLayer.java index 936e1c39..aebe0650 100644 --- a/src/main/java/org/betterx/betterend/client/render/ArmoredElytraLayer.java +++ b/src/main/java/org/betterx/betterend/client/render/ArmoredElytraLayer.java @@ -1,6 +1,7 @@ package org.betterx.betterend.client.render; import org.betterx.bclib.items.elytra.BCLElytraItem; +import org.betterx.bclib.items.elytra.BCLElytraUtils; import org.betterx.betterend.item.model.ArmoredElytraModel; import org.betterx.betterend.registry.EndEntitiesRenders; @@ -41,8 +42,11 @@ public class ArmoredElytraLayer float k, float l ) { - ItemStack itemStack = livingEntity.getItemBySlot(EquipmentSlot.CHEST); - if (itemStack.getItem() instanceof BCLElytraItem) { + ItemStack itemStack = (BCLElytraUtils.slotProvider == null) + ? livingEntity.getItemBySlot(EquipmentSlot.CHEST) + : BCLElytraUtils.slotProvider.getElytra(livingEntity, livingEntity::getItemBySlot); + + if (itemStack != null && itemStack.getItem() instanceof BCLElytraItem) { ResourceLocation wingsTexture = ((BCLElytraItem) itemStack.getItem()).getModelTexture(); if (livingEntity instanceof AbstractClientPlayer) { AbstractClientPlayer abstractClientPlayer = (AbstractClientPlayer) livingEntity; diff --git a/src/main/java/org/betterx/betterend/integration/trinkets/Elytra.java b/src/main/java/org/betterx/betterend/integration/trinkets/Elytra.java new file mode 100644 index 00000000..228048a2 --- /dev/null +++ b/src/main/java/org/betterx/betterend/integration/trinkets/Elytra.java @@ -0,0 +1,101 @@ +package org.betterx.betterend.integration.trinkets; + +import org.betterx.bclib.items.elytra.BCLElytraItem; +import org.betterx.bclib.items.elytra.BCLElytraUtils; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Tuple; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ElytraItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +import net.fabricmc.fabric.api.entity.event.v1.EntityElytraEvents; +import net.fabricmc.fabric.api.entity.event.v1.FabricElytraItem; + +import dev.emi.trinkets.api.SlotReference; +import dev.emi.trinkets.api.TrinketComponent; +import dev.emi.trinkets.api.TrinketsApi; + +import java.util.List; +import java.util.Optional; + +public class Elytra { + private static boolean isElytra(ItemStack stack) { + return stack.getItem() instanceof ElytraItem + || stack.getItem() instanceof FabricElytraItem; + } + + public static void register() { + BCLElytraUtils.slotProvider = (entity, slotGetter) -> { + ItemStack itemStack = slotGetter.apply(EquipmentSlot.CHEST); + if (isElytra(itemStack)) return itemStack; + + Optional oTrinketComponent = TrinketsApi.getTrinketComponent(entity); + if (oTrinketComponent.isPresent()) { + List> equipped = + oTrinketComponent.get().getEquipped(Elytra::isElytra); + + if (!equipped.isEmpty()) return equipped.get(0).getB(); + } + return null; + }; + + BCLElytraUtils.onBreak = (entity, chestStack) -> { + Optional oTrinketComponent = TrinketsApi.getTrinketComponent(entity); + if (oTrinketComponent.isPresent()) { + List> equipped = + oTrinketComponent.get().getEquipped(Elytra::isElytra); + + for (Tuple slot : equipped) { + ItemStack slotStack = slot.getB(); + if (slotStack == chestStack) { + TrinketsApi.onTrinketBroken(slotStack, slot.getA(), entity); + } + } + } + }; + + EntityElytraEvents.CUSTOM.register(Elytra::useElytraTrinket); + } + + private static boolean useElytraTrinket(LivingEntity entity, boolean tickElytra) { + Optional oTrinketComponent = TrinketsApi.getTrinketComponent(entity); + if (oTrinketComponent.isPresent()) { + List> equipped = + oTrinketComponent.get().getEquipped(Elytra::isElytra); + + for (Tuple slot : equipped) { + ItemStack stack = slot.getB(); + Item item = stack.getItem(); + + if (item instanceof ElytraItem) { + if (ElytraItem.isFlyEnabled(stack)) { + INSTANCE.doVanillaElytraTick(entity, stack); + return true; + } + } else if (item instanceof FabricElytraItem fabricElytraItem) { + if (fabricElytraItem.useCustomElytra(entity, stack, tickElytra)) { + return true; + } + } + } + } + return false; + } + + private static final BCLElytraItem INSTANCE = new BCLElytraItem() { + @Override + public ResourceLocation getModelTexture() { + return null; + } + + @Override + public double getMovementFactor() { + return 0; + } + }; +} + + diff --git a/src/main/java/org/betterx/betterend/integration/trinkets/ElytraClient.java b/src/main/java/org/betterx/betterend/integration/trinkets/ElytraClient.java new file mode 100644 index 00000000..2cacb7d8 --- /dev/null +++ b/src/main/java/org/betterx/betterend/integration/trinkets/ElytraClient.java @@ -0,0 +1,22 @@ +package org.betterx.betterend.integration.trinkets; + +import net.minecraft.world.item.ElytraItem; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.rendering.v1.LivingEntityFeatureRenderEvents; +import net.fabricmc.fabric.api.entity.event.v1.FabricElytraItem; + +import dev.emi.trinkets.api.TrinketsApi; + +@Environment(EnvType.CLIENT) +public class ElytraClient { + public static void register() { + LivingEntityFeatureRenderEvents.ALLOW_CAPE_RENDER.register((player) -> TrinketsApi + .getTrinketComponent(player) + .map(trinketComponent -> trinketComponent.getEquipped( + stack -> stack.getItem() instanceof ElytraItem || + stack.getItem() instanceof FabricElytraItem + ).size() == 0).orElse(true)); + } +} diff --git a/src/main/resources/data/trinkets/entities/betterend.json b/src/main/resources/data/trinkets/entities/betterend.json new file mode 100644 index 00000000..1a728950 --- /dev/null +++ b/src/main/resources/data/trinkets/entities/betterend.json @@ -0,0 +1,8 @@ +{ + "entities": [ + "player" + ], + "slots": [ + "chest/cape" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/trinkets/tags/items/chest/cape.json b/src/main/resources/data/trinkets/tags/items/chest/cape.json new file mode 100644 index 00000000..a0607002 --- /dev/null +++ b/src/main/resources/data/trinkets/tags/items/chest/cape.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "betterend:elytra_crystalite", + "betterend:elytra_armored" + ] +} \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 0a720d27..7eefaed2 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -45,12 +45,13 @@ "bclib": "2.0.x" }, "breaks": { - "bclib": "<2.0.3" + "bclib": "<2.0.5" }, "suggests": { "byg": ">=1.1.3", "blockus": ">=2.0.2", "nourish": ">=1.2.0", - "colored_lights": ">=1.0.3" + "colored_lights": ">=1.0.3", + "trinkets": ">=3.4.0" } }