Crystalite Armor additional effects

This commit is contained in:
Aleksey 2021-05-09 23:37:09 +03:00
parent 5d81d7b448
commit bc53748657
18 changed files with 252 additions and 116 deletions

View file

@ -16,7 +16,7 @@ public class EndPotions {
public final static Potion LONG_END_VEIL = registerPotion("long_end_veil", EndStatusEffects.END_VEIL, 9600);
public static Potion registerPotion(String name, MobEffect effect, int duration) {
return registerPotion(name, new Potion(name, new MobEffectInstance[]{ new MobEffectInstance(effect, duration) }));
return registerPotion(name, new Potion(name, new MobEffectInstance(effect, duration)));
}
public static Potion registerPotion(String name, Potion potion) {

View file

@ -2,13 +2,18 @@ package ru.betterend.effects;
import net.minecraft.core.Registry;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.effect.MobEffects;
import ru.betterend.BetterEnd;
import ru.betterend.effects.status.EndVeilEffect;
public class EndStatusEffects {
public final static MobEffectInstance CRYSTALITE_HEALTH_REGEN = new MobEffectInstance(MobEffects.REGENERATION, 40, 0, true, false, true);
public final static MobEffectInstance CRYSTALITE_DIG_SPEED = new MobEffectInstance(MobEffects.DIG_SPEED, 40, 0, true, false, true);
public final static MobEffectInstance CRYSTALITE_MOVE_SPEED = new MobEffectInstance(MobEffects.MOVEMENT_SPEED, 40, 0, true, false, true);
public final static MobEffect END_VEIL = registerEffect("end_veil", new EndVeilEffect());
public static <E extends MobEffect> MobEffect registerEffect(String name, E effect) {
return Registry.register(Registry.MOB_EFFECT, BetterEnd.makeID(name), effect);
}

View file

@ -0,0 +1,7 @@
package ru.betterend.interfaces;
import net.minecraft.world.entity.LivingEntity;
public interface MobEffectApplier {
void applyEffect(LivingEntity owner);
}

View file

@ -1,13 +1,10 @@
package ru.betterend.item;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Multimap;
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.Attribute;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.item.*;
@ -17,11 +14,10 @@ import ru.betterend.registry.EndItems;
import java.util.UUID;
public class ArmoredElytra extends ArmorItem implements MultiModelItem {
public class ArmoredElytra extends EndArmorItem implements MultiModelItem {
private static final UUID ARMOR_MODIFIER_UUID_CHEST = UUID.fromString("9F3D476D-C118-4544-8365-64846904B48E");
private static final UUID ARMOR_MODIFIER_UUID_CHEST = ARMOR_MODIFIER_UUID_PER_SLOT[2];
private final Multimap<Attribute, AttributeModifier> defaultModifiers;
private final ResourceLocation wingTexture;
private final Item repairItem;
private final double movementFactor;
@ -37,16 +33,10 @@ public class ArmoredElytra extends ArmorItem implements MultiModelItem {
this.movementFactor = movementFactor;
this.defense = (int) ((double) material.getDefenseForSlot(EquipmentSlot.CHEST) / 1.75);
this.toughness = material.getToughness() / 1.75F;
ImmutableMultimap.Builder<Attribute, AttributeModifier> builder = ImmutableMultimap.builder();
builder.put(Attributes.ARMOR, new AttributeModifier(ARMOR_MODIFIER_UUID_CHEST,
addAttributeModifier(Attributes.ARMOR, new AttributeModifier(ARMOR_MODIFIER_UUID_CHEST,
"Armor modifier", defense, AttributeModifier.Operation.ADDITION));
builder.put(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(ARMOR_MODIFIER_UUID_CHEST,
addAttributeModifier(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(ARMOR_MODIFIER_UUID_CHEST,
"Armor toughness", toughness, AttributeModifier.Operation.ADDITION));
if (material == ArmorMaterials.NETHERITE) {
builder.put(Attributes.KNOCKBACK_RESISTANCE, new AttributeModifier(ARMOR_MODIFIER_UUID_CHEST,
"Armor knockback resistance", knockbackResistance, AttributeModifier.Operation.ADDITION));
}
this.defaultModifiers = builder.build();
}
public double getMovementFactor() {
@ -63,11 +53,6 @@ public class ArmoredElytra extends ArmorItem implements MultiModelItem {
return super.isValidRepairItem(itemStack, itemStack2) || itemStack2.getItem() == repairItem;
}
@Override
public Multimap<Attribute, AttributeModifier> getDefaultAttributeModifiers(EquipmentSlot equipmentSlot) {
return equipmentSlot == slot ? defaultModifiers : super.getDefaultAttributeModifiers(equipmentSlot);
}
@Override
public int getDefense() {
return defense;

View file

@ -0,0 +1,28 @@
package ru.betterend.item;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import ru.betterend.effects.EndStatusEffects;
import ru.betterend.item.material.EndArmorMaterial;
public class CrystaliteArmor extends EndArmorItem {
public CrystaliteArmor(EquipmentSlot equipmentSlot, Properties settings) {
super(EndArmorMaterial.CRYSTALITE, equipmentSlot, settings);
}
public static boolean hasFullSet(LivingEntity owner) {
for (ItemStack armorStack : owner.getArmorSlots()) {
if (!(armorStack.getItem() instanceof CrystaliteArmor)) {
return false;
}
}
return true;
}
public static void applySetEffect(LivingEntity owner) {
owner.addEffect(new MobEffectInstance(EndStatusEffects.CRYSTALITE_HEALTH_REGEN));
}
}

View file

@ -0,0 +1,21 @@
package ru.betterend.item;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.Rarity;
import ru.betterend.effects.EndStatusEffects;
import ru.betterend.interfaces.MobEffectApplier;
import ru.betterend.registry.EndItems;
public class CrystaliteBoots extends CrystaliteArmor implements MobEffectApplier {
public CrystaliteBoots() {
super(EquipmentSlot.FEET, EndItems.makeItemSettings().rarity(Rarity.RARE));
}
@Override
public void applyEffect(LivingEntity owner) {
owner.addEffect(new MobEffectInstance(EndStatusEffects.CRYSTALITE_MOVE_SPEED));
}
}

View file

@ -0,0 +1,21 @@
package ru.betterend.item;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.Rarity;
import ru.betterend.effects.EndStatusEffects;
import ru.betterend.interfaces.MobEffectApplier;
import ru.betterend.registry.EndItems;
public class CrystaliteChestplate extends CrystaliteArmor implements MobEffectApplier {
public CrystaliteChestplate() {
super(EquipmentSlot.CHEST, EndItems.makeItemSettings().rarity(Rarity.RARE));
}
@Override
public void applyEffect(LivingEntity owner) {
owner.addEffect(new MobEffectInstance(EndStatusEffects.CRYSTALITE_DIG_SPEED));
}
}

View file

@ -0,0 +1,18 @@
package ru.betterend.item;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.item.Rarity;
import ru.betterend.registry.EndAttributes;
import ru.betterend.registry.EndItems;
import java.util.UUID;
public class CrystaliteHelmet extends CrystaliteArmor {
public CrystaliteHelmet() {
super(EquipmentSlot.HEAD, EndItems.makeItemSettings().rarity(Rarity.RARE));
UUID uuid = ARMOR_MODIFIER_UUID_PER_SLOT[EquipmentSlot.HEAD.getIndex()];
addAttributeModifier(EndAttributes.BLINDNESS_RESISTANCE, new AttributeModifier(uuid, "Helmet blindness resistance", 1.0, AttributeModifier.Operation.ADDITION));
}
}

View file

@ -0,0 +1,18 @@
package ru.betterend.item;
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.Rarity;
import ru.betterend.registry.EndItems;
import java.util.UUID;
public class CrystaliteLeggings extends CrystaliteArmor {
public CrystaliteLeggings() {
super(EquipmentSlot.LEGS, EndItems.makeItemSettings().rarity(Rarity.RARE));
UUID uuid = ARMOR_MODIFIER_UUID_PER_SLOT[EquipmentSlot.LEGS.getIndex()];
addAttributeModifier(Attributes.MAX_HEALTH, new AttributeModifier(uuid, "Armor health boost", 4.0, AttributeModifier.Operation.ADDITION));
}
}

View file

@ -1,52 +1,54 @@
package ru.betterend.item;
import java.util.UUID;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.ai.attributes.Attribute;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.item.ArmorItem;
import net.minecraft.world.item.ArmorMaterial;
import net.minecraft.world.item.Item;
import ru.betterend.mixin.common.ArmorItemAccessor;
import ru.betterend.patterns.Patterned;
import ru.betterend.patterns.Patterns;
public class EndArmorItem extends ArmorItem implements Patterned {
public EndArmorItem(ArmorMaterial material, EquipmentSlot slot, Item.Properties settings) {
super(material, slot, settings);
import java.util.UUID;
addKnockbackResistance((ArmorItemAccessor) this, slot, this.knockbackResistance);
public class EndArmorItem extends ArmorItem implements Patterned {
protected static final UUID[] ARMOR_MODIFIER_UUID_PER_SLOT = new UUID[] {
UUID.fromString("845DB27C-C624-495F-8C9F-6020A9A58B6B"),
UUID.fromString("D8499B04-0E66-4726-AB29-64469D734E0D"),
UUID.fromString("9F3D476D-C118-4544-8365-64846904B48E"),
UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150")
};
protected final Multimap<Attribute, AttributeModifier> defaultModifiers;
public EndArmorItem(ArmorMaterial material, EquipmentSlot equipmentSlot, Properties settings) {
super(material, equipmentSlot, settings);
this.defaultModifiers = HashMultimap.create();
UUID uuid = ARMOR_MODIFIER_UUID_PER_SLOT[equipmentSlot.getIndex()];
addAttributeModifier(Attributes.ARMOR, new AttributeModifier(uuid, "Armor modifier", getDefense(), AttributeModifier.Operation.ADDITION));
addAttributeModifier(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(uuid, "Armor toughness", getToughness(), AttributeModifier.Operation.ADDITION));
if (knockbackResistance > 0.0F) {
addAttributeModifier(Attributes.KNOCKBACK_RESISTANCE, new AttributeModifier(uuid, "Armor knockback resistance", knockbackResistance, AttributeModifier.Operation.ADDITION));
}
}
/** Ensures knockback resistance is actually applied */
private static void addKnockbackResistance(ArmorItemAccessor accessor, EquipmentSlot slot, double knockbackResistance) {
if (knockbackResistance == 0) {
return;
@Override
public Multimap<Attribute, AttributeModifier> getDefaultAttributeModifiers(EquipmentSlot equipmentSlot) {
return equipmentSlot == slot ? defaultModifiers : super.getDefaultAttributeModifiers(equipmentSlot);
}
protected void addAttributeModifier(Attribute attribute, AttributeModifier modifier) {
if (defaultModifiers.containsKey(attribute)) {
defaultModifiers.removeAll(attribute);
}
Multimap<Attribute, AttributeModifier> attributeModifiers = accessor.be_getDefaultModifiers();
// In case Mojang or anyone else decided to fix this
if (attributeModifiers.keys().contains(Attributes.KNOCKBACK_RESISTANCE)) {
return;
}
UUID uuid = accessor.be_getModifiers()[slot.getIndex()];
// Rebuild attributeModifiers to include knockback resistance
ImmutableMultimap.Builder<Attribute, AttributeModifier> builder = ImmutableMultimap.builder();
builder.putAll(attributeModifiers);
builder.put(Attributes.KNOCKBACK_RESISTANCE, new AttributeModifier(uuid, "Armor knockback resistance", knockbackResistance, AttributeModifier.Operation.ADDITION));
accessor.be_setDefaultModifiers(builder.build());
defaultModifiers.put(attribute, modifier);
}
@Override
public String getModelPattern(String name) {
return Patterns.createJson(Patterns.ITEM_GENERATED, name);
return Patterns.createItemGenerated(name);
}
}

View file

@ -0,0 +1,10 @@
package ru.betterend.item;
import net.minecraft.world.entity.ai.attributes.Attribute;
public class EndAttribute extends Attribute {
public EndAttribute(String description, double value) {
super(description, value);
}
}

View file

@ -1,24 +0,0 @@
package ru.betterend.mixin.common;
import java.util.UUID;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import com.google.common.collect.Multimap;
import net.minecraft.world.entity.ai.attributes.Attribute;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.item.ArmorItem;
@Mixin(ArmorItem.class)
public interface ArmorItemAccessor {
@Accessor("ARMOR_MODIFIER_UUID_PER_SLOT")
UUID[] be_getModifiers();
@Accessor("defaultModifiers")
Multimap<Attribute, AttributeModifier> be_getDefaultModifiers();
@Accessor("defaultModifiers")
void be_setDefaultModifiers(Multimap<Attribute, AttributeModifier> attributeModifiers);
}

View file

@ -1,7 +1,22 @@
package ru.betterend.mixin.common;
import java.util.Collection;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.util.Mth;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.*;
import net.minecraft.world.entity.ai.attributes.AttributeMap;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.animal.FlyingAnimal;
import net.minecraft.world.item.ElytraItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
@ -10,26 +25,12 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.ModifyArg;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.util.Mth;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.MoverType;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.animal.FlyingAnimal;
import net.minecraft.world.item.ElytraItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
import ru.betterend.interfaces.MobEffectApplier;
import ru.betterend.item.ArmoredElytra;
import ru.betterend.item.CrystaliteArmor;
import ru.betterend.registry.EndAttributes;
import java.util.Collection;
@Mixin(LivingEntity.class)
public abstract class LivingEntityMixin extends Entity {
@ -56,8 +57,38 @@ public abstract class LivingEntityMixin extends Entity {
@Shadow
public abstract boolean isFallFlying();
@Shadow
public abstract AttributeMap getAttributes();
private Entity lastAttacker;
@Inject(method = "createLivingAttributes", at = @At("RETURN"), cancellable = true)
private static void be_createLivingAttributes(CallbackInfoReturnable<AttributeSupplier.Builder> info) {
info.setReturnValue(EndAttributes.addLivingEntityAttributes(info.getReturnValue()));
}
@Inject(method = "tickEffects", at = @At("HEAD"))
protected void be_applyEffects(CallbackInfo info) {
if (!level.isClientSide()) {
LivingEntity owner = LivingEntity.class.cast(this);
if (CrystaliteArmor.hasFullSet(owner)) {
CrystaliteArmor.applySetEffect(owner);
}
getArmorSlots().forEach(itemStack -> {
if (itemStack.getItem() instanceof MobEffectApplier) {
((MobEffectApplier) itemStack.getItem()).applyEffect(owner);
}
});
}
}
@Inject(method = "canBeAffected", at = @At("HEAD"), cancellable = true)
public void be_canBeAffected(MobEffectInstance mobEffectInstance, CallbackInfoReturnable<Boolean> info) {
if (mobEffectInstance.getEffect() == MobEffects.BLINDNESS && getAttributes().getValue(EndAttributes.BLINDNESS_RESISTANCE) > 0.0) {
info.setReturnValue(false);
}
}
@Inject(method = "hurt", at = @At("HEAD"))
public void be_hurt(DamageSource source, float amount, CallbackInfoReturnable<Boolean> info) {
this.lastAttacker = source.getEntity();
@ -80,9 +111,8 @@ public abstract class LivingEntityMixin extends Entity {
if (isFlying && !onGround && !isPassenger() && !hasEffect(MobEffects.LEVITATION)) {
if (ElytraItem.isFlyEnabled(itemStack)) {
if ((fallFlyTicks + 1) % 20 == 0) {
itemStack.hurtAndBreak(1, LivingEntity.class.cast(this), (livingEntity) -> {
livingEntity.broadcastBreakEvent(EquipmentSlot.CHEST);
});
itemStack.hurtAndBreak(1, LivingEntity.class.cast(this),
livingEntity -> livingEntity.broadcastBreakEvent(EquipmentSlot.CHEST));
}
isFlying = true;
} else {

View file

@ -0,0 +1,20 @@
package ru.betterend.registry;
import net.minecraft.core.Registry;
import net.minecraft.world.entity.ai.attributes.Attribute;
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
import ru.betterend.item.EndAttribute;
public class EndAttributes {
public final static Attribute BLINDNESS_RESISTANCE = registerAttribute("generic.blindness_resistance", 0.0, true);
public static Attribute registerAttribute(String name, double value, boolean syncable) {
return Registry.register(Registry.ATTRIBUTE, name, new EndAttribute("attribute.name." + name, value).setSyncable(syncable));
}
public static AttributeSupplier.Builder addLivingEntityAttributes(AttributeSupplier.Builder builder) {
return builder.add(EndAttributes.BLINDNESS_RESISTANCE);
}
}

View file

@ -33,15 +33,7 @@ import net.minecraft.world.item.Tiers;
import net.minecraft.world.level.block.DispenserBlock;
import ru.betterend.BetterEnd;
import ru.betterend.config.Configs;
import ru.betterend.item.ArmoredElytra;
import ru.betterend.item.DrinkItem;
import ru.betterend.item.EnchantedPetalItem;
import ru.betterend.item.EndArmorItem;
import ru.betterend.item.EndBucketItem;
import ru.betterend.item.EndSpawnEggItem;
import ru.betterend.item.EternalCrystalItem;
import ru.betterend.item.PatternedDiscItem;
import ru.betterend.item.PatternedItem;
import ru.betterend.item.*;
import ru.betterend.item.material.EndArmorMaterial;
import ru.betterend.item.material.EndToolMaterial;
import ru.betterend.item.tool.EndAxeItem;
@ -90,10 +82,10 @@ public class EndItems {
public static final Item AETERNIUM_CHESTPLATE = registerItem("aeternium_chestplate", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, makeItemSettings().fireResistant()));
public static final Item AETERNIUM_LEGGINGS = registerItem("aeternium_leggings", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.LEGS, makeItemSettings().fireResistant()));
public static final Item AETERNIUM_BOOTS = registerItem("aeternium_boots", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.FEET, makeItemSettings().fireResistant()));
public static final Item CRYSTALITE_HELMET = registerItem("crystalite_helmet", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.HEAD, makeItemSettings().rarity(Rarity.UNCOMMON)));
public static final Item CRYSTALITE_CHESTPLATE = registerItem("crystalite_chestplate", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.CHEST, makeItemSettings().rarity(Rarity.UNCOMMON)));
public static final Item CRYSTALITE_LEGGINGS = registerItem("crystalite_leggings", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.LEGS, makeItemSettings().rarity(Rarity.UNCOMMON)));
public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeItemSettings().rarity(Rarity.UNCOMMON)));
public static final Item CRYSTALITE_HELMET = registerItem("crystalite_helmet", new CrystaliteHelmet());
public static final Item CRYSTALITE_CHESTPLATE = registerItem("crystalite_chestplate", new CrystaliteChestplate());
public static final Item CRYSTALITE_LEGGINGS = registerItem("crystalite_leggings", new CrystaliteLeggings());
public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new CrystaliteBoots());
public static final Item ARMORED_ELYTRA = registerItem("elytra_armored", new ArmoredElytra("elytra_armored", EndArmorMaterial.AETERNIUM, Items.PHANTOM_MEMBRANE, 900, 0.96D, true));
// Tools //

View file

@ -865,5 +865,7 @@
"item.betterend.blossom_berry_jelly": "Blossom Berry Jelly",
"item.betterend.aeternium_forged_plate": "Aeternium Forged Plate",
"item.betterend.terminite_forged_plate": "Terminite Forged Plate",
"item.betterend.thallasium_forged_plate": "Thallasium Forged Plate"
"item.betterend.thallasium_forged_plate": "Thallasium Forged Plate",
"attribute.name.generic.blindness_resistance": "Blindness Resistance"
}

View file

@ -881,5 +881,7 @@
"item.betterend.blossom_berry_jelly": "Желе из цветущей ягоды",
"item.betterend.aeternium_forged_plate": "Этериевая кованная пластина",
"item.betterend.terminite_forged_plate": "Терминитовая кованная пластина",
"item.betterend.thallasium_forged_plate": "Талласиевая кованная пластина"
"item.betterend.thallasium_forged_plate": "Талласиевая кованная пластина",
"attribute.name.generic.blindness_resistance": "Сопротивление ослеплению"
}

View file

@ -22,7 +22,6 @@
"BlockBehaviourMixin",
"DimensionTypeMixin",
"RecipeManagerMixin",
"ArmorItemAccessor",
"BoneMealItemMixin",
"CraftingMenuMixin",
"LivingEntityMixin",