ItemOverride

Версия Minecraft
1.12.2
5,021
47
784
Здравствуйте. Делаю наконец себе модельки как нормальный человек, но что-то до сих пор не могу разобраться, как работают эти оверрайды. Если коротко, моя задача состоит в том, чтобы при определенном значении демейджа моя моделька заменилась на другую
Но я никак не могу понять, как мне получить(создать) эту новую модель и вернуть тут.
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;
        }
    }
 
7,099
324
1,510
Дебаг в области handleItemState что показал?
 
5,021
47
784
дело все в том, что я абсолютно в растерянности. Я даже и не знаю, что вообще дебажить то надо, если я просто объект модели новый создать не могу.
 
7,099
324
1,510
ModelBakedPickaxeDest а что там внутри?
Если не можешь сходу создать свою модель кодом, то попробуй сделать нужную модель в json, получить ее BakedModel инстанс по ModelResourceLocation во время ModelBakeEvent(или позже) и юзать эту модель
 
5,021
47
784
Я могу сделать свою модель кодом. Я не понял как работать с оверрайдами
 
Тебе и не нужны никакие итемоверрайды.
Просто конструируй новую модельку на основе старой
Я когда-то очень давно делал пример в теме с туториалом
Java:
class ItemOverrideListBlock extends ItemOverrideList{
    public static ItemOverrideListBlock INSTANCE = new ItemOverrideListBlock(new ArrayList<>());
    IBakedModel itemModel;

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

    @Override
    public IBakedModel handleItemState(IBakedModel originalModel, ItemStack stack, World world, EntityLivingBase entity) {
        if(itemModel != null) return  itemModel;
        if(originalModel instanceof BlockBakedModel == false) return originalModel;
        BlockBakedModel original = (BlockBakedModel) originalModel;
        ModelBaker baker = ModelBaker.INSTANCE;
        baker.begin(original.state, original.format);
        TextureAtlasSprite sprite = original.textureParticle;
        baker.setTexture(sprite);
        //Делаем модельку в 2 раза меньше оригинальной
        baker.putTexturedCube(0, 0, 0, 0.25f);
        itemModel = new BlockBakedModel(baker.bake(), original.textureParticle, original.format, original.state);
        return itemModel;
    }
}
 
5,021
47
784
Я его видел, там то у тебя блок. А через твой моделбейкер для предмета нет ничего похожего
 
5,021
47
784
Чего то так и не понял, по всякому извратился. В итоге я чет совсем запутался не понимаю че дальше делать:cry:

Имею:
Неиспеченную модель лопаты
Java:
public class ModelShovel implements IModel {
    final ResourceLocation texture;

    public ModelShovel(ResourceLocation texture){
        this.texture = texture;
    }

    @Override
    public Collection<ResourceLocation> getTextures() {
        return Lists.newArrayList(texture);
    }

    @Override
    public IBakedModel bake(IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) {
        TextureAtlasSprite textureAtlasSprite = bakedTextureGetter.apply(texture);
        ImmutableList<BakedQuad> quads = ItemLayerModel.getQuadsForSprite(0, textureAtlasSprite, format, state.apply(Optional.empty()));
        return new ModelBakedShovel(quads, textureAtlasSprite, format, state);
    }
}
Неиспеченную модель лопаты, на которую накладывается комплексная текстура(текстура лопаты+ поверх еще текстурка типо она в земле)

Java:
public class ModelShovelFull implements IModel {
    final ResourceLocation texture;

     public static ResourceLocation isFulling = new ResourceLocation("realism:items/shovel/full_shovel");
      ComplexTexture isFull;
      
    public ModelShovelFull(ResourceLocation texture){
        this.texture = texture;
        isFull = new ComplexTexture(texture, isFulling);
        TextureHandler.registerTexture(isFull);
    }

    @Override
    public Collection<ResourceLocation> getTextures() {
        return Lists.newArrayList(texture);
    }

    @Override
    public IBakedModel bake(IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) {
        TextureAtlasSprite textureAtlasSprite = bakedTextureGetter.apply(isFulling);
        ImmutableList<BakedQuad> quads = ItemLayerModel.getQuadsForSprite(0, textureAtlasSprite, format, state.apply(Optional.empty()));
        return new ModelBakedShovelFull(quads, textureAtlasSprite, format, state);
    }
}
Испеченную модель лопаты пустой, где в handleItemState гипотетически должно происходить изменение на испеченную модель лопаты с новой текстуркой от ModelShovelFull, но этот метод даже не вызывается:
Java:
public class ModelBakedShovel implements IBakedModel {
    List<BakedQuad> quads;
    TextureAtlasSprite textureAtlasSprite;
    VertexFormat format;
    IModelState state;
    
    public ModelBakedShovel(List<BakedQuad> quads, TextureAtlasSprite textureAtlasSprite2, VertexFormat format, IModelState state) {
        this.quads = quads;
        this.textureAtlasSprite = textureAtlasSprite2;
        this.format = format;
        this.state = state;
    }

    @Override
    public ItemCameraTransforms getItemCameraTransforms() {
        ItemTransformVec3f entity = new ItemTransformVec3f(new Vector3f(0f, 0, 0), new Vector3f(0.005f, 0.15f, 0.04f),
                new Vector3f(0.55f, 0.55f, 0.55f));
        ItemTransformVec3f thirdPersonRight = new ItemTransformVec3f(new Vector3f(60f, -90, -160),
                new Vector3f(0.005f, 0.05f, 0.04f), new Vector3f(0.55f, 0.55f, 0.55f));
        ItemTransformVec3f thirdPersonLeft = new ItemTransformVec3f(new Vector3f(100f, -90, 150),
                new Vector3f(0.005f, 0.05f, 0.04f), new Vector3f(0.55f, 0.55f, 0.55f));
        ItemTransformVec3f firstPersonRight = new ItemTransformVec3f(new Vector3f(-60, -90, 25),
                new Vector3f(0.03f, 0.23f, 0.104f), new Vector3f(0.68f, 0.68f, 0.68f));
        ItemTransformVec3f firstPersonLeft = new ItemTransformVec3f(new Vector3f(20, -90, 25),
                new Vector3f(0.03f, 0.23f, 0.104f), new Vector3f(0.68f, 0.68f, 0.68f));
        ItemCameraTransforms itemCameraTransforms = new ItemCameraTransforms(thirdPersonLeft, thirdPersonRight,
                firstPersonLeft, firstPersonRight, ItemTransformVec3f.DEFAULT, ItemTransformVec3f.DEFAULT, entity,
                ItemTransformVec3f.DEFAULT);
        return itemCameraTransforms;
    }

    @Override
    public List<BakedQuad> getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) {
        return quads;
    }

    @Override
    public boolean isAmbientOcclusion() {
        return false;
    }

    @Override
    public boolean isGui3d() {
        return false;
    }

    @Override
    public boolean isBuiltInRenderer() {
        return false;
    }

    @Override
    public TextureAtlasSprite getParticleTexture() {
        return textureAtlasSprite;
    }

    @Override
    public ItemOverrideList getOverrides() {
        return ItemOverrideListShovel.INSTANCE;
    }

    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;
            
            ModelBakedShovelFull original = (ModelBakedShovelFull) originalModel;

            final NBTTagCompound nbt = stack.getTagCompound();

            if (nbt == null)
                return originalModel;
            if (!stack.isEmpty() && nbt != null && nbt.hasKey("blockName")) {
                final String blockName = nbt.getString("blockName");
                final Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(blockName));
                if (block != null) {
                    
                    System.out.println("dd");
                        ModelBaker baker = ModelBaker.INSTANCE;
                        baker.begin(original.state, original.format);
                        TextureAtlasSprite sprite = original.textureAtlasSprite;
                        baker.setTexture(sprite);
            
                        itemModel = new ModelBakedShovelFull(baker.bake(), original.textureAtlasSprite, original.format, original.state);
                        return itemModel;
                    
                }
        }
            return originalModel;
    }
    }
}
Испеченную модель лопаты с землей, где должно происходить изменение на пустую лопату если нбт ноль, но это тоже ничего не работает:
Java:
public class ModelBakedShovelFull implements IBakedModel {
    List<BakedQuad> quads;

    TextureAtlasSprite textureAtlasSprite;
    VertexFormat format;
    IModelState state;

    public ModelBakedShovelFull(List<BakedQuad> quads, TextureAtlasSprite textureAtlasSprite2, VertexFormat format, IModelState state) {
        this.quads = quads;
        this.textureAtlasSprite = textureAtlasSprite2;
        this.format = format;
        this.state = state;
    }

    @Override
    public ItemCameraTransforms getItemCameraTransforms() {
        ItemTransformVec3f entity = new ItemTransformVec3f(new Vector3f(0f, 0, 0), new Vector3f(0.005f, 0.15f, 0.04f),
                new Vector3f(0.55f, 0.55f, 0.55f));
        ItemTransformVec3f thirdPersonRight = new ItemTransformVec3f(new Vector3f(60f, -90, -160),
                new Vector3f(0.005f, 0.05f, 0.04f), new Vector3f(0.55f, 0.55f, 0.55f));
        ItemTransformVec3f thirdPersonLeft = new ItemTransformVec3f(new Vector3f(100f, -90, 150),
                new Vector3f(0.005f, 0.05f, 0.04f), new Vector3f(0.55f, 0.55f, 0.55f));
        ItemTransformVec3f firstPersonRight = new ItemTransformVec3f(new Vector3f(-60, -90, 25),
                new Vector3f(0.03f, 0.23f, 0.104f), new Vector3f(0.68f, 0.68f, 0.68f));
        ItemTransformVec3f firstPersonLeft = new ItemTransformVec3f(new Vector3f(20, -90, 25),
                new Vector3f(0.03f, 0.23f, 0.104f), new Vector3f(0.68f, 0.68f, 0.68f));
        ItemCameraTransforms itemCameraTransforms = new ItemCameraTransforms(thirdPersonLeft, thirdPersonRight,
                firstPersonLeft, firstPersonRight, ItemTransformVec3f.DEFAULT, ItemTransformVec3f.DEFAULT, entity,
                ItemTransformVec3f.DEFAULT);
        return itemCameraTransforms;
    }

    @Override
    public List<BakedQuad> getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) {
        return quads;
    }

    @Override
    public boolean isAmbientOcclusion() {
        return false;
    }

    @Override
    public boolean isGui3d() {
        return false;
    }

    @Override
    public boolean isBuiltInRenderer() {
        return false;
    }

    @Override
    public TextureAtlasSprite getParticleTexture() {
        return textureAtlasSprite;
    }

    @Override
    public ItemOverrideList getOverrides() {
        return ItemOverrideListShovel.INSTANCE;
    }

    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) {

            ModelBaker baker = ModelBaker.INSTANCE;
            baker.begin(original.state, original.format);
            TextureAtlasSprite sprite = original.textureAtlasSprite;
            baker.setTexture(sprite);

            itemModel = new ModelBakedShovel(baker.bake(), original.textureAtlasSprite, original.format, original.state);
            return itemModel;

            }
            return originalModel;
        }
    }
}

Модели загружаю так:
Java:
public class RModelLoader implements ICustomModelLoader {

    @Override
    public void onResourceManagerReload(IResourceManager resourceManager) {
        // TODO: Resource reload on Minecraft reloads
        
    }

    @Override
    public boolean accepts(ResourceLocation modelLocation) {
         if(modelLocation.toString().contains("stone_shovel"))
             return modelLocation.toString().contains("stone_shovel");
         else if(modelLocation.toString().contains("copper_shovel"))
             return modelLocation.toString().contains("copper_shovel");
         else if(modelLocation.toString().contains("bronze_shovel"))
             return modelLocation.toString().contains("bronze_shovel");
         else if(modelLocation.toString().contains("iron_shovel"))
             return modelLocation.toString().contains("iron_shovel");
         else if(modelLocation.toString().contains("steel_shovel"))
             return modelLocation.toString().contains("steel_shovel");
         else if(modelLocation.toString().contains("arm_steels_shovel"))
             return modelLocation.toString().contains("arm_steels_shovel");
        
         else
             return false;
    }

    @Override
    public IModel loadModel(ResourceLocation modelLocation) throws Exception {
         if(modelLocation.toString().contains("stone_shovel"))
                return new ModelShovel(new ResourceLocation("realism:items/shovel/stone_shovel"));
         if(modelLocation.toString().contains("copper_shovel"))
                return new ModelShovel(new ResourceLocation("realism:items/shovel/copper_shovel"));
         if(modelLocation.toString().contains("bronze_shovel"))
                return new ModelShovel(new ResourceLocation("realism:items/shovel/bronze_shovel"));
         if(modelLocation.toString().contains("iron_shovel"))
                return new ModelShovel(new ResourceLocation("realism:items/shovel/iron_shovel"));
         if(modelLocation.toString().contains("steel_shovel"))
                return new ModelShovel(new ResourceLocation("realism:items/shovel/steel_shovel"));
         if(modelLocation.toString().contains("arm_steels_shovel"))
                return new ModelShovel(new ResourceLocation("realism:items/shovel/arm_steels_shovel"));
        
         if(modelLocation.toString().contains("stone_shovel"))
                return new ModelShovelFull(new ResourceLocation("realism:items/shovel/full_shovel"));
        return null;
    }

}

Памагити
39b97e758b7edcc5474235b913974554.jpg
 
1,038
57
229
Дык а где код подмены то? Модель ведь это просто модель?
Где то в другом месте, через хук или ещё как, ты должен заменять один предмет на другой (если я правильно понимаю логику).
А ещё лучше рендерить модель самому и менять только текстуру перед началом отрисовки. (попытку вижу)
Нужно больше информации
ca13434cb05c200110a9bdfa49f86f2e.jpg
 
Последнее редактирование:
5,021
47
784
Дык а где код подмены то? Модель ведь это просто модель?
Где то в другом месте, через хук или ещё как, ты должен заменять один предмет на другой (если я правильно понимаю логику).
А ещё лучше рендерить модель самому и менять только текстуру перед началом отрисовки.
Нужно больше информации
ca13434cb05c200110a9bdfa49f86f2e.jpg
Чего?) Прежде чем отвечать, посмотри хотя бы как это все делается, а не городи от души, пожалуйста. Предмет у меня один, меняется только модель. Инфа тут вся, я полагаю, чего еще надо?

А ещё лучше рендерить модель самому и менять только текстуру перед началом отрисовки.
Фактически я и рендерю ее сам, какбэ

Призываю гуру @implicit и @hohserg1 !
 
1,038
57
229
Испеченную модель лопаты пустой, где в handleItemState гипотетически должно происходить изменение на испеченную модель лопаты с новой текстуркой от ModelShovelFull, но этот метод даже не вызывается:
Как проверял? Раз он даже не вызывается, значит ты не правильно его написал или поставил не те параметры.

Испеченную модель лопаты с землей, где должно происходить изменение на пустую лопату если нбт ноль, но это тоже ничего не работает
Который не работает? Как проверял?

ой... матюгаться то зачем, ладно пойду))
 
5,021
47
784
Не понял:unsure:
Всмысле только на оригиналМодель?
В handleItemState в зависимости от нбт возвращай ту или иную модель
так вроде так и делаю, а оно не работает, вот я и пришел сюда
 
7,099
324
1,510
Вот поэтому я и не люблю 1.8+, чтобы сделать простой таск с моделями нужно генерировать тонны коды, который еще и фиг разберешься как работает...
Это Максик генерит тонну)

к этому же итему привязать еще вторую модель
Они должны быть одновременно видны или в разыне моменты в зависимости от стака?
 
Сверху