Генерация и сбор растения (1.7.10)

Статус
В этой теме нельзя размещать новые ответы.
4,167
68
693
Здравствуйте всем!

Задача следующая:
Я создал блок типа BlockBush (должен напоминать траву) и задал ему определённый дроп, добываемый любым инструментом, в том числе и рукой.
1 - как сделать, чтобы данный блок можно было срезать обычными ножницами?
Пока что я нашёл только метод, реагирующий на шёлковое касание:
Код:
public Item getItemDropped(int par1, Random random, int par2)
{
return TestMod.testBlock;
}
      
public int quantityDropped()
{           
return 1;
}

protected boolean canSilkHarvest()
{
return true;
}


И то, этот метод реагирует на любой инструмент с данным эффектом.

2 - Как заставить блок генерироваться на других определённых блоках (именно в момент генерации мира!)?
Как я понял, строка:
Код:
GameRegistry.registerWorldGenerator(testblockgenerator, 0);

говорит о последовательности генерации блоков. 0 - самая первая очередь (камень и руды), далее пещеры, далее блоки земли, далее трава и т.д. Полной последовательности я не знаю.

Но необходимо, чтобы мой блок генерировался уже в самом конце в оставшихся блоках воздуха и соблюдал определённые условия, например как тростник появляется на песке рядом с водой.

Спасибо )
 
проверяй что у игрока в руке и создавай дропнутый блок.
ItemStack is = player.getCurrentEquippedItem();
if( is != null && is.getItem() == ... ) {
...
}

Код из файла net.minecraft.block.Block.class

Код:
/**
     * Called upon block activation (right click on the block.)
     */
    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_)
    {
        return false;
    }

/**
     * Called when a player hits the block. Args: world, x, y, z, player
     */
    public void onBlockClicked(World p_149699_1_, int p_149699_2_, int p_149699_3_, int p_149699_4_, EntityPlayer p_149699_5_) {}


от которого все и наследуются. А дроп сделай пустым
 
Ага... Ща попробуем.

Но я тут начал разбираться с генератором. Залез в генератор тростника и попробовал повторить, но почему-то он ругается на закрывающиеся скобки как ) так и }.

Не могу понять, в чём затык:
Код:
import java.util.Random;

import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.WorldGenerator;

public class TestGenerator extends WorldGenerator
{
    public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5)
    {
        if (par1World.getBlock(par3, par4, par5) == Blocks.air)
            
            }
            par1World.setBlock(par3, par4, par5, TestMod.testBlock);
            }
            
    return true;
    
    }
}

Что я делаю не так?
 
Быдло код
Код:
import java.util.Random;

import net.minecraft.block.Block;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.WorldGenerator;

public class MyWorldGenerate extends WorldGenerator
{
    /** The ID of the plant block used in this plant generator. */
    private int plantBlockId;

    public MyWorldGenerate(int par1)
    {
        this.plantBlockId = par1;
    }

    public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5)
    {
        for (int l = 0; l < 64; ++l)
        {
            int i1 = par3 + par2Random.nextInt(8) - par2Random.nextInt(8);
            int j1 = par4 + par2Random.nextInt(4) - par2Random.nextInt(4);
            int k1 = par5 + par2Random.nextInt(8) - par2Random.nextInt(8);

            if (par1World.isAirBlock(i1, j1, k1) && (!par1World.provider.hasNoSky || j1 < 127) && Block.blocksList[this.plantBlockId].canBlockStay(par1World, i1, j1, k1))
            {
                par1World.setBlock(i1, j1, k1, this.plantBlockId, 0, 2);
            }
        }

        return true;
    }
}

Вот код с цветов, разберешься...думаю сам.
 
Эх... Да видел я код с цветов и чё-т не разобрался... Да и скобку убирать пробовал и всё равно.
Для чего служат все эти переменные в цветах? Для рандома на местности? Но мне как-раз рандом не нужен. Мне нужно чтобы блок появлялся строго над другим блоком всегда.

Поэтому я убрал все эти "for".
Или зря убрал?

Кто-нибудь может объяснить как работает данный генератор?
 
Да да,это рандомные xyz.  Цикл для того,чтобы было несколько растений,как я понял(дракон,не ори если что. Не написано вообще в доках,)
 
Ай-яй-яй, Модератор. И опять, как не стыдно?

Так! Ну а если мне нужно одно растение, всё равно нужен это for?

Ну хорошо: i1, j1, k1 - это рандомные переменные, это ясно.
Но что означает строка
Код:
for (int l = 0; l < 64; ++l)

Где эта L дальше встречается и за что отвечает?
 
Liahim написал(а):
Ай-яй-яй, Модератор. И опять, как не стыдно?

Так! Ну а если мне нужно одно растение, всё равно нужен это for?

Ну хорошо: i1, j1, k1 - это рандомные переменные, это ясно.
Но что означает строка
Код:
for (int l = 0; l < 64; ++l)

Где эта L дальше встречается и за что отвечает?
Инт l сравнивают с 0. Тут выполнение условия.
 
Поставь вместо 64  ,например 1024 и посмотри результат
 
Не делай так. В чанк тупо не влезет. Поставь 3,сделай блок,который будет выводить свои коорды,посмотри по коордам. 3 блока на чанк должно быть
 
Не... Чо-т вааще не понимаю.
А каким образом его регистрировать в игре?
Если я пишу:
Код:
testGenerator = new TestGenerator();        
GameRegistry.registerWorldGenerator(testGenerator, 0);

прога выдаёт ошибку и пытается изменить тип генератора на IWorldGenerator, но он-то мне не нужен.

Сколько в код не вчитывался, не понимаю, каким образом заставляют работать генераторы декораций.
 
Salamandr написал(а):
проверяй что у игрока в руке и создавай дропнутый блок.

Эм. Прошу прощения.
Объясните чайнику, а как создать блок дропнутым? )))
[merge_posts_bbcode]Добавлено: 04.04.2015 12:47:04[/merge_posts_bbcode]

Да! И ещё нашёл в траве такую конструкцию:
Код:
@Override
public boolean isShearable(ItemStack item, IBlockAccess world, int x, int y, int z)
{
return true;
}

@Override
public ArrayList<ItemStack> onSheared(ItemStack item, IBlockAccess world, int x, int y, int z, int fortune)
{
ArrayList<ItemStack> ret = new ArrayList<ItemStack>();
ret.add(new ItemStack(this, 1, world.getBlockMetadata(x, y, z)));
return ret;
}


По идее, она как раз отвечает за срезание блока. Но как работает не могу понять... Да и причём тут ArrayList?

Кто может, помогите.
Спасибо )
 
О! Заработало! ))) Спасибо )
Только сейчас вместе со срезанным блоком выпадает ещё и дроп с него...
Как с этим справиться?

И можно ли обойтись без ArrayList, если мне нужен либо один дроп с блока, либо сам срезанный блок без бропа?
 
Как? )))

Сейчас код выглядит так:
Код:
public Item getItemDropped(int par1, Random random, int par2)
{
return TestMod.testItem;
}
      
public int quantityDropped()
{
return 1;
}
    
@Override
public boolean isShearable(ItemStack item, IBlockAccess world, int x, int y, int z)
{
return true;
}

@Override
public ArrayList<ItemStack> onSheared(ItemStack item, IBlockAccess world, int x, int y, int z, int fortune)
{
ArrayList<ItemStack> ret = new ArrayList<ItemStack>();
ret.add(new ItemStack(this, 1, world.getBlockMetadata(x, y, z)));
return ret;
}

Выдаёт одну единицу дропа без ножниц, а с ножницами опять же одна единица + срезанные блок.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху