Крафт программ. Пилим OCTechnics - часть 2. Создание блока
Из чего состоит любой завод в 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 комментария
Рекомендуемые комментарии