Изменение предмета по клику об блок и создание частиц на блоке.

Изменение предмета по клику об блок и создание частиц на блоке.

Нет прав для скачивания
Версия(и) Minecraft
1.7.10
Здравствуй друг. Этот гайд посвящён изменению предмета в руке при нажатии ПКМ об блок который ты создал. Т.е. У нас есть плита, ты жмёшь ПКМ по плите и держишь в руке масло. Масло изчезает и ты получаешь блок раскалённого масла. Если взять стакан с водой и нажать ПКМ по блоку раскалённого масла то он взорвётся.
+ как бонус можете научится делать частицы на блоке. Ну они тут будут по крайней мере :)
Начинаем! И объяснении очень много, так-что не понять тяжело :)

Приступим создавая новый 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");
    }
}
Дальше. У нас подчёркивает то что нету class'ов: Oven1, OilBL, OilBlockHot, WaterBottle.
Создадим их.
Начинаем с простого. 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"); //Его текстура.
    }
}
Сделали. Дальше стакан воды WaterBottle. (К нему будет присвоен текст внизу).
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. Т.к. такая сила указана в коде блока с маслом.
А теперь скриншотики!
Плита с частицами огня:
2017-12-20_10.09.44.png

Блок раскалённого масла с частицами лавы и большого дыма:
2017-12-20_10.09.38.png

Как срабатывает взрыв вы можете увидеть в данном видео!

На этом моменте туториал подошёл к концу.
Надеюсь хоть как-никак он вам помог, и вы рады.

На этом всё.
  • Like
  • Wow
Реакции: hohserg, Baste и CMTV
Автор
jopi
Скачивания
6
Просмотры
1,452
Первый выпуск
Обновление
Оценка
4.00 звёзд 1 оценок

Другие ресурсы пользователя jopi

Последние рецензии

Туториал ниочём, но есть полезный код
Сверху