Crystalite Elytra

This commit is contained in:
Aleksey 2021-06-08 10:54:06 +03:00
parent 1ad72cbe88
commit a6895004c7
22 changed files with 160 additions and 100 deletions

View file

@ -121,7 +121,7 @@ def env = System.getenv()
import org.kohsuke.github.GHReleaseBuilder import org.kohsuke.github.GHReleaseBuilder
import org.kohsuke.github.GitHub import org.kohsuke.github.GitHub
task github(dependsOn: [remapJar, sourcesJar, javadocJar]) { task release(dependsOn: [remapJar, sourcesJar, javadocJar]) {
onlyIf { onlyIf {
env.GITHUB_TOKEN env.GITHUB_TOKEN
} }

View file

@ -17,5 +17,5 @@ archives_base_name = better-end
patchouli_version = 50-FABRIC patchouli_version = 50-FABRIC
fabric_version = 0.32.9+1.16 fabric_version = 0.32.9+1.16
canvas_version = 1.0.+ canvas_version = 1.0.+
bclib_version = 0.1.24 bclib_version = 0.1.26
rei_version = 5.8.10 rei_version = 5.8.10

View file

@ -15,6 +15,7 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import ru.betterend.blocks.HydrothermalVentBlock; import ru.betterend.blocks.HydrothermalVentBlock;
import ru.betterend.interfaces.FallFlyingItem;
import ru.betterend.item.ArmoredElytra; import ru.betterend.item.ArmoredElytra;
import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndBlockEntities;
import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndBlocks;
@ -65,6 +66,6 @@ public class BlockEntityHydrothermalVent extends BlockEntity implements Tickable
private boolean hasElytra(LivingEntity entity) { private boolean hasElytra(LivingEntity entity) {
Item item = entity.getItemBySlot(EquipmentSlot.CHEST).getItem(); Item item = entity.getItemBySlot(EquipmentSlot.CHEST).getItem();
return item instanceof ElytraItem || item instanceof ArmoredElytra; return item instanceof ElytraItem || item instanceof FallFlyingItem;
} }
} }

View file

@ -16,7 +16,7 @@ import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.PlayerModelPart; import net.minecraft.world.entity.player.PlayerModelPart;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import ru.betterend.item.ArmoredElytra; import ru.betterend.interfaces.FallFlyingItem;
import ru.betterend.item.model.ArmoredElytraModel; import ru.betterend.item.model.ArmoredElytraModel;
public class ArmoredElytraLayer<T extends LivingEntity, M extends EntityModel<T>> extends ElytraLayer<T, M> { public class ArmoredElytraLayer<T extends LivingEntity, M extends EntityModel<T>> extends ElytraLayer<T, M> {
@ -28,8 +28,8 @@ public class ArmoredElytraLayer<T extends LivingEntity, M extends EntityModel<T>
public void render(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { public void render(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, T livingEntity, float f, float g, float h, float j, float k, float l) {
ItemStack itemStack = livingEntity.getItemBySlot(EquipmentSlot.CHEST); ItemStack itemStack = livingEntity.getItemBySlot(EquipmentSlot.CHEST);
if (itemStack.getItem() instanceof ArmoredElytra) { if (itemStack.getItem() instanceof FallFlyingItem) {
ResourceLocation wingsTexture = ((ArmoredElytra) itemStack.getItem()).getWingTexture(); ResourceLocation wingsTexture = ((FallFlyingItem) itemStack.getItem()).getModelTexture();
if (livingEntity instanceof AbstractClientPlayer) { if (livingEntity instanceof AbstractClientPlayer) {
AbstractClientPlayer abstractClientPlayer = (AbstractClientPlayer) livingEntity; AbstractClientPlayer abstractClientPlayer = (AbstractClientPlayer) livingEntity;
if (abstractClientPlayer.isElytraLoaded() && abstractClientPlayer.getElytraTextureLocation() != null) { if (abstractClientPlayer.isElytraLoaded() && abstractClientPlayer.getElytraTextureLocation() != null) {

View file

@ -47,42 +47,6 @@ public class EndCrystalRenderer {
matrices.popPose(); matrices.popPose();
} }
public static void renderBeam(BlockPos start, BlockPos end, float tickDelta, int age, PoseStack matrices, MultiBufferSource vertexConsumers, int light) {
float dx = start.getX() - end.getX() + 1.0F;
float dy = start.getY() - end.getY() + 1.0F;
float dz = start.getZ() - end.getZ() + 1.0F;
float f = Mth.sqrt(dx * dx + dz * dz);
float g = Mth.sqrt(dx * dx + dy * dy + dz * dz);
matrices.pushPose();
matrices.translate(0.0D, 2.0D, 0.0D);
matrices.mulPose(Vector3f.YP.rotation((float)(-Math.atan2((double) dz, (double) dx)) - 1.5707964F));
matrices.mulPose(Vector3f.XP.rotation((float)(-Math.atan2((double) f, (double) dy)) - 1.5707964F));
VertexConsumer vertexConsumer = vertexConsumers.getBuffer(CRYSTAL_BEAM_LAYER);
float h = 0.0F - ((float) age + tickDelta) * 0.01F;
float i = Mth.sqrt(dx * dx + dy * dy + dz * dz) / 32.0F - ((float) age + tickDelta) * 0.01F;
float k = 0.0F;
float l = 0.75F;
float m = 0.0F;
PoseStack.Pose entry = matrices.last();
Matrix4f matrix4f = entry.pose();
Matrix3f matrix3f = entry.normal();
for(int n = 1; n <= 8; ++n) {
float o = Mth.sin((float) n * 6.2831855F / 8.0F) * 0.75F;
float p = Mth.cos((float) n * 6.2831855F / 8.0F) * 0.75F;
float q = (float) n / 8.0F;
vertexConsumer.vertex(matrix4f, k * 0.2F, l * 0.2F, 0.0F).color(0, 0, 0, 255).uv(m, h).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex();
vertexConsumer.vertex(matrix4f, k, l, g).color(255, 255, 255, 255).uv(m, i).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex();
vertexConsumer.vertex(matrix4f, o, p, g).color(255, 255, 255, 255).uv(q, i).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex();
vertexConsumer.vertex(matrix4f, o * 0.2F, p * 0.2F, 0.0F).color(0, 0, 0, 255).uv(q, h).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex();
k = o;
l = p;
m = q;
}
matrices.popPose();
}
static { static {
END_CRYSTAL = RenderType.entityCutoutNoCull(CRYSTAL_TEXTURE); END_CRYSTAL = RenderType.entityCutoutNoCull(CRYSTAL_TEXTURE);
CRYSTAL_BEAM_LAYER = RenderType.entitySmoothCutout(CRYSTAL_BEAM_TEXTURE); CRYSTAL_BEAM_LAYER = RenderType.entitySmoothCutout(CRYSTAL_BEAM_TEXTURE);

View file

@ -0,0 +1,8 @@
package ru.betterend.interfaces;
import net.minecraft.resources.ResourceLocation;
public interface FallFlyingItem {
ResourceLocation getModelTexture();
double getMovementFactor();
}

View file

@ -1,7 +1,5 @@
package ru.betterend.item; package ru.betterend.item;
import java.util.UUID;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.object.builder.v1.client.model.FabricModelPredicateProviderRegistry; import net.fabricmc.fabric.api.object.builder.v1.client.model.FabricModelPredicateProviderRegistry;
@ -14,13 +12,13 @@ import net.minecraft.world.item.ElytraItem;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Rarity; import net.minecraft.world.item.Rarity;
import ru.bclib.items.BaseArmorItem;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
import ru.betterend.interfaces.FallFlyingItem;
import ru.betterend.interfaces.MultiModelItem; import ru.betterend.interfaces.MultiModelItem;
import ru.betterend.registry.EndItems; import ru.betterend.registry.EndItems;
public class ArmoredElytra extends EndArmorItem implements MultiModelItem { public class ArmoredElytra extends BaseArmorItem implements MultiModelItem, FallFlyingItem {
private static final UUID ARMOR_MODIFIER_UUID_CHEST = ARMOR_MODIFIER_UUID_PER_SLOT[2];
private final ResourceLocation wingTexture; private final ResourceLocation wingTexture;
private final Item repairItem; private final Item repairItem;
@ -37,18 +35,20 @@ public class ArmoredElytra extends EndArmorItem implements MultiModelItem {
this.movementFactor = movementFactor; this.movementFactor = movementFactor;
this.defense = (int) ((double) material.getDefenseForSlot(EquipmentSlot.CHEST) / 1.75); this.defense = (int) ((double) material.getDefenseForSlot(EquipmentSlot.CHEST) / 1.75);
this.toughness = material.getToughness() / 1.75F; this.toughness = material.getToughness() / 1.75F;
addAttributeModifier(Attributes.ARMOR, new AttributeModifier(ARMOR_MODIFIER_UUID_CHEST, addAttributeModifier(Attributes.ARMOR, new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2],
"Armor modifier", defense, AttributeModifier.Operation.ADDITION)); "Armor modifier", defense, AttributeModifier.Operation.ADDITION));
addAttributeModifier(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(ARMOR_MODIFIER_UUID_CHEST, addAttributeModifier(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2],
"Armor toughness", toughness, AttributeModifier.Operation.ADDITION)); "Armor toughness", toughness, AttributeModifier.Operation.ADDITION));
} }
@Override
public double getMovementFactor() { public double getMovementFactor() {
return movementFactor; return movementFactor;
} }
@Override
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
public ResourceLocation getWingTexture() { public ResourceLocation getModelTexture() {
return wingTexture; return wingTexture;
} }

View file

@ -0,0 +1,68 @@
package ru.betterend.item;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.object.builder.v1.client.model.FabricModelPredicateProviderRegistry;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.item.ElytraItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Rarity;
import ru.betterend.BetterEnd;
import ru.betterend.interfaces.FallFlyingItem;
import ru.betterend.interfaces.MultiModelItem;
import ru.betterend.registry.EndItems;
public class CrystaliteElytra extends CrystaliteArmor implements MultiModelItem, FallFlyingItem {
private final ResourceLocation wingTexture;
private final double movementFactor;
private final int defense;
private final float toughness;
public CrystaliteElytra(int durability, double movementFactor) {
super(EquipmentSlot.CHEST, EndItems.makeEndItemSettings().durability(durability).rarity(Rarity.EPIC));
this.wingTexture = BetterEnd.makeID("textures/entity/elytra_crystalite.png");
this.movementFactor = movementFactor;
this.defense = (int) ((double) material.getDefenseForSlot(EquipmentSlot.CHEST) / 1.75);
this.toughness = material.getToughness() / 1.75F;
addAttributeModifier(Attributes.ARMOR, new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2],
"Armor modifier", defense, AttributeModifier.Operation.ADDITION));
addAttributeModifier(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2],
"Armor toughness", toughness, AttributeModifier.Operation.ADDITION));
}
@Override
public boolean isValidRepairItem(ItemStack itemStack, ItemStack itemStack2) {
return super.isValidRepairItem(itemStack, itemStack2) || itemStack2.getItem() == EndItems.ENCHANTED_MEMBRANE;
}
@Override
public double getMovementFactor() {
return movementFactor;
}
@Override
@Environment(EnvType.CLIENT)
public ResourceLocation getModelTexture() {
return wingTexture;
}
@Override
public int getDefense() {
return defense;
}
@Override
public float getToughness() {
return toughness;
}
@Override
public void registerModelPredicate() {
FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"),
(itemStack, clientLevel, livingEntity) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F);
}
}

View file

@ -1,26 +1,32 @@
package ru.betterend.item; package ru.betterend.item;
import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry;
import net.minecraft.world.item.ItemStack; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Rarity; import net.minecraft.world.item.Item;
import ru.bclib.client.models.ModelsHelper; import net.minecraft.world.item.ItemStack;
import ru.bclib.items.ModelProviderItem; import net.minecraft.world.item.Rarity;
import ru.betterend.BetterEnd; import ru.bclib.client.models.ModelsHelper;
import ru.betterend.registry.EndItems; import ru.bclib.items.ModelProviderItem;
import ru.betterend.registry.EndItems;
public class EnchantedPetalItem extends ModelProviderItem {
public EnchantedPetalItem() { public class EnchantedItem extends ModelProviderItem {
super(EndItems.makeEndItemSettings().rarity(Rarity.RARE).stacksTo(16));
} private final Item source;
@Override public EnchantedItem(Item source) {
public boolean isFoil(ItemStack stack) { super(EndItems.makeEndItemSettings().rarity(Rarity.RARE).stacksTo(16));
return true; this.source = source;
} }
@Override @Override
public BlockModel getItemModel(ResourceLocation resourceLocation) { public boolean isFoil(ItemStack stack) {
return ModelsHelper.createItemModel(BetterEnd.makeID("hydralux_petal")); return true;
} }
}
@Override
public BlockModel getItemModel(ResourceLocation resourceLocation) {
ResourceLocation sourceId = Registry.ITEM.getKey(source);
return ModelsHelper.createItemModel(sourceId);
}
}

View file

@ -16,6 +16,7 @@ import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import ru.betterend.item.CrystaliteArmor;
import ru.betterend.registry.EndItems; import ru.betterend.registry.EndItems;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
@ -67,13 +68,15 @@ public class CrystaliteArmorProvider implements ModelProvider, TextureProvider {
} }
public Iterable<Item> getRenderedItems() { public Iterable<Item> getRenderedItems() {
return Lists.newArrayList(EndItems.CRYSTALITE_HELMET, EndItems.CRYSTALITE_CHESTPLATE, EndItems.CRYSTALITE_LEGGINGS, EndItems.CRYSTALITE_BOOTS); return Lists.newArrayList(
EndItems.CRYSTALITE_HELMET,
EndItems.CRYSTALITE_CHESTPLATE,
EndItems.CRYSTALITE_ELYTRA,
EndItems.CRYSTALITE_LEGGINGS,
EndItems.CRYSTALITE_BOOTS);
} }
private boolean isStackValid(ItemStack stack) { private boolean isStackValid(ItemStack stack) {
return stack.getItem() == EndItems.CRYSTALITE_HELMET || return stack.getItem() instanceof CrystaliteArmor;
stack.getItem() == EndItems.CRYSTALITE_CHESTPLATE ||
stack.getItem() == EndItems.CRYSTALITE_LEGGINGS ||
stack.getItem() == EndItems.CRYSTALITE_BOOTS;
} }
} }

View file

@ -15,7 +15,7 @@ public class CrystaliteChestplateModel extends HumanoidModel<LivingEntity> {
public ModelPart leftShoulder; public ModelPart leftShoulder;
public ModelPart rightShoulder; public ModelPart rightShoulder;
private boolean thinArms; private final boolean thinArms;
public CrystaliteChestplateModel(float scale, boolean thinArms) { public CrystaliteChestplateModel(float scale, boolean thinArms) {
super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); super(RenderType::entityTranslucent, scale, 0.0F, 64, 48);

View file

@ -18,6 +18,7 @@ import net.minecraft.network.protocol.game.ServerboundPlayerCommandPacket;
import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.item.ElytraItem; import net.minecraft.world.item.ElytraItem;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import ru.betterend.interfaces.FallFlyingItem;
import ru.betterend.item.ArmoredElytra; import ru.betterend.item.ArmoredElytra;
@Mixin(LocalPlayer.class) @Mixin(LocalPlayer.class)
@ -36,7 +37,7 @@ public abstract class LocalPlayerMixin extends AbstractClientPlayer {
shift = Shift.AFTER)) shift = Shift.AFTER))
public void be_aiStep(CallbackInfo info) { public void be_aiStep(CallbackInfo info) {
ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST); ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST);
if (itemStack.getItem() instanceof ArmoredElytra && ElytraItem.isFlyEnabled(itemStack) && tryToStartFallFlying()) { if (itemStack.getItem() instanceof FallFlyingItem && ElytraItem.isFlyEnabled(itemStack) && tryToStartFallFlying()) {
connection.send(new ServerboundPlayerCommandPacket(LocalPlayer.class.cast(this), ServerboundPlayerCommandPacket.Action.START_FALL_FLYING)); connection.send(new ServerboundPlayerCommandPacket(LocalPlayer.class.cast(this), ServerboundPlayerCommandPacket.Action.START_FALL_FLYING));
} }
} }

View file

@ -33,7 +33,7 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import ru.betterend.interfaces.MobEffectApplier; import ru.betterend.interfaces.MobEffectApplier;
import ru.betterend.item.ArmoredElytra; import ru.betterend.interfaces.FallFlyingItem;
import ru.betterend.item.CrystaliteArmor; import ru.betterend.item.CrystaliteArmor;
import ru.betterend.registry.EndAttributes; import ru.betterend.registry.EndAttributes;
@ -111,7 +111,7 @@ public abstract class LivingEntityMixin extends Entity {
@Inject(method = "updateFallFlying", at = @At("HEAD"), cancellable = true) @Inject(method = "updateFallFlying", at = @At("HEAD"), cancellable = true)
private void be_updateFallFlying(CallbackInfo info) { private void be_updateFallFlying(CallbackInfo info) {
ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST); ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST);
if (!level.isClientSide && itemStack.getItem() instanceof ArmoredElytra) { if (!level.isClientSide && itemStack.getItem() instanceof FallFlyingItem) {
boolean isFlying = getSharedFlag(7); boolean isFlying = getSharedFlag(7);
if (isFlying && !onGround && !isPassenger() && !hasEffect(MobEffects.LEVITATION)) { if (isFlying && !onGround && !isPassenger() && !hasEffect(MobEffects.LEVITATION)) {
if (ElytraItem.isFlyEnabled(itemStack)) { if (ElytraItem.isFlyEnabled(itemStack)) {
@ -136,7 +136,7 @@ public abstract class LivingEntityMixin extends Entity {
shift = Shift.AFTER), cancellable = true) shift = Shift.AFTER), cancellable = true)
public void be_travel(Vec3 vec3, CallbackInfo info) { public void be_travel(Vec3 vec3, CallbackInfo info) {
ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST); ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST);
if (isFallFlying() && itemStack.getItem() instanceof ArmoredElytra) { if (isFallFlying() && itemStack.getItem() instanceof FallFlyingItem) {
Vec3 moveDelta = getDeltaMovement(); Vec3 moveDelta = getDeltaMovement();
if (moveDelta.y > -0.5D) { if (moveDelta.y > -0.5D) {
fallDistance = 1.0F; fallDistance = 1.0F;
@ -166,7 +166,7 @@ public abstract class LivingEntityMixin extends Entity {
moveDelta = moveDelta.add((lookAngle.x / k * l - moveDelta.x) * 0.1D, 0.0D, (lookAngle.z / k * l - moveDelta.z) * 0.1D); moveDelta = moveDelta.add((lookAngle.x / k * l - moveDelta.x) * 0.1D, 0.0D, (lookAngle.z / k * l - moveDelta.z) * 0.1D);
} }
moveDelta = moveDelta.multiply(0.9900000095367432D, 0.9800000190734863D, 0.9900000095367432D); moveDelta = moveDelta.multiply(0.9900000095367432D, 0.9800000190734863D, 0.9900000095367432D);
double movementFactor = ((ArmoredElytra) itemStack.getItem()).getMovementFactor(); double movementFactor = ((FallFlyingItem) itemStack.getItem()).getMovementFactor();
moveDelta = moveDelta.multiply(movementFactor, 1.0D, movementFactor); moveDelta = moveDelta.multiply(movementFactor, 1.0D, movementFactor);
setDeltaMovement(moveDelta); setDeltaMovement(moveDelta);
move(MoverType.SELF, moveDelta); move(MoverType.SELF, moveDelta);

View file

@ -24,6 +24,7 @@ import ru.bclib.util.BlocksHelper;
import ru.bclib.util.MHelper; import ru.bclib.util.MHelper;
import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties;
import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.BlockProperties.TripleShape;
import ru.betterend.interfaces.FallFlyingItem;
import ru.betterend.item.ArmoredElytra; import ru.betterend.item.ArmoredElytra;
import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndBlocks;
@ -49,7 +50,7 @@ public abstract class PlayerMixin extends LivingEntity {
public void be_tryToStartFlying(CallbackInfoReturnable<Boolean> info) { public void be_tryToStartFlying(CallbackInfoReturnable<Boolean> info) {
if (!onGround && !isFallFlying() && !isInWater() && !hasEffect(MobEffects.LEVITATION)) { if (!onGround && !isFallFlying() && !isInWater() && !hasEffect(MobEffects.LEVITATION)) {
ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST); ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST);
if (itemStack.getItem() instanceof ArmoredElytra && ElytraItem.isFlyEnabled(itemStack)) { if (itemStack.getItem() instanceof FallFlyingItem && ElytraItem.isFlyEnabled(itemStack)) {
setSharedFlag(7, true); setSharedFlag(7, true);
info.setReturnValue(true); info.setReturnValue(true);
} }

View file

@ -82,6 +82,15 @@ public class InfusionRecipes {
.addCatalyst(6, EndItems.CRYSTAL_SHARDS) .addCatalyst(6, EndItems.CRYSTAL_SHARDS)
.setTime(75) .setTime(75)
.build(); .build();
InfusionRecipe.Builder.create("enchanted_membrane")
.setInput(Items.PHANTOM_MEMBRANE)
.setOutput(EndItems.ENCHANTED_MEMBRANE)
.addCatalyst(0, EndItems.CRYSTAL_SHARDS)
.addCatalyst(2, EndItems.CRYSTAL_SHARDS)
.addCatalyst(4, EndItems.CRYSTAL_SHARDS)
.addCatalyst(6, EndItems.CRYSTAL_SHARDS)
.setTime(75)
.build();
InfusionRecipe.Builder.create("protection_book") InfusionRecipe.Builder.create("protection_book")
.setInput(Items.BOOK) .setInput(Items.BOOK)

View file

@ -28,14 +28,7 @@ import ru.bclib.items.tool.BaseSwordItem;
import ru.bclib.registry.ItemsRegistry; import ru.bclib.registry.ItemsRegistry;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
import ru.betterend.config.Configs; import ru.betterend.config.Configs;
import ru.betterend.item.ArmoredElytra; import ru.betterend.item.*;
import ru.betterend.item.CrystaliteBoots;
import ru.betterend.item.CrystaliteChestplate;
import ru.betterend.item.CrystaliteHelmet;
import ru.betterend.item.CrystaliteLeggings;
import ru.betterend.item.EnchantedPetalItem;
import ru.betterend.item.EndBucketItem;
import ru.betterend.item.EternalCrystalItem;
import ru.betterend.item.material.EndArmorMaterial; import ru.betterend.item.material.EndArmorMaterial;
import ru.betterend.item.material.EndToolMaterial; import ru.betterend.item.material.EndToolMaterial;
import ru.betterend.item.tool.EndHammerItem; import ru.betterend.item.tool.EndHammerItem;
@ -58,13 +51,14 @@ public class EndItems extends ItemsRegistry {
public final static Item HYDRALUX_PETAL = registerEndItem("hydralux_petal"); public final static Item HYDRALUX_PETAL = registerEndItem("hydralux_petal");
public final static Item GELATINE = registerEndItem("gelatine"); public final static Item GELATINE = registerEndItem("gelatine");
public static final Item ETERNAL_CRYSTAL = registerEndItem("eternal_crystal", new EternalCrystalItem()); public static final Item ETERNAL_CRYSTAL = registerEndItem("eternal_crystal", new EternalCrystalItem());
public final static Item ENCHANTED_PETAL = registerEndItem("enchanted_petal", new EnchantedPetalItem()); public final static Item ENCHANTED_PETAL = registerEndItem("enchanted_petal", new EnchantedItem(HYDRALUX_PETAL));
public final static Item LEATHER_STRIPE = registerEndItem("leather_stripe"); public final static Item LEATHER_STRIPE = registerEndItem("leather_stripe");
public final static Item LEATHER_WRAPPED_STICK = registerEndItem("leather_wrapped_stick"); public final static Item LEATHER_WRAPPED_STICK = registerEndItem("leather_wrapped_stick");
public final static Item SILK_FIBER = registerEndItem("silk_fiber"); public final static Item SILK_FIBER = registerEndItem("silk_fiber");
public final static Item LUMECORN_ROD = registerEndItem("lumecorn_rod"); public final static Item LUMECORN_ROD = registerEndItem("lumecorn_rod");
public final static Item SILK_MOTH_MATRIX = registerEndItem("silk_moth_matrix"); public final static Item SILK_MOTH_MATRIX = registerEndItem("silk_moth_matrix");
public final static Item ENCHANTED_MEMBRANE = registerEndItem("enchanted_membrane", new EnchantedItem(Items.PHANTOM_MEMBRANE));
// Music Discs // Music Discs
public final static Item MUSIC_DISC_STRANGE_AND_ALIEN = registerEndDisc("music_disc_strange_and_alien", 0, EndSounds.RECORD_STRANGE_AND_ALIEN); public final static Item MUSIC_DISC_STRANGE_AND_ALIEN = registerEndDisc("music_disc_strange_and_alien", 0, EndSounds.RECORD_STRANGE_AND_ALIEN);
public final static Item MUSIC_DISC_GRASPING_AT_STARS = registerEndDisc("music_disc_grasping_at_stars", 0, EndSounds.RECORD_GRASPING_AT_STARS); public final static Item MUSIC_DISC_GRASPING_AT_STARS = registerEndDisc("music_disc_grasping_at_stars", 0, EndSounds.RECORD_GRASPING_AT_STARS);
@ -81,6 +75,7 @@ public class EndItems extends ItemsRegistry {
public static final Item CRYSTALITE_LEGGINGS = registerEndItem("crystalite_leggings", new CrystaliteLeggings()); public static final Item CRYSTALITE_LEGGINGS = registerEndItem("crystalite_leggings", new CrystaliteLeggings());
public static final Item CRYSTALITE_BOOTS = registerEndItem("crystalite_boots", new CrystaliteBoots()); public static final Item CRYSTALITE_BOOTS = registerEndItem("crystalite_boots", new CrystaliteBoots());
public static final Item ARMORED_ELYTRA = registerEndItem("elytra_armored", new ArmoredElytra("elytra_armored", EndArmorMaterial.AETERNIUM, Items.PHANTOM_MEMBRANE, 900, 0.96D, true)); public static final Item ARMORED_ELYTRA = registerEndItem("elytra_armored", new ArmoredElytra("elytra_armored", EndArmorMaterial.AETERNIUM, Items.PHANTOM_MEMBRANE, 900, 0.96D, true));
public static final Item CRYSTALITE_ELYTRA = registerEndItem("elytra_crystalite", new CrystaliteElytra(650, 0.98D));
// Tools // // Tools //
public static final TieredItem AETERNIUM_SHOVEL = registerEndTool("aeternium_shovel", new BaseShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeEndItemSettings().fireResistant())); public static final TieredItem AETERNIUM_SHOVEL = registerEndTool("aeternium_shovel", new BaseShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeEndItemSettings().fireResistant()));

View file

@ -76,6 +76,8 @@
"item.betterend.leather_stripe": "Leather Stripe", "item.betterend.leather_stripe": "Leather Stripe",
"item.betterend.leather_wrapped_stick": "Leather Wrapped Stick", "item.betterend.leather_wrapped_stick": "Leather Wrapped Stick",
"item.betterend.elytra_armored": "Armored Elytra", "item.betterend.elytra_armored": "Armored Elytra",
"item.betterend.elytra_crystalite": "Elytra Crystalite",
"item.betterend.enchanted_membrane": "Enchanted Membrane",
"effect.betterend.end_veil": "End Veil", "effect.betterend.end_veil": "End Veil",
"enchantment.betterend.end_veil": "End Veil", "enchantment.betterend.end_veil": "End Veil",

View file

@ -75,7 +75,9 @@
"item.betterend.aeternium_sword_handle": "Рукоятка этериевого меча", "item.betterend.aeternium_sword_handle": "Рукоятка этериевого меча",
"item.betterend.leather_stripe": "Полоска кожи", "item.betterend.leather_stripe": "Полоска кожи",
"item.betterend.leather_wrapped_stick": "Обернутая кожей палка", "item.betterend.leather_wrapped_stick": "Обернутая кожей палка",
"item.betterend.elytra_armored": "Армированная Элитра", "item.betterend.elytra_armored": "Армированная элитра",
"item.betterend.elytra_crystalite": "Кристалитовая элитра",
"item.betterend.enchanted_membrane": "Зачарованная мембрана",
"effect.betterend.end_veil": "Вуаль Края", "effect.betterend.end_veil": "Вуаль Края",
"enchantment.betterend.end_veil": "Вуаль Края", "enchantment.betterend.end_veil": "Вуаль Края",

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 B

View file

@ -46,7 +46,7 @@
"fabricloader": ">=0.11.0", "fabricloader": ">=0.11.0",
"fabric": ">=0.32.0", "fabric": ">=0.32.0",
"minecraft": ">=1.16.4", "minecraft": ">=1.16.4",
"bclib": ">=0.1.15" "bclib": ">=0.1.26"
}, },
"suggests": { "suggests": {
"byg": ">=1.1.3", "byg": ">=1.1.3",