Чёртов MCreator

1,007
36
206
Предлагаю внести в правила такой пункт - "Не создавать в разделе вопросов темы, где фигурирует программы для моддинга(т.е. MCreator и другие, если они есть)"
Думаю, объяснять особо не нужно чем плоха эта программа, до меня уже всё изложили. Я просто хочу сказать, что при наличии гайдов и ответов на популярные вопросы, люди всё равно спрашивают на этом форуме как решить проблему, с которой они бы точно не столкнулись, если бы писали мод сами. И отговаривать таких людей бесполезно, ведь ещё в первом сообщении они говорят, что и слышать не хотят о том, насколько плох тот путь, который они выбрали.
 
Я за. Тема с мкреатором только срач разведет. К тому же на форуме нет людей которые могли бы помочь разобраться с этой программой -> никто не ответит.
 
2,932
44
598
Куда подписывать?
@Гарик​
 
1,159
38
544
Чо вы гоните на креатор. Да, это не труъ, но отличная штука в плане генерации кода.
 
1,200
37
237
Это ещё ничего, есть те, кто пишет код хуже креатора, например, я :eek:k_hand:
 
2,932
44
598
отличная штука в плане генерации кода
Не могу не согласиться...
Java:
import net.minecraftforge.fml.common.registry.ForgeRegistries;
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.common.BiomeManager;
import net.minecraftforge.common.BiomeDictionary;

import net.minecraft.world.gen.feature.WorldGenAbstractTree;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.World;
import net.minecraft.util.math.BlockPos;
import net.minecraft.item.ItemStack;
import net.minecraft.init.Blocks;
import net.minecraft.block.state.IBlockState;
import net.minecraft.block.Block;

import java.util.Random;

public class mcreator_au {

    static Biome.BiomeProperties customProps = null;
    public static BiomeGenau biome = null;

    static {
        customProps = new Biome.BiomeProperties("au");
        customProps.setRainfall(0.5F);
        customProps.setBaseHeight(0.1F);
        customProps.setHeightVariation(0.3F);

        biome = new BiomeGenau(customProps);
    }

    public static Object instance;

    public mcreator_au() {
    }

    public void load(FMLInitializationEvent event) {
        ForgeRegistries.BIOMES.register(biome);
        BiomeDictionary.addTypes(biome, BiomeDictionary.Type.FOREST);
        BiomeManager.addSpawnBiome(biome);
        BiomeManager.addBiome(BiomeManager.BiomeType.WARM, new BiomeManager.BiomeEntry(biome, 10));
    }

    public void generateNether(World world, Random random, int chunkX, int chunkZ) {
    }

    public void generateSurface(World world, Random random, int chunkX, int chunkZ) {
    }

    public void registerRenderers() {
    }

    public int addFuel(ItemStack fuel) {
        return 0;
    }

    public void serverLoad(FMLServerStartingEvent event) {
    }

    public void preInit(FMLPreInitializationEvent event) {
    }

    static class BiomeGenau extends Biome {
        @SuppressWarnings("unchecked")
        public BiomeGenau(Biome.BiomeProperties mycustomProps) {
            super(mycustomProps);
            setRegistryName("au");
            topBlock = Blocks.FURNACE.getDefaultState();
            fillerBlock = Blocks.LIT_FURNACE.getDefaultState();
            decorator.generateFalls = false;
            decorator.treesPerChunk = 10;
            decorator.flowersPerChunk = 10;
            decorator.grassPerChunk = 10;
            decorator.deadBushPerChunk = 0;
            decorator.mushroomsPerChunk = 0;
            decorator.reedsPerChunk = 0;
            decorator.cactiPerChunk = 0;
            decorator.sandPatchesPerChunk = 0;

        }

        @Override
        public WorldGenAbstractTree getRandomTreeFeature(Random rand) {
            return new Tree();
        }

        class Tree extends WorldGenAbstractTree {
            /** The minimum height of a generated tree. */
            private final int minTreeHeight;

            /** True if this tree should grow Vines. */
            private final boolean vinesGrow;

            /** The metadata value of the wood to use in tree generation. */
            private final int metaWood;

            /** The metadata value of the leaves to use in tree generation. */
            private final int metaLeaves;

            public Tree() {
                super(false);
                this.minTreeHeight = 10;
                this.metaWood = 0;
                this.metaLeaves = 0;
                this.vinesGrow = true;
            }

            public boolean generate(World par1World, Random par2Random, BlockPos pos) {
                int par3 = pos.getX();
                int par4 = pos.getY();
                int par5 = pos.getZ();
                int var6 = par2Random.nextInt(3) + this.minTreeHeight;
                boolean var7 = true;

                if (par4 >= 1 && par4 + var6 + 1 <= 256) {
                    int var8;
                    byte var9;
                    int var11;
                    int var12;

                    for (var8 = par4; var8 <= par4 + 1 + var6; ++var8) {
                        var9 = 1;

                        if (var8 == par4) {
                            var9 = 0;
                        }

                        if (var8 >= par4 + 1 + var6 - 2) {
                            var9 = 2;
                        }

                        for (int var10 = par3 - var9; var10 <= par3 + var9 && var7; ++var10) {
                            for (var11 = par5 - var9; var11 <= par5 + var9 && var7; ++var11) {
                                if (var8 >= 0 && var8 < 256) {
                                    Block var12s = par1World.getBlockState(new BlockPos(var10, var8, var11)).getBlock();
                                    var12 = Block.getIdFromBlock(var12s);

                                    if (var12 != 0 && var12s != Blocks.VINE && var12s != Blocks.FURNACE && var12s != Blocks.LIT_FURNACE
                                            && var12s != Blocks.PURPUR_PILLAR) {
                                        var7 = false;
                                    }
                                } else {
                                    var7 = false;
                                }
                            }
                        }
                    }

                    if (!var7) {
                        return false;
                    } else {
                        Block var8s = par1World.getBlockState(new BlockPos(par3, par4 - 1, par5)).getBlock();
                        var8 = Block.getIdFromBlock(var8s);

                        if ((var8s == Blocks.FURNACE || var8s == Blocks.LIT_FURNACE) && par4 < 256 - var6 - 1) {
                            par1World.setBlockState(new BlockPos(par3, par4 - 1, par5), Blocks.LIT_FURNACE.getDefaultState(), 3);
                            var9 = 3;
                            byte var18 = 0;
                            int var13;
                            int var14;
                            int var15;

                            for (var11 = par4 - var9 + var6; var11 <= par4 + var6; ++var11) {
                                var12 = var11 - (par4 + var6);
                                var13 = var18 + 1 - var12 / 2;

                                for (var14 = par3 - var13; var14 <= par3 + var13; ++var14) {
                                    var15 = var14 - par3;

                                    for (int var16 = par5 - var13; var16 <= par5 + var13; ++var16) {
                                        int var17 = var16 - par5;

                                        if ((Math.abs(var15) != var13 || Math.abs(var17) != var13 || par2Random.nextInt(2) != 0 && var12 != 0)) {
                                            par1World.setBlockState(new BlockPos(var14, var11, var16),
                                                    Blocks.STAINED_HARDENED_CLAY.getDefaultState(), 3);
                                        }
                                    }
                                }
                            }

                            for (var11 = 0; var11 < var6; ++var11) {
                                Block var12s = par1World.getBlockState(new BlockPos(par3, par4 + var11, par5)).getBlock();
                                var12 = Block.getIdFromBlock(var12s);

                                if (var12 == 0 || var12s == Blocks.STAINED_HARDENED_CLAY) {
                                    par1World.setBlockState(new BlockPos(par3, par4 + var11, par5), Blocks.PURPUR_PILLAR.getDefaultState(), 3);

                                    if (this.vinesGrow && var11 > 0) {
                                        if (par2Random.nextInt(3) > 0 && par1World.isAirBlock(new BlockPos(par3 - 1, par4 + var11, par5))) {
                                            par1World.setBlockState(new BlockPos(par3 - 1, par4 + var11, par5), Blocks.VINE.getDefaultState(), 3);
                                        }

                                        if (par2Random.nextInt(3) > 0 && par1World.isAirBlock(new BlockPos(par3 + 1, par4 + var11, par5))) {
                                            par1World.setBlockState(new BlockPos(par3 + 1, par4 + var11, par5), Blocks.VINE.getDefaultState(), 3);
                                        }

                                        if (par2Random.nextInt(3) > 0 && par1World.isAirBlock(new BlockPos(par3, par4 + var11, par5 - 1))) {
                                            par1World.setBlockState(new BlockPos(par3, par4 + var11, par5 - 1), Blocks.VINE.getDefaultState(), 3);
                                        }

                                        if (par2Random.nextInt(3) > 0 && par1World.isAirBlock(new BlockPos(par3, par4 + var11, par5 + 1))) {
                                            par1World.setBlockState(new BlockPos(par3, par4 + var11, par5 + 1), Blocks.VINE.getDefaultState(), 3);
                                        }
                                    }
                                }
                            }

                            if (this.vinesGrow) {
                                for (var11 = par4 - 3 + var6; var11 <= par4 + var6; ++var11) {
                                    var12 = var11 - (par4 + var6);
                                    var13 = 2 - var12 / 2;

                                    for (var14 = par3 - var13; var14 <= par3 + var13; ++var14) {
                                        for (var15 = par5 - var13; var15 <= par5 + var13; ++var15) {
                                            if (par1World.getBlockState(new BlockPos(var14, var11, var15)).getBlock() == Blocks.STAINED_HARDENED_CLAY) {
                                                if (par2Random.nextInt(4) == 0
                                                        && Block.getIdFromBlock(par1World.getBlockState(new BlockPos(var14 - 1, var11, var15))
                                                                .getBlock()) == 0) {
                                                    this.growVines(par1World, var14 - 1, var11, var15, 8);
                                                }

                                                if (par2Random.nextInt(4) == 0
                                                        && Block.getIdFromBlock(par1World.getBlockState(new BlockPos(var14 + 1, var11, var15))
                                                                .getBlock()) == 0) {
                                                    this.growVines(par1World, var14 + 1, var11, var15, 2);
                                                }

                                                if (par2Random.nextInt(4) == 0
                                                        && Block.getIdFromBlock(par1World.getBlockState(new BlockPos(var14, var11, var15 - 1))
                                                                .getBlock()) == 0) {
                                                    this.growVines(par1World, var14, var11, var15 - 1, 1);
                                                }

                                                if (par2Random.nextInt(4) == 0
                                                        && Block.getIdFromBlock(par1World.getBlockState(new BlockPos(var14, var11, var15 + 1))
                                                                .getBlock()) == 0) {
                                                    this.growVines(par1World, var14, var11, var15 + 1, 4);
                                                }
                                            }
                                        }
                                    }
                                }

                                if (par2Random.nextInt(5) == 0 && var6 > 5) {
                                    for (var11 = 0; var11 < 2; ++var11) {
                                        for (var12 = 0; var12 < 4; ++var12) {
                                            if (par2Random.nextInt(4 - var11) == 0) {
                                                var13 = par2Random.nextInt(3);
                                                par1World.setBlockState(new BlockPos(par3, par4 + var6 - 5 + var11, par5),
                                                        Blocks.MELON_BLOCK.getDefaultState(), 3);
                                            }
                                        }
                                    }
                                }
                            }

                            return true;
                        } else {
                            return false;
                        }
                    }
                } else {
                    return false;
                }
            }

            /**
             * Grows vines downward from the given block for a given length.
             * Args: World, x, starty, z, vine-length
             */
            private void growVines(World par1World, int par2, int par3, int par4, int par5) {
                par1World.setBlockState(new BlockPos(par2, par3, par4), Blocks.VINE.getDefaultState(), 3);
                int var6 = 4;

                while (true) {
                    --par3;

                    if (Block.getIdFromBlock(par1World.getBlockState(new BlockPos(par2, par3, par4)).getBlock()) != 0 || var6 <= 0) {
                        return;
                    }

                    par1World.setBlockState(new BlockPos(par2, par3, par4), Blocks.VINE.getDefaultState(), 3);
                    --var6;
                }
            }

            protected boolean canGrowInto(Block blockType) {
                return true;
            }

            public void generateSaplings(World worldIn, Random random, BlockPos pos) {
            }

            /**
             * sets dirt at a specific location if it isn't already dirt
             */
            protected void setDirtAt(World worldIn, BlockPos pos) {
                if (worldIn.getBlockState(pos).getBlock() != Blocks.DIRT) {
                    this.setBlockAndNotifyAdequately(worldIn, pos, Blocks.DIRT.getDefaultState());
                }
            }

            public boolean isReplaceable(World world, BlockPos pos) {
                net.minecraft.block.state.IBlockState state = world.getBlockState(pos);
                return state.getBlock().isAir(state, world, pos) || state.getBlock().isLeaves(state, world, pos)
                        || state.getBlock().isWood(world, pos) || canGrowInto(state.getBlock());
            }

        }

    }

}
 
2,932
44
598
Нет конечно, всё на полном серьёзе! Я же курсивом совершенно случайно написал своё сообщение...
~~~
:m_faceplam:
 
2,932
44
598
Скорее сообщение что бы набрать классы.
 
1,159
38
544
Мне кажется, что как-то несправедливо отсекать софтины для создания модов, коих и так немного. Вынести бы все это в отдельную ветку и все!
 
1,159
38
544
Потому что они только нужны тем, кто не умеет писать код, коих (кто умеет гуглить эти программы и желает что-то делать) мало.
Инфы в сети по модингу достаточно мало, имхо. И бывает удобно сгенерить в креаторе какую-нибудь (работающую!) дич и посмотреть что там сгенерилось. очень познавательно. Я так с биомами делал.
 
1,007
36
206
очень познавательно
Не смеши. Человек, который не знает основ джавы не разберёт нормальный код, а об этом исчадии даже говорить не стоит...(И да, вряд ли люди которые учат/выучили джаву полезут качать креатор)
 
1,159
38
544
Гайдов море, в фордже есть комменты, видосов тоже достаточно, да блин целый форум есть для этого.
Мало мне гайдов и видосов. Хочется работающих примеров. MCcreator помогает в этом.

И да, вряд ли люди которые учат/выучили джаву полезут качать креатор
Я знаю джаву и полез качать креатор. В красную книгу меня.

который не знает основ джавы не разберёт нормальный код
Ну это очевидно. Человек далекий от джавы вообще никакой код на ней не разберет.

Да, я даже mcreator'ский не мог разобрать, когда не кодил ещё.
Это ожидаемо. Как разобрать сгенереный код, когда еще не знаешь программирования?


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

Кроме того, он помогает и тем, кто джаву уже знает (вроде меня). Я уже приводил пример, как креатор помог мне с созданием биома. Сгенерил -> посмотрел код -> переписал на джаве нормально. Получилось гораздо быстрее чем по гайдам. Народ, прошу вас с плеча не рубить и не запрещать создавать тему о креаторе, потому что это несправедливо. Отдельная тема позволила бы скрыть от вас ненавистный креатор и помочь тем, кто по каким-либо причинам его юзает.
 
1,007
36
206
Хочется работающих примеров
А в гайдах не скидывают примеры? или тебе и гайды не нужны, а сразу то, что можно скопипастить?
Я знаю джаву и полез качать креатор. В красную книгу меня.
Нахрена?
Но это хороший инструмент для тех, кто по в силу возраста скажем не может выучить джаву.
Для дошколят? А не лучше ли показать как можно и как нужно писать код, показать разные варианты решения одной задачи, а не ограничивать своё и чужое мышление этим кнопкотыком. И насчёт биома, с тем же успехом ты мог посмотреть любой мод открытыми исходниками и это было бы НАМНОГО полезнее, т.к. там код писал человек, который вряд ли ставил перед собой цель запутаться в собственном проекте, плюс ты бы мог узнать больше чем хотел изначально, более того, получил бы сразу РАБОЧИЙ пример.
 
7,099
324
1,510
Сверху