Обсуждение:Создание модификаций с помощью Forge

Материал из Minecraft Wiki
Перейти к: навигация, поиск

Заполнение статьи[править вики-текст]

А почему бы вам не взять и не начать заполнять эту статью как статью с модлоадером! А то она как бы пустая немного...

Спасибо автору![править вики-текст]

С вашим руководством для 1.6.4 я сделал свой первый мод - RecipesPlus.
На 1.7.2 я уже сам портировал :)
С уважением, тот самый DragonX24 (обсуждение) 11:03, 1 марта 2014 (UTC)

Поздравляю!!! Круто. Если хотите, создайте в подпространстве страницу о нём со всеми рецептами, как я сделал. --C уважением, PlatonCrafter. 11:51, 1 марта 2014 (UTC)

Туториалы на 1.6+[править вики-текст]

Я один не понимаю, зачем писать туториал для 1.6+ когда уже можно создавать туториалы для 1.7+? --C уважением, PlatonCrafter. 17:54, 4 августа 2014 (UTC)

Да, уже рекомендованный Forge на 1.7.10 вышел, а какой-то аноним решил написать руководство о генерации руды и собственных моделях блоков на 1.6. Кстати, PlatonCrafter, не видел ни где хорошего руководства по Techne? Я сам знаю как им пользоваться, просто писать лень. --Dand0 (обс.) 07:44, 5 августа 2014 (UTC)
Ну, пусть развлекается. Всё равно его туториал никому кроме него не нужен. Нет, не видел. Сам про такое писать не буду, полная фигня, возможностей почти ноль. Я щас пытаюсь научится в obj-формате модели загрузить. Чужие загрузил, а свои не могу сделать даже, как надо и с ними всё вылетает. Не знаете куда копать? --C уважением, PlatonCrafter. 20:05, 5 августа 2014 (UTC)
Ну, у Techne возможности такие же, что и у рендеринга Minecraft. Насчёт .obj моделей не знаю, их практически никто не делает в Minecraft, только создание модели в Techne и потом конвертация в .java. Хотя, знаю статью на 1.5.2, покопайтесь в пакете net.minecraftforge.client.model и его подпакетах. В исходниках EE3 покопайся. Вот, кстати, статья. --Dand0 (обс.) 04:24, 6 августа 2014 (UTC)
Вот что делает EE3: в главном файле мода в метод с аргументами FMLInitializationEvent event добавь такой код:
proxy.registerModels; //метод назови как хочешь

В CommonProxy добавь пустой абстрактный не возвращающий ничего метод (я назвал его registerModels) В ClientProxy добавь метод registerModels, объяви статичное числовое поле и добавь такой код

Поле = RenderingRegistry.getNextAvailableRenderId();

MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ФайлМода.блок), new ItemRendererКласс()); //для блока в руках

ClientRegistry.bindTileEntitySpecialRenderer(TileEntityБлок.class, new TileEntityRendererБлок()); //для блока в мире. Обязателен Tile Entity

Создай новый класс ModelБлок и сделай классу аннотацию @SideOnly(Side.CLIENT) и этот код

private IModelCustom modelБлок;
public static final ResourceLocation БЛОК = ResourceLocationHelper.getResourceLocation("models/файл.obj"); //obj файл должен находиться в assets/idмода/models (не textures!)

    public ModelБлок()
    {
        modelБлок = AdvancedModelLoader.loadModel(БЛОК);
    }

    public void render()
    {
        modelБлок.renderPart("Base");
    }

Проверяй. Я расчитывал, что ты хочешь специальный рендер для блока в руке или в мире. Если для предмета, скажи. Извини, что на "ты". --Dand0 (обс.) 07:19, 6 августа 2014 (UTC) Забыл код для рендера в мире :0 Создай класс TileEntityRenderБлок и сделай его суперкласс TileEntitySpecialRenderer и добавь классу аннотацию @SideOnly(Side.CLIENT). Вот сам код:

private final ModelAludel modelAludel = new ModelAludel();
    private final RenderItem customRenderItem;

    public TileEntityRendererAludel()
    {
        customRenderItem = new RenderItem()
        {
            @Override
            public boolean shouldBob()
            {
                return false;
            }
        };

        customRenderItem.setRenderManager(RenderManager.instance);
    }

    @Override
    public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float tick)
    {
        if (tileEntity instanceof TileEntityAludel)
        {
            TileEntityAludel tileEntityAludel = (TileEntityAludel) tileEntity;

            GL11.glPushMatrix();

            // Scale, Translate, Rotate
            scaleTranslateRotate(x, y, z, tileEntityAludel.getOrientation());

            // Текстура
            this.bindTexture(Textures.Model.ALUDEL);

            // Рендер
            modelAludel.render();

            GL11.glPopMatrix();

            /**
             * Render the ghost item inside of the Aludel, slowly spinning
             */
            GL11.glPushMatrix();

            TileEntity tileGlassBell = tileEntityAludel.getWorldObj().getTileEntity(tileEntityAludel.xCoord, tileEntityAludel.yCoord + 1, tileEntityAludel.zCoord);

            if (tileGlassBell instanceof TileEntityGlassBell)
            {
                if (tileEntityAludel.outputItemStack != null)
                {
                    float scaleFactor = getGhostItemScaleFactor(tileEntityAludel.outputItemStack);
                    float rotationAngle = (float) (720.0 * (System.currentTimeMillis() & 0x3FFFL) / 0x3FFFL);

                    EntityItem ghostEntityItem = new EntityItem(tileEntityAludel.getWorldObj());
                    ghostEntityItem.hoverStart = 0.0F;
                    ghostEntityItem.setEntityItemStack(tileEntityAludel.outputItemStack);

                    GL11.glTranslatef((float) x + 0.5F, (float) y + 1.25F, (float) z + 0.5F);
                    GL11.glScalef(scaleFactor, scaleFactor, scaleFactor);
                    GL11.glRotatef(rotationAngle, 0.0F, 1.0F, 0.0F);

                    customRenderItem.doRender(ghostEntityItem, 0, 0, 0, 0, 0);
                }
            }

            GL11.glPopMatrix();
        }
    }

    private void scaleTranslateRotate(double x, double y, double z, ForgeDirection orientation) //Тут всё с OpenGL
    {
        if (orientation == ForgeDirection.NORTH)
        {
            GL11.glTranslated(x + 1, y, z);
            GL11.glRotatef(180F, 0F, 1F, 0F);
            GL11.glRotatef(-90F, 1F, 0F, 0F);
        }
        else if (orientation == ForgeDirection.EAST)
        {
            GL11.glTranslated(x + 1, y, z + 1);
            GL11.glRotatef(90F, 0F, 1F, 0F);
            GL11.glRotatef(-90F, 1F, 0F, 0F);
        }
        else if (orientation == ForgeDirection.SOUTH)
        {
            GL11.glTranslated(x, y, z + 1);
            GL11.glRotatef(0F, 0F, 1F, 0F);
            GL11.glRotatef(-90F, 1F, 0F, 0F);
        }
        else if (orientation == ForgeDirection.WEST)
        {
            GL11.glTranslated(x, y, z);
            GL11.glRotatef(-90F, 0F, 1F, 0F);
            GL11.glRotatef(-90F, 1F, 0F, 0F);
        }
    }

    private float getGhostItemScaleFactor(ItemStack itemStack)
    {
        float scaleFactor = 1.0F;

        if (itemStack != null)
        {
            byte numBlocks = 1;
            if (itemStack.stackSize > 1)
            {
                numBlocks = 2;
            }
            else if (itemStack.stackSize > 5)
            {
                numBlocks = 3;
            }
            else if (itemStack.stackSize > 20)
            {
                numBlocks = 4;
            }
            else if (itemStack.stackSize > 40)
            {
                numBlocks = 5;
            }

            if (itemStack.getItem() instanceof ItemBlock)
            {
                switch (numBlocks)
                {
                    case 1:
                        return 0.90F;
                    case 2:
                        return 0.90F;
                    case 3:
                        return 0.90F;
                    case 4:
                        return 0.90F;
                    case 5:
                        return 0.80F;
                    default:
                        return 0.90F;
                }
            }
            else
            {
                switch (numBlocks)
                {
                    case 1:
                        return 0.65F;
                    case 2:
                        return 0.65F;
                    case 3:
                        return 0.65F;
                    case 4:
                        return 0.65F;
                    default:
                        return 0.65F;
                }
            }
        }

        return scaleFactor;

Мне поля заменять лень, думаю сам догадаешься. Ещё раз извини за "ты". −Надеясь, что у вас всё получится,Dand0 (обс.) 07:39, 6 августа 2014 (UTC)

Да не, спасибо, уже почти сам разобрался, точнее узнал откуда ошибка. Мне нужно просто в норм проге эту модель сделать. Код я уже давно наладил. Раз никто obj не пользуется, в чём вы кстати в корне не правы, большинство модов которые я знаю используют obj. Просто в techne даже треугольники нельзя создавать и много еще чего. А с помощью obj можно АБСОЛЮТНО любую модель запихнуть в игру, хоть машину, хоть нано-костюм. Видимо я буду первым, кто напишет на русском туториал по obj. Главное модель сделать, остальное готово. Простите, видимо зря вас побеспокоил. --C уважением, PlatonCrafter. 20:37, 6 августа 2014 (UTC)
Прошу назвать эти моды. Вот я на GitHub зашёл. EE3 - OBJ. BuildCraft - Techne (конвертированный в java). ICBM - .tcn (собственный формат Techne). Electromagnet Coherence -.tcn. BiblioCraft - obj и java (если obj по каким-либо причинам загрузить не получилось, то грузит Techne). Pokemon (сам с ним никогда не играл) - Techne. IC2 - Techne. Ещё раз прошу назвать ваши моды. А вообще, OBJ классно детализированы, мне нравится (но ведь Minecraft не такой). Сейчас последний BiblioCraft запустил и увидел. --Dand0 (обс.) 06:16, 7 августа 2014 (UTC)
Посмотрите любые RPG и магические моды. В электрических используется в основном techne, потому что создаются в основном кубы, разные провода, дробители, экстракторы и прочее кубическое. лично я брал модели из Galacticrafta, они там .obj --C уважением, PlatonCrafter. 19:39, 14 августа 2014 (UTC)
Как вы думаете, моб — это основной урок или дополнительный? --Dand0 (обс.) 06:25, 15 августа 2014 (UTC)
Конечно же, основной! --C уважением, PlatonCrafter. 09:40, 15 августа 2014 (UTC)

Кто нибудь собирается создавать новые руководства?[править вики-текст]

Кто нибудь собирается создавать новые руководства? Всегда ваш, Ivan 111 Vasilyevich (обс. | вклад) 07:15, 19 июня 2017 (UTC)

Special:Diff/588960 Qdone два дня назад добавил кое-что. А вообще, за последние несколько лет я не видел, чтобы в где-то на вики задавались вопросы по созданию модов. Не нужно, видимо. --Dand0 (обс.) 07:34, 19 июня 2017 (UTC)
Promotional Content