Вверх ↑
Ответов: 4557
#1: 2015-03-28 15:23:15 ЛС | профиль | цитата
Создание пилы



Item.java
  Для начала создадим в Item.java строчку:
public static Item hacksaw = (new ItemHacksaw(2012, EnumToolMaterial.EMERALD)).setUnlocalizedName("hacksaw");
Эта строчка прописывает наш Item в игре.
EnumToolMaterial.EMERALD - Материал - Алмаз (Не знаю, почему так записано в клиенте)

ItemHacksaw.java
  Переходим непосредственно к файлу нашего итема.
package net.minecraft.src;

public class ItemHacksaw extends ItemTool
{
private static Block[] blocksEffectiveAgainst = new Block[] {Block.wood};

protected ItemHacksaw(int par1, EnumToolMaterial par2EnumToolMaterial)
{
super(par1, 3, par2EnumToolMaterial, blocksEffectiveAgainst);
}

public boolean onBlockDestroyed(ItemStack iStack, World world, int blockID, int x, int y, int z, EntityLiving entity) {

if(!world.isRemote){
for(int j = y - 1; j ‹ y + 70; j++){
if(!(world.getBlockId(x, j, z) == Block.leaves.blockID)){
world.destroyBlock(x, j, z, true);
}

}
}

iStack.damageItem(1, entity);
return true;
}
public float getStrVsBlock(ItemStack par1ItemStack, Block par2Block)
{
return par2Block != null && (par2Block.blockMaterial == Material.wood) ? this.efficiencyOnProperMaterial : super.getStrVsBlock(par1ItemStack, par2Block);
}
}



private static Block[] blocksEffectiveAgainst = new Block[] {Block.wood}; - список блоки, с которыми будет работать инструмент. Если ломать блоки не из списка, то эффективность разрушения ухудшается.

    public float getStrVsBlock(ItemStack par1ItemStack, Block par2Block)
{
return par2Block != null && (par2Block.blockMaterial == Material.wood) ? this.efficiencyOnProperMaterial : super.getStrVsBlock(par1ItemStack, par2Block);
}

Задаем материалы, с которыми будет работать инструмент. В данном случае - дерево (не Log!)

А вот теперь начинается самое вкусное. Пила разрубает вверх определенное количество блоков.
В этом примере я ограничусь 70-ю блоками по Y.

    public boolean onBlockDestroyed(ItemStack iStack, World world, int blockID, int x, int y, int z, EntityLiving entity) {

if(!world.isRemote){
for(int j = y - 1; j ‹ y + 70; j++){
if(!(world.getBlockId(x, j, z) == Block.leaves.blockID)){
world.destroyBlock(x, j, z, true);
}

}
}

iStack.damageItem(1, entity);
return true;
}
Из названия понятно, что этот метод отвечает за ломание блоков.

        if(!world.isRemote){
for(int j = y - 1; j ‹ y + 70; j++){
if(!(world.getBlockId(x, j, z) == Block.leaves.blockID)){
world.destroyBlock(x, j, z, true);
}

}
}

Координаты.
На 70 Y вверх от места удара.

Также здесь идет небольшое правило:
     if(!(world.getBlockId(i, j, k) == Block.leaves.blockID)){
world.destroyBlock(i, j, k, true);
Листва не будет ломаться, если встретится по пути.


Таким образом мы получили свою собственную пилу, разрушающую
вверх на 70 блоков.
карма: 6
3
Голосовали:Nyan.Cat, ManaBreak, Astronaut, OTBETCTBEHHblN, MonkeyMini