Crystalite Armor additional effects
This commit is contained in:
parent
5d81d7b448
commit
bc53748657
18 changed files with 252 additions and 116 deletions
|
@ -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) {
|
||||
|
|
|
@ -2,10 +2,15 @@ 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());
|
||||
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
package ru.betterend.interfaces;
|
||||
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
|
||||
public interface MobEffectApplier {
|
||||
void applyEffect(LivingEntity owner);
|
||||
}
|
|
@ -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;
|
||||
|
|
28
src/main/java/ru/betterend/item/CrystaliteArmor.java
Normal file
28
src/main/java/ru/betterend/item/CrystaliteArmor.java
Normal 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));
|
||||
}
|
||||
}
|
21
src/main/java/ru/betterend/item/CrystaliteBoots.java
Normal file
21
src/main/java/ru/betterend/item/CrystaliteBoots.java
Normal 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));
|
||||
}
|
||||
}
|
21
src/main/java/ru/betterend/item/CrystaliteChestplate.java
Normal file
21
src/main/java/ru/betterend/item/CrystaliteChestplate.java
Normal 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));
|
||||
}
|
||||
}
|
18
src/main/java/ru/betterend/item/CrystaliteHelmet.java
Normal file
18
src/main/java/ru/betterend/item/CrystaliteHelmet.java
Normal 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));
|
||||
}
|
||||
}
|
18
src/main/java/ru/betterend/item/CrystaliteLeggings.java
Normal file
18
src/main/java/ru/betterend/item/CrystaliteLeggings.java
Normal 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));
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
10
src/main/java/ru/betterend/item/EndAttribute.java
Normal file
10
src/main/java/ru/betterend/item/EndAttribute.java
Normal 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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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 {
|
||||
|
|
20
src/main/java/ru/betterend/registry/EndAttributes.java
Normal file
20
src/main/java/ru/betterend/registry/EndAttributes.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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 //
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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": "Сопротивление ослеплению"
|
||||
}
|
|
@ -22,7 +22,6 @@
|
|||
"BlockBehaviourMixin",
|
||||
"DimensionTypeMixin",
|
||||
"RecipeManagerMixin",
|
||||
"ArmorItemAccessor",
|
||||
"BoneMealItemMixin",
|
||||
"CraftingMenuMixin",
|
||||
"LivingEntityMixin",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue