[1.6.x] Вес.

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

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

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

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

Agravaine

Модератор
Сообщения
5,273
Лучшие ответы
250
Реакции
1,021
Каждый тик пересчитывать вес, не?
 
Сообщения
213
Лучшие ответы
6
Реакции
8
Сообщения
2,440
Лучшие ответы
75
Реакции
330
Упоролись что ли? Если инвентарь свой, с этим вообще никаких проблем не должно ощущаться. Чем не понравилась идея с сеттером?
[merge_posts_bbcode]Добавлено: 22.07.2016 13:48:34[/merge_posts_bbcode]

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

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

Agravaine

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

Agravaine

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

Agravaine

Модератор
Сообщения
5,273
Лучшие ответы
250
Реакции
1,021
Код:
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);
 
Сверху