- Версия(и) Minecraft
- 1.7.10
Здравствуй друг. Этот гайд посвящён изменению предмета в руке при нажатии ПКМ об блок который ты создал. Т.е. У нас есть плита, ты жмёшь ПКМ по плите и держишь в руке масло. Масло изчезает и ты получаешь блок раскалённого масла. Если взять стакан с водой и нажать ПКМ по блоку раскалённого масла то он взорвётся.
+ как бонус можете научится делать частицы на блоке. Ну они тут будут по крайней мере
Начинаем! И объяснении очень много, так-что не понять тяжело
Приступим создавая новый class. Он же будет главным у нас.
Дальше. У нас подчёркивает то что нету class'ов: Oven1, OilBL, OilBlockHot, WaterBottle.
Создадим их.
Начинаем с простого. OilBL. Простой предмет не содержащий ничего криминального.
Сделали. Дальше стакан воды WaterBottle. (К нему будет присвоен текст внизу).
Сделали.
Чуть не забыл! разберём lines.add.
lines.add добавляет линию с информацией. EnumChatFormatting.RED форматирование текста. цвет RED
т.е. красный + Означает сам текст в скобках :/ . Окей идём дальше.
Дальше идёт блок раскалённого масла. Мы в нём должны описать код при котором: При нажатии ПКМ произойдёт взрыв. Он будет испускать частицы лавы и большого дыма!
Окей блок масла уже есть вызов взрыва по пкм при нажатии ПКМ по блоку с стаканом воды в руке.
Дальше нам нужна плита на которой мы будем превращать бутылёк масла в блок кипящего масла.
Плита тоже будет испускать частицы но уже огня и не так много.
Ну вот всё готово.
Перейдём к проверке результата по скриншотикам!
И да для красоты нужно пихнуть скриншотов в папку.
Перед папкой java где хранятся коды есть папка resources(Если нету то создай), открывай, создай папку assets, открывай создай папку fxg, создавай папку textures и в папке textures создай папки blocks и items.
oil_i.png - текстура блока масла [в blocks](i заменить на цифры от 0 до 5)
oven_i.png - текстура плиты [в blocks](i заменить на цифры от 0 до 5)
WaterBottle.png - стакан воды [в items]
OilBL.png - текстура бутылька масла [в items]
Если ПКМ бутыльком масла по печи получим Блок масла.
Потом, если ПКМ по блоку раскалённого масла с Стаканом воды в руке то будет взрыв.
Взрыв силой 7F. Т.к. такая сила указана в коде блока с маслом.
А теперь скриншотики!
Плита с частицами огня:
Блок раскалённого масла с частицами лавы и большого дыма:
Как срабатывает взрыв вы можете увидеть в данном видео!
На этом моменте туториал подошёл к концу.
Надеюсь хоть как-никак он вам помог, и вы рады.
На этом всё.
+ как бонус можете научится делать частицы на блоке. Ну они тут будут по крайней мере
Начинаем! И объяснении очень много, так-что не понять тяжело
Приступим создавая новый class. Он же будет главным у нас.
Java:
//Наш пакет
package fxg.hotoilplus;
//Импорты нужные для работы мода.
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
@Mod (modid = Game.MODID, name = Game.MODNAME, version = Game.VERSION)
public class Game
{
public static final String MODID = "HotOilPlus"; //МодИд - То как мод называется в коде(не МодНейм).
public static final String MODNAME = "Hot Oil Plus!"; //МодНейм - название мода.
public static final String VERSION = "1.2"; //Тут нужно быть гением. Это версия мода.
//Создаём необходимые паблики.
//2 блока и 2 предмета которые будут взаимодействовать друг с другом.
public static Block Oven1; //Плита
public static Item WaterBottle; //Стакан воды
public static Item OilBL; //Бутылочка масла
public static Block OilBlockHot; //Блок раскалённого масла.
@EventHandler
public void preInit(FMLPreInitializationEvent event)
{
//Регистрируем блоки и предметы.
WaterBottle = new WaterBottle().setUnlocalizedName("WaterBottle");
GameRegistry.registerItem(WaterBottle, "WaterBottle");
Oven1 = new Oven1(true);
GameRegistry.registerBlock(Oven1, "Oven1");
OilBL = new OilBL().setUnlocalizedName("OilBL");
GameRegistry.registerItem(OilBL, "OilBL");
OilBlockHot = new OilBlockHot(true);
GameRegistry.registerBlock(OilBlockHot, "OilBlockHot");
}
}
Создадим их.
Начинаем с простого. OilBL. Простой предмет не содержащий ничего криминального.
Java:
package fxg.hotoilplus;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
public class OilBL extends Item {
public OilBL()
{
super();
this.setCreativeTab(CreativeTabs.tabMaterials); //Предмет будет отоброжатся во вкладке Материалы
this.setTextureName("fxg:oilBl"); //Его текстура.
}
}
Java:
package fxg.hotoilplus;
import java.util.List;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
public class WaterBottle extends Item {
public WaterBottle()
{
super();
this.setCreativeTab(CreativeTabs.tabMaterials); //Предмет будет отоброжатся во вкладке Материалы
this.setMaxStackSize(1); //Максимальный стак - 1. Дефолт - 64.
this.setTextureName("fxg:waterbottle"); //Текстурка
}
public void addInformation(ItemStack stack, EntityPlayer playerIn, List lines, boolean advanced) //Добавляет
//Информацию под вещью.
{
lines.add(EnumChatFormatting.RED + "Danger Thing :)"); //Добавляет строку с надписью
}
}
Чуть не забыл! разберём lines.add.
lines.add добавляет линию с информацией. EnumChatFormatting.RED форматирование текста. цвет RED
т.е. красный + Означает сам текст в скобках :/ . Окей идём дальше.
Дальше идёт блок раскалённого масла. Мы в нём должны описать код при котором: При нажатии ПКМ произойдёт взрыв. Он будет испускать частицы лавы и большого дыма!
Java:
package fxg.hotoilplus;
import java.util.Random;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
public class OilBlockHot extends Block {
private boolean field_150187_a;
public OilBlockHot(boolean p_i45420_1_)
{
super(Material.rock); //Материал блока
this.setBlockName("OilBlock"); //Имя блока не локализованное
this.setCreativeTab(CreativeTabs.tabBlock); //Предмет будет отоброжатся во вкладке Блоки
this.setBlockTextureName("fxg:oil"); this.setHardness(4F); this.setResistance(4F); //Текстура блока, Твёрдость 4F, защита от взрывов и т.д. 4F.
if (p_i45420_1_)
{
this.setTickRandomly(true); //Заставляет спавнится частицы рандомно
}
this.field_150187_a = p_i45420_1_;
}
public IIcon[] icons = new IIcon[6]; //Добавляет разностороннюю текстуру блока посредством циферных значении :?
@Override
public void registerBlockIcons(IIconRegister reg) { //Регистрирует иконки
for (int i = 0; i < 6; i ++) { //Интерьер для дома. Шутка. Означает что все стороны будут различатся цифрами.
this.icons[i] = reg.registerIcon(this.textureName + "_" + i); //тут понятно должно быть.
//textureName - название вашей текстуры + _ + i(+_+ циферное значение) Итог. Должно быть 6 текстур
//oil_0.png oil_1.png oil_2.png и т.д.
}
}
public IIcon getIcon(int side, int meta) { //Тут он берёт иконки и делает i(число) стороной.
return this.icons[side];
}
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int var6, float var7, float var8, float var9)
{
if(!world.isRemote) //Вызов мира :?
{
ItemStack currentStack = player.getCurrentEquippedItem(); //Находит какая вещь у вас в руке после ПКМ по блоку масла.
if(currentStack != null && currentStack.getItem().equals(Game.WaterBottle)) //Если эта вещь это WaterBottle т.е. вызывает то что в скобках.
{
world.createExplosion(player, (double)x, (double)y, (double)z, 7f, true); //вызывает взрыв на координате блока с силой 7F
world.setBlockToAir(x, y, z); //После взрыва заменяет блок масла на блок Air [Т.е. воздух или ничего]
return true;
}
}
return false;
}
public int tickRate(World p_149738_1_) //Тикрейт (Частота тиков для спавна частиц. 20 тиков - 1 секунда).
{
return 30;
}
public void onBlockClicked(World p_149699_1_, int p_149699_2_, int p_149699_3_, int p_149699_4_, EntityPlayer p_149699_5_)
{
this.func_150186_m(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_); //Спавн частиц по клику
this.func_150186_m(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_);
this.func_150186_m(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_);
super.onBlockClicked(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_, p_149699_5_);
}
@SideOnly(Side.CLIENT)
public void randomDisplayTick(World p_149734_1_, int p_149734_2_, int p_149734_3_, int p_149734_4_, Random p_149734_5_)
{
if (this.field_150187_a) //тут эти частицы создаются сами в этом коде.
{
this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_);
this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_);
}
}
private void func_150186_m(World p_150186_1_, int p_150186_2_, int p_150186_3_, int p_150186_4_)
{
Random random = p_150186_1_.rand;
double d0 = 0.0625D; //Высота партиклей над блоком
for (int l = 0; l < 6; ++l)
{
double d1 = (double)((float)p_150186_2_ + random.nextFloat());
double d2 = (double)((float)p_150186_3_ + random.nextFloat());
double d3 = (double)((float)p_150186_4_ + random.nextFloat());
if (l == 0 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ + 1, p_150186_4_).isOpaqueCube()) //Сторона на которой
{ //Спавнятся партикли.
d2 = (double)(p_150186_3_ + 1) + d0;
}
if (l == 1 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ - 1, p_150186_4_).isOpaqueCube())
{
d2 = (double)(p_150186_3_ + 0) - d0;
}
if (d1 < (double)p_150186_2_ || d1 > (double)(p_150186_2_ + 1) || d2 < 0.0D || d2 > (double)(p_150186_3_ + 1) || d3 < (double)p_150186_4_ || d3 > (double)(p_150186_4_ + 1))
{
p_150186_1_.spawnParticle("largesmoke", d1, d2, d3, 0.0D, 0.0D, 0.0D); //Спавн частиц дыма "largesmoke".
p_150186_1_.spawnParticle("lava", d1, d2, d3, 0.0D, 0.0D, 0.0D); //Спавн частиц лавы "lava".
}
}
}
}
Дальше нам нужна плита на которой мы будем превращать бутылёк масла в блок кипящего масла.
Плита тоже будет испускать частицы но уже огня и не так много.
Java:
package fxg.hotoilplus;
import java.util.Random;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
public class Oven1 extends Block {
private boolean field_150187_a;
public Oven1(boolean p_i45420_1_)
{
super(Material.rock); //Материал блока
this.setBlockName("Oven1"); //Имя блока
this.setCreativeTab(CreativeTabs.tabBlock); //Предмет будет отоброжатся во вкладке Блоки
this.setBlockTextureName("fxg:oven"); //Текстура. Чуть ниже про разные стороны.
this.setHardness(4F); //Твёрдость 4F
this.setResistance(4F); //Защита от взрывов и т.д. 4F
if (p_i45420_1_)
{
this.setTickRandomly(true);
}
this.field_150187_a = p_i45420_1_;
}
public IIcon[] icons = new IIcon[6]; //Добавляет разностороннюю текстуру блока посредством циферных значении :?
@Override
public void registerBlockIcons(IIconRegister reg) { //Регистрирует иконки
for (int i = 0; i < 6; i ++) { //Интерьер для дома. Шутка. Означает что все стороны будут различатся цифрами.
this.icons[i] = reg.registerIcon(this.textureName + "_" + i); //тут понятно должно быть.
//textureName - название вашей текстуры + _ + i(+_+ циферное значение) Итог. Должно быть 6 текстур
//oven_0.png oven_1.png oven_2.png и т.д.
}
}
public IIcon getIcon(int side, int meta) { //Тут он берёт иконки и делает i(число) стороной.
return this.icons[side];
}
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int var6, float var7, float var8, float var9){
if(!world.isRemote){ //Вызов мира :?
ItemStack currentStack = player.getCurrentEquippedItem(); //Вызов какая вещь в руке
if(currentStack != null && currentStack.getItem().equals(Game.OilBL)){ //если это бутылка масла то...
player.inventory.setInventorySlotContents(player.inventory.currentItem, new ItemStack(Game.OilBlockHot)); //ЗАМЕНИТЬ currentItem
//На вещь которая у вас в руке когда вы жмякали ПКМ по блоку на OilBlockHot(Блок масла).
return true;
}
}
return false
}
public int tickRate(World p_149738_1_) //Тикрейт (Частота тиков для спавна частиц. 20 тиков - 1 секунда).
{
return 30;
}
public void onBlockClicked(World p_149699_1_, int p_149699_2_, int p_149699_3_, int p_149699_4_, EntityPlayer p_149699_5_)
{
this.func_150186_m(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_);
this.func_150186_m(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_);
super.onBlockClicked(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_, p_149699_5_);
}
@SideOnly(Side.CLIENT)
public void randomDisplayTick(World p_149734_1_, int p_149734_2_, int p_149734_3_, int p_149734_4_, Random p_149734_5_)
{
if (this.field_150187_a) //тут эти партикли создаются сами в этом коде.
{
this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_);
}
}
private void func_150186_m(World p_150186_1_, int p_150186_2_, int p_150186_3_, int p_150186_4_)
{
Random random = p_150186_1_.rand;
double d0 = 0.0625D; //Высота партиклей над блоком
for (int l = 0; l < 6; ++l)
{
double d1 = (double)((float)p_150186_2_ + random.nextFloat());
double d2 = (double)((float)p_150186_3_ + random.nextFloat());
double d3 = (double)((float)p_150186_4_ + random.nextFloat());
if (l == 0 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ + 1, p_150186_4_).isOpaqueCube()) //Сторона на которой
{ //Спавнятся партикли.
d2 = (double)(p_150186_3_ + 1) + d0;
}
if (l == 1 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ - 1, p_150186_4_).isOpaqueCube())
{
d2 = (double)(p_150186_3_ + 0) - d0;
}
if (d1 < (double)p_150186_2_ || d1 > (double)(p_150186_2_ + 1) || d2 < 0.0D || d2 > (double)(p_150186_3_ + 1) || d3 < (double)p_150186_4_ || d3 > (double)(p_150186_4_ + 1))
{
p_150186_1_.spawnParticle("flame", d1, d2, d3, 0.0D, 0.0D, 0.0D); //Спавн частиц огня "flame".
}
}
}
}
Перейдём к проверке результата по скриншотикам!
И да для красоты нужно пихнуть скриншотов в папку.
Перед папкой java где хранятся коды есть папка resources(Если нету то создай), открывай, создай папку assets, открывай создай папку fxg, создавай папку textures и в папке textures создай папки blocks и items.
oil_i.png - текстура блока масла [в blocks](i заменить на цифры от 0 до 5)
oven_i.png - текстура плиты [в blocks](i заменить на цифры от 0 до 5)
WaterBottle.png - стакан воды [в items]
OilBL.png - текстура бутылька масла [в items]
Если ПКМ бутыльком масла по печи получим Блок масла.
Потом, если ПКМ по блоку раскалённого масла с Стаканом воды в руке то будет взрыв.
Взрыв силой 7F. Т.к. такая сила указана в коде блока с маслом.
А теперь скриншотики!
Плита с частицами огня:
Блок раскалённого масла с частицами лавы и большого дыма:
Как срабатывает взрыв вы можете увидеть в данном видео!
На этом моменте туториал подошёл к концу.
Надеюсь хоть как-никак он вам помог, и вы рады.
На этом всё.