• Гость, публикуйте свои сливы кода через Ресурсы!
    После публикации слива в Ресурсах в этом форуме будет автоматически создана тема для обсуждения.

[Туториал] [1.11.2] Capability

Doc

Золотая лига
Сообщения
2,285
Лучшие ответы
123
Симпатии
290
#1
Как создать Capability на 1.11.2 или же IEEP на 1.11.2
Элементарный пример с маной.

Код:
   public interface IManaHandler {

        int getMana();
        void setMana(int mana);
        void addMana(int mana);
        void removeMana(int mana);
    }

Код:
   @CapabilityInject(IManaHandler.class)
    public static final Capability<IManaHandler> CAPABILITY_MANA = null;

Код:
   public class DefaultManaHandler implements IManaHandler {

        private int mana;
        
        @Override
        public int getMana () {
            return this.mana;
        }

        @Override
        public void setMana (int mana) {
            this.mana = mana;
        }

        @Override
        public void addMana (int mana) {
            this.mana += mana;
        }

        @Override
        public void removeMana (int mana) {
            this.mana -= mana;
            
            if (this.mana < 0)
                this.mana = 0;
        }
    }

Код:
   public class Storage implements Capability.IStorage<IManaHandler> {

        @Override
        public NBTBase writeNBT (Capability<IManaHandler> capability, IManaHandler instance, EnumFacing side) {
            
            final NBTTagCompound tag = new NBTTagCompound();           
            tag.setInteger("mana", instance.getMana());          
            return tag;
        }

        @Override
        public void readNBT (Capability<IManaHandler> capability, IManaHandler instance, EnumFacing side, NBTBase nbt) {
            
            final NBTTagCompound tag = (NBTTagCompound) nbt;
            instance.setMana(tag.getInteger("mana"));
        }
    }

Код:
   public class Provider implements ICapabilitySerializable<NBTTagCompound> {
        
        IManaHandler instance = CAPABILITY_MANA.getDefaultInstance();

        @Override
        public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
            
            return capability == CAPABILITY_MANA;
        }

        @Override
        public <T> T getCapability(Capability<T> capability, EnumFacing facing) {
            
            return hasCapability(capability, facing) ? CAPABILITY_MANA.<T>cast(instance) : null;
        }

        @Override
        public NBTTagCompound serializeNBT() {
            
            return (NBTTagCompound) CAPABILITY_MANA.getStorage().writeNBT(CAPABILITY_MANA, instance, null);
        }

        @Override
        public void deserializeNBT(NBTTagCompound nbt) {
            
            CAPABILITY_MANA.getStorage().readNBT(CAPABILITY_MANA, instance, null, nbt);
        }
    }

Код:
CapabilityManager.INSTANCE.register(IManaHandler.class, new Storage(), DefaultManaHandler.class);

Код:
   @SubscribeEvent
    public void attachCapabilities(AttachCapabilitiesEvent<Entity> event) {
        
        if (event.getObject() instanceof EntityPlayer)
            event.addCapability(new ResourceLocation("MODID", "NAME"), new Provider());
    }

Код:
   @SubscribeEvent
    public void clonePlayer(PlayerEvent.Clone event) {
        
        final IManaHandler original = getHandler(event.getOriginal());
        final IManaHandler clone = getHandler(event.getEntity());
        clone.setMana(original.getMana());
    }

Использовать - сохранение/загрузка - serializeNBT/deserializeNBT.

Код:
    public static IManaHandler getHandler(Entity entity) {

        if (entity.hasCapability(CAPABILITY_MANA, EnumFacing.DOWN))
            return entity.getCapability(CAPABILITY_MANA, EnumFacing.DOWN);
        return null;
    }


(c)
Офф ссылка + больше комментов:
http://tutorials.darkhax.net/tutorials/custom_entity_data/
 

Minebot

Каменная лига
Сообщения
994
Лучшие ответы
13
Симпатии
94
#2
Слався о Бог мой. А то меня уже достало WorldSaveData юзать. Пойду в Capability всё оборачивать...
 

Ivasik

Porting GrandBombaster
Команда форума
Сообщения
2,663
Лучшие ответы
75
Симпатии
253
#3
Аха, чистый копипаст с minecraft planet. Ссылку добавь, а то снесу.
 

Doc

Золотая лига
Сообщения
2,285
Лучшие ответы
123
Симпатии
290
#4
Так я не от туда брал.
 

Maxik001

Золотая лига
Сообщения
4,342
Лучшие ответы
40
Симпатии
459
#5
Знаю как проще. Но лень тутор пилить.
 

MJaroslav

Каменная лига
Сообщения
720
Лучшие ответы
17
Симпатии
90
#6
Maxik001 написал(а):
Знаю как проще. Но лень тутор пилить.
Я живу, зная как проще, но мне лень ¯\_(ツ)_/¯
 

Doc

Золотая лига
Сообщения
2,285
Лучшие ответы
123
Симпатии
290
#7
Maxik001 написал(а):
Знаю как проще. Но лень тутор пилить.
Сообщение чисто для флуда, чсв свое "поднять"? Смысл этого сообщения просто зашкаливает.

~~~

Одмены или модераторы - сделайте доброе дело, почистите!
 

Garik1303

Каменная лига
Сообщения
691
Лучшие ответы
2
Симпатии
3
#8
Doc написал(а):
Maxik001 написал(а):
Знаю как проще. Но лень тутор пилить.
Сообщение чисто для флуда, чсв свое "поднять"? Смысл этого сообщения просто зашкаливает.
Сейчас бы и твоё и его и моё сообщение удалить!
 

[Extended]TalosDx

Каменная лига
Сообщения
476
Лучшие ответы
9
Симпатии
37
#9
Я так понял entityPlayer нельзя юзать в public DefaultManaHandler(EntityPlayer player)
В конструкторе DefaultManaHandler'a?
Тогда как отправлять пакеты и синхронизировать данные?
 

Doc

Золотая лига
Сообщения
2,285
Лучшие ответы
123
Симпатии
290
#10
Тебе нужно получить капу через метод, который в спойлере "Получение".
После ты должен изменить через нужные методы.
Переменная изменится на той стороне, которая была использована.
Для пакетов - так же этот же способ.
 

Ivasik

Porting GrandBombaster
Команда форума
Сообщения
2,663
Лучшие ответы
75
Симпатии
253
#11
talosdx написал(а):
Я так понял entityPlayer нельзя юзать в     public DefaultManaHandler(EntityPlayer player)
В конструкторе DefaultManaHandler'a?
Тогда как отправлять пакеты и синхронизировать данные?
Мою тему про пакеты смотри. Там описана синхронизация. А еще там правильная капа (с точки зрения заполнения, пополнения маны), а так же с отправкой. (Спс дахаке)
 

Yeti

Каменная лига
Сообщения
242
Лучшие ответы
3
Симпатии
68
#13
Зачем ты компилируешь то, что в туторах? Это не халявный мод. Гайд на то и гайд, чтобы обучить некоторым основным вещам, показать пример, а реализация и всё остальное - твоя работа.
Видно же, что ты даже в базисе моддинга не разбираешься, а, возможно, даже и в яве. Ну не в обиду, конечно, просто зачем прыгать выше своих возможностей.
Пройди первые этапы, тебе же потом легче будет )
 

hohserg

Алмазная лига
Сообщения
3,569
Лучшие ответы
90
Симпатии
399
#14
Где объяснения? Почему голый код?
Че такое капабилити? Че такое IStorage, на кой оно нужно?
 

Doc

Золотая лига
Сообщения
2,285
Лучшие ответы
123
Симпатии
290
#15
Можно перенести в сливы кода?
В 2к17 не было такой категории, по этому это тут (в туторах).
 

GoogleTan

Каменная лига
Сообщения
52
Лучшие ответы
0
Симпатии
0
#16
Последнее редактирование:
Сверху