Перейти к содержимому
  • записей
    5
  • комментариев
    5
  • просмотра
    2 093

Крафт программ. Пилим OCTechnics - часть 2. Создание блока

ProgramCrafter

674 просмотра

Из чего состоит любой завод в Minecraft? Из блоков! Поэтому их надо сделать.

 

Для удобства сборки я создал .bat скрипт, выполняющий gradlew clean, gradlew build и копирующий мод в папку. Теперь можно поменять что-то в коде (или в другом файле), запустить скрипт и через полминуты уже включать Minecraft, чтобы проверить, всё ли заработало.

 

В поисках документации, как правильно добавить блок и откуда импортировать пакеты, пришлось перерыть полинтернета. В результате лучшим источником оказались исходники других модов, вроде Forestry или Glassential (первый попавшийся мне под руку мод, добавляющий блоки). Кроме того, я обнаружил странную вещь: все моды используют импорт CreativeTabs, но мой мод с ним отказывается компилироваться, говоря про отсутствие пакета net.minecraft.creativetab.

Ещё хуже с документацией, как заставить мод реагировать на события. Стандартная шина данных Forge (MinecraftForge.EVENT_BUS) не сработала ни для одного события, которое мне нужно.

 

Пробовал установить Eclipse для удобства разработки, но он не распознал декомпилированный Minecraft и подсветил все мои импорты красным. Когда я открыл вкладку с задачами Gradle, среда зависла. Тогда я стал работать в Notepad++.

 

Итоговый вариант, который у меня заработал и стал правильно добавлять блок (файл TestMod.java необходимо переименовать в OCTechnics.java):

Скрытый текст

 

package org.octechnics.octechnics;

 

import net.minecraftforge.common.MinecraftForge;

import net.minecraftforge.fml.common.Mod;

import net.minecraftforge.fml.common.Mod.EventBusSubscriber;

import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;

import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;

import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;

import net.minecraftforge.eventbus.api.SubscribeEvent;

import net.minecraftforge.event.RegistryEvent;

import net.minecraftforge.api.distmarker.Dist;

 

import net.minecraft.block.Block;

import net.minecraft.item.Item;

import net.minecraft.item.BlockItem;

 

import net.minecraft.block.BlockState;

 

import org.apache.logging.log4j.LogManager;

import org.apache.logging.log4j.Logger;

 

@Mod( "octechnics" )

public class OCTechnics {

    public static final Block BASE_FACT = new BasicFactoryBlock("basic_factory_block");

    public static final Item BASE_FACT_I = new BlockItem(BASE_FACT, new Item.Properties());

    private static Logger logger;

   

    public OCTechnics() {

        logger = LogManager.getLogger();

        logger.info("octechnics - register on EVENT_BUS");

        FMLJavaModLoadingContext.get().getModEventBus().register(new OCTEventHandler());

    }

   

    @Mod.EventBusSubscriber

    public static class OCTEventHandler {

        @SubscribeEvent

        public void setup(FMLCommonSetupEvent evt) {

            logger.info("octechnics - got FMLCommonSetupEvent");

        }

       

        @SubscribeEvent

        public void registerBlocks(RegistryEvent.Register<Block> event) {

            logger.info("octechnics - got RegistryEvent.Register<Block>");

            event.getRegistry().register(BASE_FACT);

        }

       

        @SubscribeEvent

        public void registerItems(RegistryEvent.Register<Item> event) {

            logger.info("octechnics - got RegistryEvent.Register<Item>");

            event.getRegistry().register(BASE_FACT_I.setRegistryName("octechnics", "basic_factory_block"));

        }

    }

}

 

Файл org/octechnics/octechnics/common/blocks/BasicFactoryBlock.java:

Скрытый текст

 

package org.octechnics.octechnics;

 

import net.minecraft.block.Block;

import net.minecraft.block.material.Material;

//import net.minecraft.creativetab.CreativeTabs;

import net.minecraft.item.Item;

import net.minecraft.world.World;

 

 

public class BasicFactoryBlock extends Block {

    public BasicFactoryBlock(String name) {

        super(Block.Properties.create(Material.PACKED_ICE));

        //this.setCreativeTab(CreativeTabs.BuildingBlocks);

        this.setRegistryName("octechnics", name);

        //this.setUnlocalizedName("octechnics", name);

    }

}

 

В папке resources: assets/octechnics/blockstates/basic_factory_block.json:

Скрытый текст

 

{

    "variants": {

        "": { "model": "octechnics:block/basic_factory_block" }

       }

}

 

assets/octechnics/lang/en_us.json:

Скрытый текст

 

{

    "block.octechnics.basic_factory_block": "Factory Base",

    "item.octechnics.basic_factory_block": "Factory Base",

}

 

assets/octechnics/models/block/basic_factory_block.json:

Скрытый текст

 

{

    "parent": "block/cube_all",

    "textures": {

        "all": "octechnics:block/factory_base"

    }

}

 

assets/octechnics/models/item/basic_factory_block.json:

Скрытый текст

 

{

    "parent": "octechnics:block/basic_factory_block"

}

 

Текстуру блока я положил по адресу assets/octechnics/textures/block/factory_base.png.

 

Следующий этап, который будет описан в отдельной статье - возврат на версию 1.7.10, где есть необходимые моды - IC2 и OpenComputers.

  • Нравится 1


2 комментария


Рекомендуемые комментарии

В IntelliJ IDEA не должно быть проблем с импортами. Тем более что у форджа есть подготовленый таск вроде, чтобы развернуть IDEA-проект.

Ну и конечно блокнот не имеет индексации кода, поэтому не получится быстро перемещаться по коду, удобно рефакторить и всё такое.

Поделиться комментарием


Ссылка на комментарий

IntelliJ IDEA не пробовал ставить, а Eclipse просто не по делу тупит. Может быть, чуть позже и поставлю IDEA, но конкретно сейчас я пытаюсь разобраться с Gradle под 1.7.10.

Поделиться комментарием


Ссылка на комментарий
Гость
Добавить комментарий...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...