[1.10.2, может быть и ниже]Не удаётся создать блок с метой

Статус
В этой теме нельзя размещать новые ответы.

Крокодил

Железная лига
Сообщения
618
Лучшие ответы
11
Симпатии
119
#1
На самом деле, если у кого-то есть советы на более низкие версии, всё равно посоветуёте:).
Всем доброго времени суток):)
Вчера разбирался с метой, и всё вроде шло хорошо... В качестве примера брал sandstone, eclipse не ругался. А потом я запустил игру, и увидел в инвентаре три одинаковых блока, полностью идентичных, даже если нажать F3 + H. Что я делаю не так:ermm:?.. Код я вроде как и понял, но, как бы это сказать... частями. То-есть я могу сказать что делает та или иная часть кода, но как они работают вместе, понять не могу.
Объясните "умному" человеку, что да как!
Спасибо!
Блок:

Код:
public class Test extends Block {
    
    public static final PropertyEnum<Test.EnumType> TYPE = PropertyEnum.<Test.EnumType>create("type", Test.EnumType.class);
    
    public Test() {
        super(Material.ROCK);    
        setDefaultState(this.blockState.getBaseState().withProperty(TYPE, Test.EnumType.DEFAULT));
        setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
        setRegistryName("test");
        GameRegistry.register(this);
        GameRegistry.register(new ItemBlock(this), this.getRegistryName());
        setUnlocalizedName(Reference.MODID + ":" + "test");
    }

    public int damageDropped(IBlockState state) {
        return ((Test.EnumType)state.getValue(TYPE)).getMetadata();
    }
    
    @SideOnly(Side.CLIENT)
    public void getSubBlocks(Item item, CreativeTabs tab, List<ItemStack> list) {
        for (Test.EnumType test$enumtype : Test.EnumType.values()) {
            list.add(new ItemStack(item, 1, test$enumtype.getMetadata()));
        }
    }

    public MapColor getMapColor(IBlockState state) {
        return MapColor.SAND;
    }

    public IBlockState getStateFromMeta(int meta) {
        return this.getDefaultState().withProperty(TYPE, Test.EnumType.byMetadata(meta));
    }

    public int getMetaFromState(IBlockState state) {
        return ((Test.EnumType)state.getValue(TYPE)).getMetadata();
    }

    protected BlockStateContainer createBlockState() {
        return new BlockStateContainer(this, new IProperty[] {TYPE});
    }
    
    public static enum EnumType implements IStringSerializable {
        DEFAULT(0, "test", "default"),
        CHISELED(1, "one_test", "one"),
        SMOOTH(2, "four_test", "four");

        private static final Test.EnumType[] META_LOOKUP = new Test.EnumType[values().length];
        private final int metadata;
        private final String name;
        private final String unlocalizedName;

        private EnumType(int meta, String name, String unlocalizedName) {
            this.metadata = meta;
            this.name = name;
            this.unlocalizedName = unlocalizedName;
        }

        public int getMetadata() {
            return this.metadata;
        }

        public String toString() {
            return name;
        }

        public static Test.EnumType byMetadata(int meta) {
            if (meta < 0 || meta >= META_LOOKUP.length) {
                meta = 0;
            }

            return META_LOOKUP[meta];
        }

        public String getName() {
            return this.name;
        }

        public String getUnlocalizedName() {
            return this.unlocalizedName;
        }

        static {
            for (Test.EnumType test$enumtype : values()) {
                META_LOOKUP[test$enumtype.getMetadata()] = test$enumtype;
            }
        }
    }
}
 Регистратор блоков:
Код:
public class RegistryBlock {

    public static Block Test = new Test();
    
    @Nullable
    private static Block getRegisteredBlock(Block block) {
        GameRegistry.register(block);
        return block;
    }
    public static void initBlocks() {
        getRegisteredBlock(Test);
    }
}
[merge_posts_bbcode]Добавлено: 26.07.2016 20:58:06[/merge_posts_bbcode]

Кстати, регистратор блоков зареган в commonProxy, а commonProxy в главном классе. Так что здесь всё норм. Под словом "идентичных" я имел в виду одинаковых, без текстуры

[merge_posts_bbcode]Добавлено: 26.07.2016 21:09:43[/merge_posts_bbcode]

Может быть это и не нужно, но всё же:
registerRender
Код:
public class RSBlockRender {
    
    public static void registerBlockRender() {
        regBlock(RegistryBlock.Test, 0);
        regBlock(RegistryBlock.Test, 1);
        regBlock(RegistryBlock.Test, 2);
    }
    
    public static void regBlock(Block block, int meta) {
        
        Minecraft.getMinecraft().getRenderItem().getItemModelMesher()
        .register(Item.getItemFromBlock(block), meta, new ModelResourceLocation
        (block.getRegistryName(), "inventory"));
    }
}
 

timaxa007

Команда форума
Сообщения
5,475
Лучшие ответы
355
Симпатии
502
#2
Регистрируешь в классе Test и в классе RegistryBlock.
И я думаю:
Место new ItemBlock(this) в конструкторе, используй другой с родителем ItemBlock, но связанной с метадата.
 

Крокодил

Железная лига
Сообщения
618
Лучшие ответы
11
Симпатии
119
#3
timaxa007 написал(а):
Регистрируешь в классе Test и в классе RegistryBlock.
И я думаю:
Место new ItemBlock(this) в конструкторе, используй другой с родителем ItemBlock, но связанной с метадата.
Я немного не понял, объясни, плиз.
 

timaxa007

Команда форума
Сообщения
5,475
Лучшие ответы
355
Симпатии
502
#4
Крокодил написал(а):
Код:
    @Nullable
    private static Block getRegisteredBlock(Block block) {
        GameRegistry.register(block);
        return block;
    }
Крокодил написал(а):
Код:
    public Test() {
        super(Material.ROCK);    
        setDefaultState(this.blockState.getBaseState().withProperty(TYPE, Test.EnumType.DEFAULT));
        setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
        setRegistryName("test");
        GameRegistry.register(this);
        GameRegistry.register(new ItemBlock(this), this.getRegistryName());
        setUnlocalizedName(Reference.MODID + ":" + "test");
    }
Там и там регистрируется блок, т.е. он может зарегистрироваться дважды.
---
Крокодил написал(а):
Код:
GameRegistry.register(new ItemBlock(this), this.getRegistryName());
Типа:
Код:
GameRegistry.register(new ItemMultiTexture(this, this, String[]), this.getRegistryName());
Где String[], может быть объектом типа этого:
Код:
public static String[] meta = new String[] {
    "1",
    "2",
    "3",
    "4",
    "5",
    "6",
    "7",
    "8",
    "9",
    "10",
    "11",
    "12",
    "13",
    "14",
    "15",
    "16"
};
 

Крокодил

Железная лига
Сообщения
618
Лучшие ответы
11
Симпатии
119
#5
timaxa007, Невероятно, но помогло!
Спасибо!!!
Код:
    public Test() {
        super(Material.ROCK);    
        setDefaultState(this.blockState.getBaseState().withProperty(TYPE, Test.EnumType.DEFAULT));
        setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
        setRegistryName("test");
        GameRegistry.register(new ItemMultiTexture(this, this, meta), this.getRegistryName());
        setUnlocalizedName(Reference.MODID + ":" + "test");
    }
    
    public static String[] meta = new String[] {
        "1",
        "2",
        "3"
    };
registryBlock не менял.
[merge_posts_bbcode]Добавлено: 26.07.2016 21:52:52[/merge_posts_bbcode]

*Как я ненавижу эти спойлеры*
~~~~~~~~~~~~~~~~~~~~~
Собсно теперь другая проблемма - текстур у блоков нету...
Сейчас попробую провести один ужасный эксперимент...
 

Крокодил

Железная лига
Сообщения
618
Лучшие ответы
11
Симпатии
119
#6
Я слишком устал, чтобы злится. Сейчас моё состояние напоминает состояние человека, который просто не знает как реагировать на свой идиотизм. Периодически, мне начинает казаться, что запятые меня ненавидят.... За последний месяц, я впервые ощутил незаменимость eclipse. Потому что он следит за тем чтобы все запятые и фигурные скобки были на месте. Я просто СНОВА забыл поставить запятую.
Я просто хотел поругаться. Поскольку поругаться было не с кем, я решил сообщить все свои мысли форуму))) Говорил же не читать!
Я решил проблему, всё дело оказалось в .json файлах. Всем спасибо, тему можно закрывать.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху