[1.6.x] Вес.

Сообщения
213
Лучшие ответы
6
Реакции
8
(Взял тему с весом, чтобы было понятней что мне нужно).
Собственно моя проблема очень похожа на тему с весом.
Мне нужно добавлять к переменной вес предмета, если определенный предмет есть в инвентаре и как только его выбросят, или каким-то другим образом уберут из инвентаря - переменная веса убавится на равное весу предмета значение.

Хотел реализовать это через ивенты подбора и выброса предмета, проверяя что за предмет подобран/выброшен и в зависимости от полученного предмета убавлять/увеличивать на нужное количество переменную. Но это довольно костыльно, ибо предмет может быть удален каким-либо другим образом из инвентаря и могут возникнуть недочеты в системе. 

Заранее спасибо.
 
Сообщения
608
Лучшие ответы
5
Реакции
14
Тем много было.
Первое что приходит на ум, это в set и get в слотах изменять всё это дело.
 
Сообщения
213
Лучшие ответы
6
Реакции
8
svk2140 написал(а):
Тем много было.
Первое что приходит на ум, это в set и get в слотах изменять всё это дело.
В плане через слот чекать что за предмет в нем лежит и с каким весом?

И да, у меня свой инвентарь игрока. (думаю это важная деталь)
 
Сообщения
667
Лучшие ответы
7
Реакции
2

tox1cozZ

aka Agravaine
Модератор
Сообщения
6,820
Лучшие ответы
412
Реакции
1,901
Каждый тик пересчитывать вес, не?
 
Сообщения
213
Лучшие ответы
6
Реакции
8
Сообщения
2,484
Лучшие ответы
76
Реакции
367
Упоролись что ли? Если инвентарь свой, с этим вообще никаких проблем не должно ощущаться. Чем не понравилась идея с сеттером?
[merge_posts_bbcode]Добавлено: 22.07.2016 13:48:34[/merge_posts_bbcode]

Onneros написал(а):
svk2140 написал(а):
Тем много было.
Первое что приходит на ум, это в set и get в слотах изменять всё это дело.
В плане через слот чекать что за предмет в нем лежит и с каким весом?

И да, у меня свой инвентарь игрока. (думаю это важная деталь)
В плане, пересчитывать вес, когда устанавливается значение
 
Сообщения
1,138
Лучшие ответы
5
Реакции
2
А как игрока замедлять? Действовать на motion'ы не выходит, игрок скорости не теряет (
 
Сообщения
2,484
Лучшие ответы
76
Реакции
367
Можно посмотреть, как работает зелье замедления
 

tox1cozZ

aka Agravaine
Модератор
Сообщения
6,820
Лучшие ответы
412
Реакции
1,901
Атрибутами, очевидно же.
 
Сообщения
1,138
Лучшие ответы
5
Реакции
2
Их же нельзя каждый тик применять.
 

tox1cozZ

aka Agravaine
Модератор
Сообщения
6,820
Лучшие ответы
412
Реакции
1,901
Почему бы и нет?Удаляешь, затем применяешь. И все.
 
Сообщения
1,138
Лучшие ответы
5
Реакции
2
Не медленно, нет? Примерчик покажешь?
 

tox1cozZ

aka Agravaine
Модератор
Сообщения
6,820
Лучшие ответы
412
Реакции
1,901
Код:
package ua.agravaine.weight;

import java.util.UUID;

import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.ai.attributes.AttributeModifier;
import net.minecraft.entity.ai.attributes.IAttribute;
import net.minecraft.entity.ai.attributes.IAttributeInstance;

public class Bonus{

    private UUID id;
    private AttributeModifier attribute;
    private IAttribute base;
    private double value;
    private String title;
    
    public Bonus(String name, IAttribute baseAttribute, double bonus){
        this(UUID.randomUUID(), name, baseAttribute, bonus);
    }
    
    public Bonus(UUID uuid, String name, IAttribute baseAttribute, double bonus){
        id = uuid;
        base = baseAttribute;
        value = bonus;
        title = name;
        attribute = new AttributeModifier(id, name, value, 2).setSaved(false);
    }
    
    public void setValue(double bonus){
        attribute = new AttributeModifier(id, title, bonus, 2).setSaved(false);
    }
    
    public void apply(EntityLivingBase entity){
        IAttributeInstance instance = entity.getEntityAttribute(base);
        if(instance.getModifier(id) != null){
            instance.removeModifier(attribute);
        }
        instance.applyModifier(attribute);
    }
    
    public void remove(EntityLivingBase entity){
        IAttributeInstance instance = entity.getEntityAttribute(base);
        if(instance.getModifier(id) != null){
            instance.removeModifier(attribute);
        }
    }
    
    public void update(EntityLivingBase entity, boolean add){
        if(add){
            apply(entity);
        }else{
            remove(entity);
        }
    }
}
Код:
private static final Bonus maxWeightSlow = new Bonus("Max Weight Slow", SharedMonsterAttributes.movementSpeed, -1.0D);
Код:
maxWeightSlow.update(e.player, weight >= WeightMod.MAX_WEIGHT);
 
Сверху