Доставание блока через EnumType

5,018
47
783
В общем, я решил красивенько себе все оформить. Мое дерево, оно состоит из нескольких блоков, каждый из которых является объектом одного класса. Для того чтобы не плодить классы, я решил сделать EnumTreeType. Вроде сделал, хорошо, все блоки расквартировал по категориям. Но конечно, я подумал что если вдруг захочу поюзать блок листвы или дерева, то его надо будет достать из этого самого типа. В общем, в данном енуме методы, должные возвращать блок, возвращают нулл. Причем, как показывает дебаг, это происходит на уровне еще только инициализации блоков. То есть казалось бы, нужно из енумов взять аргументы, присвоить их глобальным переменным и затем через эти глобальные переменные получать нужные блоки для каждого типа. Честно говоря, не понимаю, почему :unsure:
Java:
public enum EnumTreeType  {

    ASH(BlocksList.REAL_ASH,BlocksList.REAL_TB_ASH, BlocksList.REAL_ASH_BRANCH,BlocksList.REAL_ASH_LEAVES,0),
    OAK(BlocksList.REAL_OAK,BlocksList.REAL_TB_OAK, BlocksList.REAL_OAK_BRANCH,BlocksList.REAL_OAK_LEAVES,1),
    BIRCH(BlocksList.REAL_BIRCH,BlocksList.REAL_TB_BIRCH, BlocksList.REAL_BIRCH_BRANCH,BlocksList.REAL_BIRCH_LEAVES,2),
    LINDEN(BlocksList.REAL_LINDEN,BlocksList.REAL_TB_LINDEN, BlocksList.REAL_LINDEN_BRANCH,BlocksList.REAL_LINDEN_LEAVES,3),
    PINE(BlocksList.REAL_PINE,BlocksList.REAL_TB_PINE, BlocksList.REAL_PINE_BRANCH,BlocksList.REAL_PINE_LEAVES,4),
    SPRUCE(BlocksList.REAL_SPRUCE,BlocksList.REAL_TB_SPRUCE, BlocksList.REAL_SPRUCE_BRANCH,BlocksList.REAL_SPRUCE_LEAVES,5),
    POPLAR(BlocksList.REAL_POPLAR,BlocksList.REAL_TB_POPLAR, BlocksList.REAL_POPLAR_BRANCH,BlocksList.REAL_POPLAR_LEAVES,6),
    PEAR(BlocksList.REAL_PEAR,BlocksList.REAL_TB_PEAR, BlocksList.REAL_LINDEN_BRANCH,BlocksList.REAL_LINDEN_LEAVES,7),
    LARCH(BlocksList.REAL_LARCH,BlocksList.REAL_TB_LARCH, BlocksList.REAL_LARCH_BRANCH,BlocksList.REAL_LARCH_LEAVES,8);


    Block trunk;
    Block tb;
    Block branch;
    Block leaves;
    int id;
    private static final EnumTreeType[] ENUMLOOKUP = new EnumTreeType[values().length];
    private EnumTreeType(Block trunk, Block thickbranch, Block branch, Block leaves, int id) {
        this.id = id;
        this.trunk = trunk;
        this.tb = thickbranch;
        this.branch = branch;
        this.leaves = leaves;
    }
    public Block getTrunkFromType() {
  
        return ENUMLOOKUP[id].trunk;
    }
    public Block getThickBranchFromType() {
        return ENUMLOOKUP[id].tb;
    }
    public Block getBranchFromType() {
        return ENUMLOOKUP[id].branch;
    }
    public Block getLeavesFromType() {
        return ENUMLOOKUP[id].leaves;
    }
    static
    {
        for (EnumTreeType tt : values())
        {
            ENUMLOOKUP[tt.id] = tt;
        }
    }
}
Есть мысли?
 
Последнее редактирование:
5,018
47
783
Енум у меня инициализируется прямо вместе с блоком, через конструктор. Может в этом дело?
public static final Block REAL_ASH_BRANCH = new BlockTreeNewBranch(Material.WOOD, "tree/real_ash_branch", 0, 0, SoundType.WOOD, Realism.tabTrees, EnumTreeType.ASH);
Блоки в момент инициализации действительно нулл... но как мне еще объединить в группы блоки, если у меня блоки - это лишь объекты одного класса?
 
Последнее редактирование:
5,018
47
783
Заменил на поля. Все регистрации по струночке поставил.
Попробовал через сеттеры сделать. Все равно нулл(

Java:
    @Override
    public EnumTreeType getType() {
        return type;
    }
    @Override
    public Block setType(EnumTreeType type) {
        this.type = type;
        return this;
    }
 
5,018
47
783
Короче так ничего и не придумав, наплодил классов. Видимо, невозможно сделать это, одновременно регая блок и енум для него
 
5,018
47
783
Ситуация следующим образом выглядит, как я понял. ЕнумТип сетается для каждого блока. К примеру, первым попадается по списке блок ствола ясеня. Он инициализирует блок ясеня и его аргументы. В его аргументах встречается EnumTreeType, который содержит какие то в себе данные. Он лезет по этому енумтипу(ASH) в EnumTreeType и при инициализации его конструктора начинает получать аргументы, среди которых появляется ветка, до которой очередь еще не дошла и она еще null, листва, аналогично, тонкая ветка и так далее.
Замкнутый круг, который можно отложить, только если инициализировать как то этот енум вручную, потом, после всех блоков, но для всех этих блоков, хе-хе. Но я мало работал со всякими ForgeRegistryEntry, и глянув немного тот код, решил, что это сделать как то не очень то просто. В итоге, просто сделал на переменных все.
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Класс инициализируется всего один раз при загрузке, соответственно все статические поля тоже. Поля в энуме статические.
Дальше объяснять надо?
Ты один раз где-то дергаешь энум и у тебя сразу он "заполняется", а так как блоки еще нулл, он сразу заполнил нуллами и все.
 
Сверху