Параметры

Версия Minecraft
1.7.10
API
Forge
33
3
6
В IEEP есть параметры защиты от разных условий, эти параметры защиты должны давать предметы находящиеся в нескольких слотах.
IEEP:
    private int OneDamageProtection;
    private int TwoDamageProtection;
Предмет:
    public int OneDamageProtection;
    public int TwoDamageProtection;

    public Items(Items items) {
        super();
        this.setMaxStackSize(1);
        this.setCreativeTab(CreativeTabs.tabCombat);
        this.setOneDamageProtection(items.OneDamageProtection);
        this.setTwoDamageProtection(items.TwoDamageProtection);
        GameRegistry.registerItem(this, items.name, Core.MODID);
    }

    public int getOneDamageProtection() {
        return OneDamageProtection;
    }

    public void setOneDamageProtection(int OneDamageProtection) {
        this.OneDamageProtection = OneDamageProtection;
    }

    public int getTwoDamageProtection() {
        return TwoDamageProtection;
    }

    public void setTwoDamageProtection(int TwoDamageProtection) {
        this.TwoDamageProtection = TwoDamageProtection;
    }

}
Прибавляю параметры таким образом
Прибавление параметров:
public void setAttributes(Items items, EntityPlayer player) {
        ExtendedPlayer exp = ExtendedPlayer.get(player);
        if (items.getOneDamageProtection() > 0) {
            exp.setOneDamageProtection(exp.getOneDamageProtection() + items.getOneDamageProtection());
        }
        if (items.getTwoDamageProtection() > 0) {
            exp.setTwoDamageProtection(
                    exp.getTwoDamageProtection() + items.getTwoDamageProtection());
        }
}
Думал поместить в тикер или апдейт игрока, но понимаю, что каждый раз значение будет бесконечно прибавляться.
Вопрос в том, как сделать обновление параметра в том случае, когда предмет/предметы появляется в инвентаре и смена значения на 0, если в инвентаре нет таких предметов которые обновляют параметр
 
Решение
Решил проблему с помощью
Решение:
                         if (exp.oldItemEquipment[i] != slot) {
                        checkItem(player, exp.oldItemEquipment[i], slot, i);
                        if (exp.oldItemEquipment[i] != null) {
                            Clothes cl = (Clothes) exp.oldItemEquipment[i].getItem();
                            if (!player.worldObj.isRemote) {
                                exp.setRadiationDamageProtection(
                                        exp.getRadiationDamageProtection() - cl.getRadiationDamageProtection());
                                exp.syncData();
                            }
                        }
                        exp.oldItemEquipment[i] = slot;
                        if...
33
3
6
Зачем в конструктор передавать параметр
Потому что все предметы создаются через файлы, если не использовать сеттеры, то значения будут передаваться из последнего файла.
В методе устанавливается значение для ieep, чтобы в дальнейшем получать сложенные значение из предметов и использовать их именно через ieep
 
21
2
Мне кажется следует пересмотреть подход к реализации поставленной задачи. То что ты прикрепил здесь лютое сумасшествие.
То что у тебя Items принимает экземпляры самого себя уже должно было заставить задуматься о том, что нужно что-то пересмотреть в своей жизни. Уверен, твою задумку можно реализовать куда лучше и по крайней мере можно будет разобрать без рюмки водки.

Также, рекомендовал бы избегать использование методов, не имеющих отношения к инициализации объекта в конструкторе.
В твоем случае это использование GameRegistry.registerItem. Конечно, такое использование в твоем коде вероятно не повлечет никаких проблем, однако это не есть правильно. Такие методы ожидают полностью собранного и готового к работе объекта, а ты его уже на стадии инициализации пихаешь куда-то. В будущем это может сыграть в плохую шутку с тобой, где ты можешь попытаться случайно начать оперировать полусконструированным объектом...
 
175
14
25
Также, рекомендовал бы избегать использование методов, не имеющих отношения к инициализации объекта в конструкторе.
В твоем случае это использование GameRegistry.registerItem.
Why not? Ты конструктор предмета заюзаешь мб 1 раз в коде... И то, чтобы зарегистрировать объект...

GameRegistry.registerItem(this, name);
 
21
2
Why not? Ты конструктор предмета заюзаешь мб 1 раз в коде... И то, чтобы зарегистрировать объект...
Я пояснил в сообщении почему нет. Это просто рекомендация, которая основана на опыте, такие ошибки правда совершаются, когда в итоге начинают оперировать с неготовыми объектами. Это не какое-то безоговорочное требование

Ну и вообще, вспомним какую цель преследует конструктор? Подготовить объект и дать ему выйти в свет. Ты его отпускаешь в свет до того как он был до конца подготовлен
 
Последнее редактирование:
175
14
25
Ну и вообще, вспомним какую цель преследует конструктор? Подготовить объект и дать ему выйти в свет. Ты его отпускаешь в свет до того как он был до конца подготовлен
Ну.... Конструктору для инициализации многого не нужно. До GameRegistry он и так полностью подготовлен..... Бред.
 
21
2
Ну.... Конструктору для инициализации многого не нужно. До GameRegistry он и так полностью подготовлен..... Бред.
Ну да, ты совершено прав, делай как велит сердце и это главное. После таких рекомендаций и впадаешь в стазис увидев типичный код мода майнкрафт.
Тебе явно указывают на возможные проблемы такого подхода, но ты ссылаешься на то, что это бред, так как именно в этой ситуации этой проблемы возникнуть не может и так проще.
 
21
2
Я устал что-то объяснять уже. Если мой ответ недостаточно исчерпывающий и у тебя не хватает ума написать запрос в гугл и перейти по первой ссылке перед тем как спорить - то я не поленился сделать это вместо тебя.
 
175
14
25
и у тебя не хватает ума написать запрос в гугл и перейти по первой ссылке перед тем как спорить
Кому я что-то должен? Я тебя попросил привести пример проблемы, в ответ на что ты кинул ссылку на вопрос, не имеющий абсолютно никакого смысла.
 
21
2
Кому я что-то должен? Я тебя попросил привести пример проблемы, в ответ на что ты кинул ссылку на вопрос, не имеющий абсолютно никакого смысла.
Я так понимаю ты вопрос открыл (в лучшем случае), а до ответа на вопрос, где как раз человек все объяснил приводя примеры ты уже не додумался прокрутить страницу
 
Последнее редактирование:
21
2
Вопрос в том, как сделать обновление параметра в том случае, когда предмет/предметы появляется в инвентаре и смена значения на 0, если в инвентаре нет таких предметов которые обновляют параметр
Если я правильно понял вопрос, то тебе нужно отслеживать варианты попадания предмета в инвентарь.

На сколько я знаю конкретно такого события нет. Если твой предмет относится к броне, то можешь попробовать LivingEquipmentChangeEvent.

Если что-то иное (например, просто в инвентаре), то можно просто костылить слушать ряд других событий, таких как: LivingEntityUseItemEvent, EntityItemPickupEvent и другие, что не очень надежно конечно же.

Также, мне кажется ты можешь просто проверять изменения инвентаря каждый тик. Как я понял, в minecraft это все равно делается каждый тик.

Ну и вариант, который мне сейчас пока я писал пришел в голову - обернуть в Observable массив с содержимым предметов игрока и подписаться на изменение содержимого этого массива. Вариант не испытывал, можешь просто попробовать.
 
33
3
6
Решил проблему с помощью
Решение:
                         if (exp.oldItemEquipment[i] != slot) {
                        checkItem(player, exp.oldItemEquipment[i], slot, i);
                        if (exp.oldItemEquipment[i] != null) {
                            Clothes cl = (Clothes) exp.oldItemEquipment[i].getItem();
                            if (!player.worldObj.isRemote) {
                                exp.setRadiationDamageProtection(
                                        exp.getRadiationDamageProtection() - cl.getRadiationDamageProtection());
                                exp.syncData();
                            }
                        }
                        exp.oldItemEquipment[i] = slot;
                        if (slot != null) {
                            clothes = (Clothes) slot.getItem();
                            for (int l = 0; l < exp.inventory.getSizeInventory(); ++l) {
                                if (l != i) {
                                } else {
                                    if (!player.worldObj.isRemote) {
                                        exp.setRadiationDamageProtection(exp.getRadiationDamageProtection()
                                                + clothes.getRadiationDamageProtection());
                                        exp.syncData();
                                    }
                                }
                            }
                        }
                    }
                }
 
Последнее редактирование:
Сверху