ItemOverride

Версия Minecraft
1.12.2
5,018
47
783
Здравствуйте. Делаю наконец себе модельки как нормальный человек, но что-то до сих пор не могу разобраться, как работают эти оверрайды. Если коротко, моя задача состоит в том, чтобы при определенном значении демейджа моя моделька заменилась на другую
Но я никак не могу понять, как мне получить(создать) эту новую модель и вернуть тут.
Java:
static class ItemOverrideListPickaxe extends ItemOverrideList{
        public static final ItemOverrideListPickaxe INSTANCE = new ItemOverrideListPickaxe(new ArrayList<>());
        ModelBakedPickaxeDest itemModel;

        public ItemOverrideListPickaxe(List<ItemOverride> overridesIn) {
            super(overridesIn);
        }

        @Override
        public IBakedModel handleItemState(IBakedModel originalModel, ItemStack stack, World world, EntityLivingBase entity) {
        
            ModelBakedPickaxeDest newModel = (ModelBakedPickaxeDest)itemModel;
            if(stack.getItemDamage() < 322) return new ModelBakedPickaxeDest(newModel.quads,newModel.textureAtlasSprite);
            
            return originalModel;
        }
    }
 
5,018
47
783
в зависимости от нбт. если нбт нулл,пустая лопата, если не нулл - полная
 
7,099
324
1,510
Ок. Стратегия такая:
Создаешь модель в обычном json, проверяешь что работает в игре
Создаешь три класса
SpadeModelWrapper extends IBakedModel SpadeOverrideList extends ItemOverrideList SpadeFinalisedModel extends IBakedModel

SpadeModelWrapper, враппером обворачиваешь имеющуюся модель лопаты, которую майн сгенерил из json, через ModelBakeEvent, про враппер есть в моем туторе
Во враппере переопределяешь getOverrideList, возвращаешь экземпляр SpadeOverrideList
В SpadeOverrideList переопределяешь handleItemState
возвращаешь SpadeFinalisedModel с параметрами конструктора​
originalModel = originalModel из параметров метода,​
empty = false, если нбт пуст, и true иначе​
В SpadeFinalisedModel переопределяешь getQuads.
Если в конструктор передавался empty=true, то возвращаешь originalModel.getQuads
Иначе создаешь список квадов,
добавляешь в него все че вернет originalModel.getQuads
добавляешь свои какие-то квады(можно взять из другой модели​
возвращаешь это список​
Например, так можно получить экземпляр модели предмета​
Java:
private static IBakedModel model = mc().getRenderItem()
    .getItemModelWithOverrides(new ItemStack(<item>), world, null);


Потом это все еще можно оптимизировать, чтобы по-меньше аллокаций было

 
5,018
47
783
И чем это все отличается от обычной json модельки с оверрайдами, как компас, в таком случае?)
Спасибо большое конечно за совет, но мне хочется со своей разобраться, а не заново все переделывать.

Так, я аутист. Я просто дубликат классов умудрился сделать и правил класс который вообще не вызывался. Нда. Ну короче вроде сделал, handleItemState работает, но новая модель почему то не сетается все равно. Лишнее убрал оставил лишь так:
Но новая модель не возвращается! Точней возвращается, но визуально почему то ничего не меняется вообще...
Java:
    static class ItemOverrideListShovel extends ItemOverrideList {
        static ItemOverrideListShovel INSTANCE = new ItemOverrideListShovel(new ArrayList<>());


        public ItemOverrideListShovel(List<ItemOverride> overridesIn) {
            super(overridesIn);
        }
        IBakedModel itemModel;
        @Override
        public IBakedModel handleItemState(IBakedModel originalModel, ItemStack stack, World world, EntityLivingBase entity) {

            if (originalModel instanceof ModelBakedShovel == false)
                return originalModel;

            ModelBakedShovel original = (ModelBakedShovel) originalModel;

            final NBTTagCompound nbt = stack.getTagCompound();

            if (nbt == null) {
          
                return originalModel;
            }
          
            if (!stack.isEmpty() && nbt != null) {
                final String blockName = nbt.getString("blockName");
                final Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(blockName));
                if (nbt.getSize() == 1) {
                  
              
                    TextureAtlasSprite sprite = original.textureAtlasSprite;
                    System.out.println("d2d " + block + " " + nbt.getSize());

                    itemModel = new ModelBakedShovelFull(original.quads, original.textureAtlasSprite, original.format, original.state);
                    return itemModel;
                } else {
              
                }
            }
            return originalModel;
        }
    }
}

Короче сделал, модель меняется, но текстура - нет!
 
3,005
192
592
final String blockName = nbt.getString("blockName");
final Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(blockName));
if (nbt.getSize() == 1) {


TextureAtlasSprite sprite = original.textureAtlasSprite;
System.out.println("d2d " + block + " " + nbt.getSize());

itemModel = new ModelBakedShovelFull(original.quads, original.textureAtlasSprite, original.format, original.state);
return itemModel;
}

Ну, ты взял blockName.
Достал block.
А ДАЛЬШЕ ЧТО ТЫ С НИМ ДЕЛАЕШЬ?! А НИЧЕГО НЕ ДЕЛАЕШЬ, ТЫ БЕРЕШЬ ВСЕ АРГУМЕНТЫ ИЗ ОРИГИНАЛА И ВСЕ, ГДЕ ЛОГИКА?!
(По поводу логики можно не отвечать, это уже было отвечено)

А, еще. Вроде этот метод вызывается каждый тик, нет? Каждый раз делать новый объект, когда никококо не изменилось - тоже логично.
 
Последнее редактирование модератором:
5,018
47
783
А ДАЛЬШЕ ЧТО ТЫ С НИМ ДЕЛАЕШЬ?! А НИЧЕГО НЕ ДЕЛАЕШЬ, ТЫ БЕРЕШЬ ВСЕ АРГУМЕНТЫ ИЗ ОРИГИНАЛА И ВСЕ, ГДЕ ЛОГИКА?!
А откуда мне еще аргументы брать? Новой то модели еще нет. Вручную задавать? Вручную не получается, нельзя.
 
Последнее редактирование:
3,005
192
592
7,099
324
1,510
И чем это все отличается от обычной json модельки с оверрайдами, как компас, в таком случае?)
Тем что у компаса модель не зависит от нбт и она не формируется динамически
 
5,018
47
783
Ну не формируется, но изменяется. У меня аналогично - есть готовая модель, ее надо просто подсунуть. Но я не понимаю как это сделать. Если ей как аргументы прописывать от оригинал модели, то тогда получается и смысла нету. Я попробовал вручную сделать ресурслокейшены, сделать атласспрайт, вснунуть туда, зарегать. Один хер крашится все...(

Ты их взял, так.
А что дальше ты с ними делаешь? Целых ничего?
А что я могу с ними сделать? У меня нету второй модели, из которой я могу взять аргументы. Какой то замкнутый круг получается - чтобы вернуть модель с нужными мне параметрами, мне нужен объект этой модели...

Если я пытаюсь насильно свою текстуру подсунуть, он крашится.


Java:
    @Override
        public IBakedModel handleItemState(IBakedModel originalModel, ItemStack stack, World world, EntityLivingBase entity) {
             ResourceLocation isFulling = new ResourceLocation("realism:items/shovel/full_shovel");
             ResourceLocation shovel = new ResourceLocation("realism:items/shovel/bronze_shovel");
             ComplexTexture newText  = new ComplexTexture(shovel, isFulling);
            if (originalModel instanceof ModelBakedShovel == false)
                return originalModel;

            ModelBakedShovel original = (ModelBakedShovel) originalModel;

            final NBTTagCompound nbt = stack.getTagCompound();

            if (nbt == null) {
            
                return originalModel;
            }
            
            if (!stack.isEmpty() && nbt != null) {
                final String blockName = nbt.getString("blockName");
                final Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(blockName));
                if (nbt.getSize() == 1) {
                    
                    ModelBaker baker = ModelBaker.INSTANCE;
            
            
    
                
                    itemModel = new ModelBakedShovelFull(original.quads, newText, original.format, original.state);
                    return itemModel;
                } else {
                    return originalModel;
                }




            }
            return originalModel;
        }
    }
 
3,005
192
592
5,018
47
783
На предыдущей странице уже все скинул. Кроме handleItemState ниче особо не менял...
А его уже скинул
 
7,099
324
1,510
Ну не формируется, но изменяется. У меня аналогично - есть готовая модель, ее надо просто подсунуть. Но я не понимаю как это сделать. Если ей как аргументы прописывать от оригинал модели, то тогда получается и смысла нету. Я попробовал вручную сделать ресурслокейшены, сделать атласспрайт, вснунуть туда, зарегать. Один хер крашится все...(
Выше уже описал, как сделать то, что тебе нужно. Хватит мять этот говнокод, выброси его и начни писать заново. А если жалко выбрасывать - закоммить и потом удали(тыж юзаешь гит?)
 
5,018
47
783
Нет, гит не юзаю, зачем он мне нужен если я могу просто java файлы в папку отложить?)
 
5,018
47
783
Ладно, короче понятно. Я то твое сообщение пометил, мб когда нить в будущем вернусь. В принципе, я хотел это сделать чисто для красоты, но раз уж по быстрому никак лучше отложить эту хрень пока.
 
3,005
192
592
Сверху