- 12
- 0
Как я могу установить максимальное здоровье живого существа и защиту? Это нужно для рассчета бонуса к здоровью и защите.
Спасибо.
Спасибо.
Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
Я думаю, если ты сделаешь это только один раз, все в порядке, да.Что вы имеете в виду каждый раз? Разве это не должно просто войти в конструктор мода?
Правильно, но тебе нужен не класс объекта, а очень специфический класс, содержащий полеРазве getClass не единственный способ получить класс из объекта?
maxValue, то есть RangedAttribute.applyEntityAttributes(). Еще можешь посмотреть EntityZombie.applyEntityAttributes() для более подробного анализа.Я не уверен, почему ты думаешь, что это "превратится в зацикливание". Но это способ получить "базовое значение" для максимального здоровья. Он должен нормально работать вНо я не могу просто использовать entity.getAttribute(SharedMonsterAttribute.MAX_HEALTH).getBaseValue(), потому-что я в LivingUpdateEvent, и это становится циклом.
LivingUpdateEvent.Да, именно так:Я не уверен, почему ты думаешь, что это "превратится в зацикливание". Но это способ получить "базовое значение" для максимального здоровья. Он должен нормально работать вLivingUpdateEvent.
Нет, этого не произойдет, потому что базовое значение не включает в себя модификаторы атрибута, на что указывает его имя.Да, именно так:
update 1 ===: 10 + 2(бонус)
update 2 ===: 12 + 2(бонус)
Нет. Тип объекта представляет собой абстрактное понятие типа объекта (например, "все зомби").Могу ли я преорозовать EntityType в LivingEntity.?
LivingEntity - это базовый класс для реальных сущностей ("этот конкретный зомби"). Нет пригодного способа конвертировать из EntityType в LivingEntity.Это так, я только что проверил это в своем мире и здоровье продолжает расти.Нет, этого не произойдет, потому что базовое значение не включает в себя модификаторы атрибута, на что указывает его имя.
Значит, я ввел значения вручную?Нет. Тип объекта представляет собой абстрактное понятие типа объекта (например, "все зомби").LivingEntity- это базовый класс для реальных сущностей ("этот конкретный зомби"). Нет пригодного способа конвертировать из EntityType в LivingEntity.
Покажи полностью свой код.Это так, я только что проверил это в своем мире и здоровье продолжает расти.
Понятия не имею, о чем ты говоришь.Значит, я ввел значения вручную?
@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);
}
Сохранить максимальное здоровье по умолчанию.Понятия не имею, о чем ты говоришь.
Если хочешь хранить дополнительные данные о сущностях, которые тебе не принадлежат, то да, тебе нужна "возможность".Теперь у меня все работает, но мне нужно создавать возможность только для сохранения, если эффект применен.
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);
}
}
}
ПерезаписатьЕсть ли способ получить защиту выше лимита в "30"
RangedAttribute#maximumValue с помощью рефлексии.Потому что кто-то в Mojang решил, что это будет уместно.почему здесь лимит?
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);
}
RangedAttribute#maximumValue. Не поле SharedMonsterAttributes.ARMOR.но если я это сделаю, разве это не переопредеит каждый отдельный атрибут?RangedAttribute#maximumValue
public void overrideMaxDefenceValue(double newValue) throws NoSuchFieldException, SecurityException, IllegalAccessException {
Field value = SharedMonsterAttributes.ARMOR.getClass().getDeclaredField("maximumValues");
value.setAccessible(true);
value.set(value, newValue);
}