[Feature] Trinket Support for BE-Elytra

This commit is contained in:
Frank 2022-06-10 18:25:24 +02:00
parent 36b75ed25f
commit f3ceaa8c72
10 changed files with 166 additions and 9 deletions

View file

@ -24,6 +24,7 @@ repositories {
maven { url "https://maven.shedaniel.me/" } maven { url "https://maven.shedaniel.me/" }
maven { url 'https://jitpack.io' } maven { url 'https://jitpack.io' }
maven { url 'https://maven.terraformersmc.com/releases' } maven { url 'https://maven.terraformersmc.com/releases' }
maven { url "https://ladysnake.jfrog.io/artifactory/mods" }
flatDir { flatDir {
dirs 'libs' dirs 'libs'
} }
@ -48,6 +49,9 @@ dependencies {
} }
useOptional "me.shedaniel:RoughlyEnoughItems-fabric:${project.rei_version}" useOptional "me.shedaniel:RoughlyEnoughItems-fabric:${project.rei_version}"
useOptional "me.shedaniel:RoughlyEnoughItems-api-fabric:${project.rei_version}" useOptional "me.shedaniel:RoughlyEnoughItems-api-fabric:${project.rei_version}"
modImplementation "dev.emi:trinkets:${project.trinkets_version}"
} }
def useOptional(String dep) { def useOptional(String dep) {

View file

@ -14,5 +14,6 @@ archives_base_name=better-end
# Dependencies # Dependencies
# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api # 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 patchouli_version=55-FABRIC-SNAPSHOT
bclib_version=2.0.4 bclib_version=2.0.5
rei_version=9.0.472 rei_version=9.0.472
trinkets_version=3.4.0

View file

@ -8,6 +8,7 @@ import org.betterx.betterend.commands.CommandRegistry;
import org.betterx.betterend.config.Configs; import org.betterx.betterend.config.Configs;
import org.betterx.betterend.effects.EndPotions; import org.betterx.betterend.effects.EndPotions;
import org.betterx.betterend.integration.Integrations; import org.betterx.betterend.integration.Integrations;
import org.betterx.betterend.integration.trinkets.Elytra;
import org.betterx.betterend.recipe.*; import org.betterx.betterend.recipe.*;
import org.betterx.betterend.registry.*; import org.betterx.betterend.registry.*;
import org.betterx.betterend.util.BonemealPlants; import org.betterx.betterend.util.BonemealPlants;
@ -24,8 +25,8 @@ import net.fabricmc.loader.api.FabricLoader;
public class BetterEnd implements ModInitializer { public class BetterEnd implements ModInitializer {
public static final String MOD_ID = "betterend"; public static final String MOD_ID = "betterend";
public static final Logger LOGGER = new Logger(MOD_ID); public static final Logger LOGGER = new Logger(MOD_ID);
public static final boolean RUNS_FALL_FLYING_LIB = FabricLoader.getInstance() public static final boolean RUNS_TRINKETS = FabricLoader.getInstance()
.getModContainer("fallflyinglib") .getModContainer("trinkets")
.isPresent(); .isPresent();
@Override @Override
@ -77,11 +78,14 @@ public class BetterEnd implements ModInitializer {
EndStructures.addBiomeStructures(biomeID, biome); EndStructures.addBiomeStructures(biomeID, biome);
} }
}); });
if (RUNS_TRINKETS) {
Elytra.register();
}
} }
public static ResourceLocation makeID(String path) { public static ResourceLocation makeID(String path) {
return new ResourceLocation(MOD_ID, path); return new ResourceLocation(MOD_ID, path);
} }
} }

View file

@ -5,6 +5,7 @@ import org.betterx.bclib.util.TranslationHelper;
import org.betterx.betterend.BetterEnd; import org.betterx.betterend.BetterEnd;
import org.betterx.betterend.client.render.BetterEndSkyRenderer; import org.betterx.betterend.client.render.BetterEndSkyRenderer;
import org.betterx.betterend.events.ItemTooltipCallback; import org.betterx.betterend.events.ItemTooltipCallback;
import org.betterx.betterend.integration.trinkets.ElytraClient;
import org.betterx.betterend.interfaces.MultiModelItem; import org.betterx.betterend.interfaces.MultiModelItem;
import org.betterx.betterend.item.CrystaliteArmor; import org.betterx.betterend.item.CrystaliteArmor;
import org.betterx.betterend.registry.*; import org.betterx.betterend.registry.*;
@ -56,6 +57,10 @@ public class BetterEndClient implements ClientModInitializer {
if (ClientOptions.isCustomSky()) { if (ClientOptions.isCustomSky()) {
DimensionRenderingRegistry.registerSkyRenderer(Level.END, new BetterEndSkyRenderer()); DimensionRenderingRegistry.registerSkyRenderer(Level.END, new BetterEndSkyRenderer());
} }
if (BetterEnd.RUNS_TRINKETS) {
ElytraClient.register();
}
} }
public static void registerTooltips() { public static void registerTooltips() {

View file

@ -1,6 +1,7 @@
package org.betterx.betterend.client.render; package org.betterx.betterend.client.render;
import org.betterx.bclib.items.elytra.BCLElytraItem; 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.item.model.ArmoredElytraModel;
import org.betterx.betterend.registry.EndEntitiesRenders; import org.betterx.betterend.registry.EndEntitiesRenders;
@ -41,8 +42,11 @@ public class ArmoredElytraLayer<T extends LivingEntity, M extends EntityModel<T>
float k, float k,
float l float l
) { ) {
ItemStack itemStack = livingEntity.getItemBySlot(EquipmentSlot.CHEST); ItemStack itemStack = (BCLElytraUtils.slotProvider == null)
if (itemStack.getItem() instanceof BCLElytraItem) { ? livingEntity.getItemBySlot(EquipmentSlot.CHEST)
: BCLElytraUtils.slotProvider.getElytra(livingEntity, livingEntity::getItemBySlot);
if (itemStack != null && itemStack.getItem() instanceof BCLElytraItem) {
ResourceLocation wingsTexture = ((BCLElytraItem) itemStack.getItem()).getModelTexture(); ResourceLocation wingsTexture = ((BCLElytraItem) itemStack.getItem()).getModelTexture();
if (livingEntity instanceof AbstractClientPlayer) { if (livingEntity instanceof AbstractClientPlayer) {
AbstractClientPlayer abstractClientPlayer = (AbstractClientPlayer) livingEntity; AbstractClientPlayer abstractClientPlayer = (AbstractClientPlayer) livingEntity;

View file

@ -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<TrinketComponent> oTrinketComponent = TrinketsApi.getTrinketComponent(entity);
if (oTrinketComponent.isPresent()) {
List<Tuple<SlotReference, ItemStack>> equipped =
oTrinketComponent.get().getEquipped(Elytra::isElytra);
if (!equipped.isEmpty()) return equipped.get(0).getB();
}
return null;
};
BCLElytraUtils.onBreak = (entity, chestStack) -> {
Optional<TrinketComponent> oTrinketComponent = TrinketsApi.getTrinketComponent(entity);
if (oTrinketComponent.isPresent()) {
List<Tuple<SlotReference, ItemStack>> equipped =
oTrinketComponent.get().getEquipped(Elytra::isElytra);
for (Tuple<SlotReference, ItemStack> 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<TrinketComponent> oTrinketComponent = TrinketsApi.getTrinketComponent(entity);
if (oTrinketComponent.isPresent()) {
List<Tuple<SlotReference, ItemStack>> equipped =
oTrinketComponent.get().getEquipped(Elytra::isElytra);
for (Tuple<SlotReference, ItemStack> 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;
}
};
}

View file

@ -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));
}
}

View file

@ -0,0 +1,8 @@
{
"entities": [
"player"
],
"slots": [
"chest/cape"
]
}

View file

@ -0,0 +1,7 @@
{
"replace": false,
"values": [
"betterend:elytra_crystalite",
"betterend:elytra_armored"
]
}

View file

@ -45,12 +45,13 @@
"bclib": "2.0.x" "bclib": "2.0.x"
}, },
"breaks": { "breaks": {
"bclib": "<2.0.3" "bclib": "<2.0.5"
}, },
"suggests": { "suggests": {
"byg": ">=1.1.3", "byg": ">=1.1.3",
"blockus": ">=2.0.2", "blockus": ">=2.0.2",
"nourish": ">=1.2.0", "nourish": ">=1.2.0",
"colored_lights": ">=1.0.3" "colored_lights": ">=1.0.3",
"trinkets": ">=3.4.0"
} }
} }