[1.11.2] Capability

3,005
192
592
Как создать 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/
 
1,015
9
102
Слався о Бог мой. А то меня уже достало WorldSaveData юзать. Пойду в Capability всё оборачивать...
 

Icosider

Kotliner
Администратор
3,600
99
663
Аха, чистый копипаст с minecraft planet. Ссылку добавь, а то снесу.
 
3,005
192
592
Так я не от туда брал.
 
5,018
47
783
Знаю как проще. Но лень тутор пилить.
 
3,005
192
592
Maxik001 написал(а):
Знаю как проще. Но лень тутор пилить.

Сообщение чисто для флуда, чсв свое "поднять"? Смысл этого сообщения просто зашкаливает.

~~~

Одмены или модераторы - сделайте доброе дело, почистите!
 
476
9
39
Я так понял entityPlayer нельзя юзать в public DefaultManaHandler(EntityPlayer player)
В конструкторе DefaultManaHandler'a?
Тогда как отправлять пакеты и синхронизировать данные?
 
3,005
192
592
Тебе нужно получить капу через метод, который в спойлере "Получение".
После ты должен изменить через нужные методы.
Переменная изменится на той стороне, которая была использована.
Для пакетов - так же этот же способ.
 

Icosider

Kotliner
Администратор
3,600
99
663
talosdx написал(а):
Я так понял entityPlayer нельзя юзать в     public DefaultManaHandler(EntityPlayer player)
В конструкторе DefaultManaHandler'a?
Тогда как отправлять пакеты и синхронизировать данные?

Мою тему про пакеты смотри. Там описана синхронизация. А еще там правильная капа (с точки зрения заполнения, пополнения маны), а так же с отправкой. (Спс дахаке)
 

Sainthozier

Стрелочник
623
11
369
Зачем ты компилируешь то, что в туторах? Это не халявный мод. Гайд на то и гайд, чтобы обучить некоторым основным вещам, показать пример, а реализация и всё остальное - твоя работа.
Видно же, что ты даже в базисе моддинга не разбираешься, а, возможно, даже и в яве. Ну не в обиду, конечно, просто зачем прыгать выше своих возможностей.
Пройди первые этапы, тебе же потом легче будет )
 
7,099
324
1,509
Где объяснения? Почему голый код?
Че такое капабилити? Че такое IStorage, на кой оно нужно?
 
3,005
192
592
Можно перенести в сливы кода?
В 2к17 не было такой категории, по этому это тут (в туторах).
 
Сверху