Создание блока#
Основа#
Создадим класс для нашего блока.
public class IdealBlock extends Block {
public IdealBlock() {
super(Properties.create(Material.ROCK).harvestTool(ToolType.PICKAXE));
}
@Override
public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) {
return ImmutableList.of(new ItemStack(Items.CAKE, 8), new ItemStack(Items.TORCH, 1));
}
}
create
- Создает Properties с материалом Material.ROCK.harvestTool
- задает тип эффективного инструмента.getDrops
- возвращает список предметов, которые должны выпасть с блока. 8 тортиков и 1 факел.
Также можно вынести Properties в конструктор.
Все параметры Properties:
* create
- Создает Properties с заданным материалом.
* harvestTool
- Задает тип эффективного инструмента.
* notSolid
- Для блоков с моделями чтоб не создавать эффект X-rey.
* lightValue
- Задает силу свечения.
* lootFrom
- Копирует дроп с другого блока.
* speedFactor
- Задает множитель скорости(как у льда).
* sound
- Звук для хождения.
* doesNotBlockMovement
- Делаем не двигаемым для поршня.
* hardnessAndResistance
- Задает прочность и устойчивость к взрывам
* jumpFactor
- Задает множитель прыжка(как блок меда)
* noDrops
- Отменяет какой - либо дроп.
* slipperiness
- Скользкость(как у льда)
* tickRandomly
- Делает блок "случайным" дял обновления(любые растения)
* variableOpacity
- отбрасывает ли тень(для блоков с моделькой)
Регистрация#
Создадим класс TutBlocks, пустой интерфейс INonItem.
@Mod.EventBusSubscriber(modid = TestMod.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class TutBlocks {
private static final DeferredRegister<Block> BLOCKS = new DeferredRegister<>(ForgeRegistries.BLOCKS, TestMod.MOD_ID);
public static final RegistryObject<Block> IDEAL = BLOCKS.register("ideal", IdealBlock::new);
public static void register() {
BLOCKS.register(FMLJavaModLoadingContext.get().getModEventBus());
}
@SubscribeEvent
public static void onRegisterItems(final RegistryEvent.Register<Item> event) {
final IForgeRegistry<Item> registry = event.getRegistry();
TutBlocks.BLOCKS.getEntries().stream()
.map(RegistryObject::get)
.filter(block -> !(block instanceof INonItem))
.forEach(block -> {
final Item.Properties prop = new Item.Properties();
final BlockItem blockItem = new BlockItem(block, prop);
blockItem.setRegistryName(block.getRegistryName());
registry.register(blockItem);
});
}
}
register(block)
- регистрирует блоки.IDEAL
- объект регистрации нашего блока. Чтоб получить сам блок нужно вызвать метод get().onRegisterItems
- регистрирует предметы для блоков которые не наследуют INonItem.INonItem
- пустой интерфейс для отмены регистрации предмета.
Нам нужно добавить в конструктор основного класса TutBlocks.register() для регистрации блоков.
Теперь можете запустить Minecraft нажав на кнопку run
и посмотреть свой блок в живую. Для получения блока напишите /give @p tut:ideal
.
Вместо tut
у Вас должен быть modid
мода! Вместо ideal
у Вас должно быть регистрируемое имя вашего блока.
Модель#
Создадим файл ideal.json
. По пути:
└── src
└── main
└── resources
└── assets
└── tut
└── blockstates
{
"variants": {
"": { "model": "tut:block/ideal" }
}
}
{
"parent": "block/cube_all",
"textures": {
"all": "tut:blocks/ideal"
}
}
tut:
(modid) прописывать не надо! В примере с объёмной моделью я решил использовать текстуру камня из Minecraft.
Название файла должно быть таким же как и в blockstates
-> ideal
, в переменной model
!
Пример сложной модели(Позаимствован из Туманного мира с разрешением Liahim):
{
"textures": {
"particle": "tut:blocks/campfire_pot",
"pot": "tut:blocks/campfire_pot"
},
"elements": [
{
"name": "pot D",
"from": [ 4.5, 6.0, 4.5 ],
"to": [ 11.5, 8.0, 11.5 ],
"faces": {
"north": { "texture": "#pot", "uv": [ 5.0, 14.0, 12.0, 16.0 ] },
"east": { "texture": "#pot", "uv": [ 5.0, 14.0, 12.0, 16.0 ] },
"south": { "texture": "#pot", "uv": [ 5.0, 14.0, 12.0, 16.0 ] },
"west": { "texture": "#pot", "uv": [ 5.0, 14.0, 12.0, 16.0 ] },
"up": { "texture": "#pot", "uv": [ 5.0, 7.0, 12.0, 14.0 ] },
"down": { "texture": "#pot", "uv": [ 5.0, 7.0, 12.0, 14.0 ] }
}
},
{
"name": "pot N",
"from": [ 4.5, 7.0, 3.5 ],
"to": [ 11.5, 13.0, 4.5 ],
"faces": {
"north": { "texture": "#pot", "uv": [ 5.0, 0.0, 12.0, 6.0 ] },
"east": { "texture": "#pot", "uv": [ 4.0, 0.0, 5.0, 6.0 ] },
"south": { "texture": "#pot", "uv": [ 5.0, 9.0, 12.0, 15.0 ] },
"west": { "texture": "#pot", "uv": [ 4.0, 0.0, 5.0, 6.0 ] },
"up": { "texture": "#pot", "uv": [ 5.0, 6.0, 12.0, 7.0 ] },
"down": { "texture": "#pot", "uv": [ 5.0, 15.0, 12.0, 16.0 ] }
}
},
{
"name": "pot E",
"from": [ 11.5, 7.0, 4.5 ],
"to": [ 12.5, 13.0, 11.5 ],
"faces": {
"north": { "texture": "#pot", "uv": [ 4.0, 0.0, 5.0, 6.0 ] },
"east": { "texture": "#pot", "uv": [ 5.0, 0.0, 12.0, 6.0 ] },
"south": { "texture": "#pot", "uv": [ 4.0, 0.0, 5.0, 6.0 ] },
"west": { "texture": "#pot", "uv": [ 5.0, 9.0, 12.0, 15.0 ] },
"up": { "texture": "#pot", "uv": [ 12.0, 7.0, 13.0, 14.0 ] },
"down": { "texture": "#pot", "uv": [ 5.0, 15.0, 12.0, 16.0 ] }
}
},
{
"name": "pot S",
"from": [ 4.5, 7.0, 11.5 ],
"to": [ 11.5, 13.0, 12.5 ],
"faces": {
"north": { "texture": "#pot", "uv": [ 5.0, 9.0, 12.0, 15.0 ] },
"east": { "texture": "#pot", "uv": [ 4.0, 0.0, 5.0, 6.0 ] },
"south": { "texture": "#pot", "uv": [ 5.0, 0.0, 12.0, 6.0 ] },
"west": { "texture": "#pot", "uv": [ 4.0, 0.0, 5.0, 6.0 ] },
"up": { "texture": "#pot", "uv": [ 5.0, 14.0, 12.0, 15.0 ] },
"down": { "texture": "#pot", "uv": [ 5.0, 15.0, 12.0, 16.0 ] }
}
},
{
"name": "pot W",
"from": [ 3.5, 7.0, 4.5 ],
"to": [ 4.5, 13.0, 11.5 ],
"faces": {
"north": { "texture": "#pot", "uv": [ 4.0, 0.0, 5.0, 6.0 ] },
"east": { "texture": "#pot", "uv": [ 5.0, 0.0, 12.0, 6.0 ] },
"south": { "texture": "#pot", "uv": [ 4.0, 0.0, 5.0, 6.0 ] },
"west": { "texture": "#pot", "uv": [ 5.0, 0.0, 12.0, 6.0 ] },
"up": { "texture": "#pot", "uv": [ 4.0, 7.0, 5.0, 14.0 ] },
"down": { "texture": "#pot", "uv": [ 5.0, 15.0, 12.0, 16.0 ] }
}
},
{
"name": "Handle E",
"from": [ 12.5, 12.0, 6.5 ],
"to": [ 13.5, 13.0, 9.5 ],
"faces": {
"north": { "texture": "#pot", "uv": [ 4.0, 0.0, 5.0, 1.0 ] },
"east": { "texture": "#pot", "uv": [ 7.0, 0.0, 10.0, 1.0 ] },
"south": { "texture": "#pot", "uv": [ 4.0, 0.0, 5.0, 1.0 ] },
"up": { "texture": "#pot", "uv": [ 13.0, 9.0, 14.0, 12.0 ] },
"down": { "texture": "#pot", "uv": [ 7.0, 15.0, 10.0, 16.0 ] }
}
},
{
"name": "Handle W",
"from": [ 2.5, 12.0, 6.5 ],
"to": [ 3.5, 13.0, 9.5 ],
"faces": {
"north": { "texture": "#pot", "uv": [ 4.0, 0.0, 5.0, 1.0 ] },
"west": { "texture": "#pot", "uv": [ 7.0, 0.0, 10.0, 1.0 ] },
"south": { "texture": "#pot", "uv": [ 4.0, 0.0, 5.0, 1.0 ] },
"up": { "texture": "#pot", "uv": [ 3.0, 9.0, 4.0, 12.0 ] },
"down": { "texture": "#pot", "uv": [ 7.0, 15.0, 10.0, 16.0 ] }
}
}
]
}
Теперь Вам надо создать ideal.json
. По пути:
└── src
└── main
└── resources
└── assets
└── tut
└── models
└── item
{
"parent": "tut:block/ideal"
}
Дроп через json#
-- В разработке