Максимальное здоровье и защита сущности.

Версия Minecraft
1.14.4
API
Forge
Как я могу установить максимальное здоровье живого существа и защиту? Это нужно для рассчета бонуса к здоровью и защите.
Спасибо.
 
Решение
Что вы имеете в виду каждый раз? Разве это не должно просто войти в конструктор мода?
Я думаю, если ты сделаешь это только один раз, все в порядке, да.
Разве getClass не единственный способ получить класс из объекта?
Правильно, но тебе нужен не класс объекта, а очень специфический класс, содержащий поле maxValue, то есть RangedAttribute.
Но я не могу просто использовать entity.getAttribute(SharedMonsterAttribute.MAX_HEALTH).getBaseValue(), потому-что я в LivingUpdateEvent, и это становится циклом.
Я не уверен, почему ты думаешь, что это "превратится в зацикливание". Но это способ получить "базовое значение" для максимального здоровья. Он должен нормально работать в LivingUpdateEvent.
 
Я не уверен, почему ты думаешь, что это "превратится в зацикливание". Но это способ получить "базовое значение" для максимального здоровья. Он должен нормально работать в LivingUpdateEvent.
Да, именно так:
update 1 ===: 10 + 2(бонус)
update 2 ===: 12 + 2(бонус)

Он модифицируется, после чего здоровье увеличивается бессконечно. Я это проверил, это проблема.
Могу ли я преорозовать EntityType в LivingEntity.?
 
Да, именно так:
update 1 ===: 10 + 2(бонус)
update 2 ===: 12 + 2(бонус)
Нет, этого не произойдет, потому что базовое значение не включает в себя модификаторы атрибута, на что указывает его имя.
Могу ли я преорозовать EntityType в LivingEntity.?
Нет. Тип объекта представляет собой абстрактное понятие типа объекта (например, "все зомби"). LivingEntity - это базовый класс для реальных сущностей ("этот конкретный зомби"). Нет пригодного способа конвертировать из EntityType в LivingEntity.
 
Нет, этого не произойдет, потому что базовое значение не включает в себя модификаторы атрибута, на что указывает его имя.
Это так, я только что проверил это в своем мире и здоровье продолжает расти.
Нет. Тип объекта представляет собой абстрактное понятие типа объекта (например, "все зомби"). LivingEntity - это базовый класс для реальных сущностей ("этот конкретный зомби"). Нет пригодного способа конвертировать из EntityType в LivingEntity.
Значит, я ввел значения вручную?
 
Java:
@SubscribeEvent
public static void update(LivingUpdateEvent event) {
    LivingEntity entity = event.getEntityLiving();
    LivingEntityUtils utils = new LivingEntityUtils(entity);
    int bonus = utils.calculateHealthBonus(); //Бонус
    double baseHealth = entity.getAttribute(SharedMonsterAttributes.MAX_HEALTH).getBaseValue();
        
    entity.getAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(baseHealth + bonus);
}
Понятия не имею, о чем ты говоришь.
Сохранить максимальное здоровье по умолчанию.
 
Теперь у меня все работает, но мне нужно создавать возможность только для сохранения, если эффект применен.
Если хочешь хранить дополнительные данные о сущностях, которые тебе не принадлежат, то да, тебе нужна "возможность".
 
У меня получилось сделать это:
Java:
 if(heaHealth > 0) { //Уровень зачарования;
String id = "hea_health-enchantment";
boolean isAlreadyApplied = false;
            
for(AttributeModifier modifer : utils.MAX_HEALTH().getModifiers()) { //utils.MAX_HEALTH() возвращает максимальный атрибут здоровья
if(modifer.getName().equals(id)) {
isAlreadyApplied = true;
}
}
            
if(!isAlreadyApplied) {
AttributeModifier newModifier = new AttributeModifier(id, heaHealth * 2, Operation.ADDITION);
utils.MAX_HEALTH().applyModifier(newModifier);
}
} else {
for(AttributeModifier modifer : utils.MAX_HEALTH().getModifiers()) {
if(modifer.getName().equals("hea_health-enchantment")) {
utils.MAX_HEALTH().removeModifier(modifer);
}
}
}
 
Я не особо знаком с рефлексией, но пытался заменить поле:
Java:
private void setMaxDefenseValue() throws NoSuchFieldException, SecurityException, IllegalAccessException {
    Class<SharedMonsterAttributes> attributesArmor = SharedMonsterAttributes.class;
    Field fieldArmor = attributesArmor.getField("ARMOR");
      
    IAttribute attribute = (new RangedAttribute((IAttribute)null, "arm.gen", 0.0D, 0.0D, 1034.0D)).setShouldWatch(true);
      
    fieldArmor.set(attribute, arm);
}
Я вызвал это в конструкторе мода. Не уверен что это правильно.
 
Назад
Сверху