ItemOverride

Версия Minecraft
1.12.2
5,149
49
899
Здравствуйте. Делаю наконец себе модельки как нормальный человек, но что-то до сих пор не могу разобраться, как работают эти оверрайды. Если коротко, моя задача состоит в том, чтобы при определенном значении демейджа моя моделька заменилась на другую
Но я никак не могу понять, как мне получить(создать) эту новую модель и вернуть тут.
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;
        }
    }
 
Дебаг в области handleItemState что показал?
 
дело все в том, что я абсолютно в растерянности. Я даже и не знаю, что вообще дебажить то надо, если я просто объект модели новый создать не могу.
 
ModelBakedPickaxeDest а что там внутри?
Если не можешь сходу создать свою модель кодом, то попробуй сделать нужную модель в json, получить ее BakedModel инстанс по ModelResourceLocation во время ModelBakeEvent(или позже) и юзать эту модель
 
Я могу сделать свою модель кодом. Я не понял как работать с оверрайдами
 
Тебе и не нужны никакие итемоверрайды.
Просто конструируй новую модельку на основе старой
Я когда-то очень давно делал пример в теме с туториалом
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;
    }
}
 
Я его видел, там то у тебя блок. А через твой моделбейкер для предмета нет ничего похожего
 
Чего то так и не понял, по всякому извратился. В итоге я чет совсем запутался не понимаю че дальше делать: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
 
Дык а где код подмены то? Модель ведь это просто модель?
Где то в другом месте, через хук или ещё как, ты должен заменять один предмет на другой (если я правильно понимаю логику).
А ещё лучше рендерить модель самому и менять только текстуру перед началом отрисовки. (попытку вижу)
Нужно больше информации
ca13434cb05c200110a9bdfa49f86f2e.jpg
 
Последнее редактирование:
Дык а где код подмены то? Модель ведь это просто модель?
Где то в другом месте, через хук или ещё как, ты должен заменять один предмет на другой (если я правильно понимаю логику).
А ещё лучше рендерить модель самому и менять только текстуру перед началом отрисовки.
Нужно больше информации
ca13434cb05c200110a9bdfa49f86f2e.jpg
Чего?) Прежде чем отвечать, посмотри хотя бы как это все делается, а не городи от души, пожалуйста. Предмет у меня один, меняется только модель. Инфа тут вся, я полагаю, чего еще надо?

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

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

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

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

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