Создание пилы
Item.java
Для начала создадим в Item.java строчку:
public static Item hacksaw = (new ItemHacksaw(2012, EnumToolMaterial.EMERALD)).setUnlocalizedName("hacksaw");
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 блоков.