[Feature] Trinket Support for BE-Elytra
This commit is contained in:
parent
36b75ed25f
commit
f3ceaa8c72
10 changed files with 166 additions and 9 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,9 +25,9 @@ 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
|
||||||
public void onInitialize() {
|
public void onInitialize() {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
8
src/main/resources/data/trinkets/entities/betterend.json
Normal file
8
src/main/resources/data/trinkets/entities/betterend.json
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"entities": [
|
||||||
|
"player"
|
||||||
|
],
|
||||||
|
"slots": [
|
||||||
|
"chest/cape"
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"replace": false,
|
||||||
|
"values": [
|
||||||
|
"betterend:elytra_crystalite",
|
||||||
|
"betterend:elytra_armored"
|
||||||
|
]
|
||||||
|
}
|
|
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue