Свой блок с инвентарем 1.7.10

Версия Minecraft
1.7.10
116
4
Некорректные теги
Я хочу сделать стойку, которую надо будет ставить под солнце и на нее надо будет вешать сырую кожу, которая будет заменяться на высохшую кожу через некоторое время.
На что будет похож код этой стойки и сам рецепт кожи? На печку, которая постоянно горит без топлива? В каком направлении мне идти? Что изучать?
Может посмотреть код солнечных панелей?
 

Eifel

Модератор
1,623
78
608
Ну если просто, то тебе надо блок с тайлэнтити(с инвентарем)(похоже на печку), какая-то прикольная моделька и TESR(Tile Entity Special Renderer). При клике по блоку сырой кожей, в методе Block#onBlockActivated достаем тайл -> инвентарь и помещаем туда кожу. В тайле, в методе TileEntity#update проверяем, что у нас есть день и кожа в инвентаре, запускаем какой-то счетчик(если условия изменились, то останавливаем или же сбрасываем - зависимо от условий). Если счетчик дошел до определенного значения - заменяем сырую кожу на кожу. После чего игрок тем же кликом может забрать эту кожу. Дополнительно можно сделать еще чтобы при взаимодействии с блоком открывалась гуиха с инвентарем и слотами, в которые можно положить кожу, после чего запускается тот же процесс(опять же печка). Для этого надо почитать о тайлах, , гуи и контейнерах и как это все зарегать(реализацию можно глянуть опять же в печке). А с помощью TESR отрисовать кожу на твоем блоке, да бы было красиво. И кстати, где-то я уже такую реализацию видел, вот точь в точь, можешь погуглить по модам.
Как одна из идей...
 
Последнее редактирование:
116
4
А сделать это с стойку для сушки с GUI намного сложнее, чем без?
Такая стойка есть в моде PrimalCore(закрытый код,1.10.2+) И в моде HarderWildlife(закрытый код, 1.7.10, но там есть вещи, которые не нужны, а в конфиге отключить нельзя...)
 
116
4
Я понимаю, что проще, но насколько? GUI кастомного инвентаря - большая отдельная тема? Или достаточно немного посидеть, прежде чем что-то сделать, при условии, что я недавно начал делать моды и делал только ингридиенты для крафта, инструменты, оружие, креативтаб, еду, блоки + пару событий при помощи Thunder, SuperCatMaster, BlesseNTumble и ОГРОМНОЙ помощи Timaxa!
 

Eifel

Модератор
1,623
78
608
Начни с малого, разберись, подучи язык(так у тебя много вопросов отойдет само собой), попробуй какие-то обычные гуи типа книги. Тогда берись за чет сложнее. Сначала попробуй какой-то простой, например сундук, потом сделай аналог печки и разберись, а затем без проблем напишешь свой механизм(ну у меня это так происходило, суть ты уловил дуаю).
 

timaxa007

Модератор
5,831
409
672
Зависит на сколько знает человек. Не придётся регистрировать GuiHandler, делать Gui и Container, создание текстуры для Gui, настройки метода в контейнере, который срабатывает по Shift+клику и т.п.
А вот делать Gui или нет, зависит от того что ты хочешь. Хочешь видеть статус изготовления, видит-ли блок солнце. Или просто без Gui просто быстро положишь и всё, а вот идёт изготовление или нет, придётся догадываться.
 
1,038
57
229
если сильно не заморачиваться, то для данной задачи хватило бы тикающего блока, меняющего метадату
всё верно

они не нужны, тут блок либо без шкуры, либо с сырой шкурой, либо с высушенной шкурой
 
1,038
57
229
Лампочка и печь всегда были в виде двух блоков, в общем такое решение тоже имеет место быть и оно гораздо проще.
 
116
4
Ну если просто, то тебе надо блок с тайлэнтити(с инвентарем)(похоже на печку), какая-то прикольная моделька и TESR(Tile Entity Special Renderer). При клике по блоку сырой кожей, в методе Block#onBlockActivated достаем тайл -> инвентарь и помещаем туда кожу. В тайле, в методе TileEntity#update проверяем, что у нас есть день и кожа в инвентаре, запускаем какой-то счетчик(если условия изменились, то останавливаем или же сбрасываем - зависимо от условий). Если счетчик дошел до определенного значения - заменяем сырую кожу на кожу. После чего игрок тем же кликом может забрать эту кожу. Дополнительно можно сделать еще чтобы при взаимодействии с блоком открывалась гуиха с инвентарем и слотами, в которые можно положить кожу, после чего запускается тот же процесс(опять же печка). Для этого надо почитать о тайлах, , гуи и контейнерах и как это все зарегать(реализацию можно глянуть опять же в печке). А с помощью TESR отрисовать кожу на твоем блоке, да бы было красиво. И кстати, где-то я уже такую реализацию видел, вот точь в точь, можешь погуглить по модам.
Как одна из идей...

По идее там даже не нужно унаследовать класс BlockContainer, да?
Посмотрел класс котла, он наследует класс блока и все отлично, как раз изменяется метадата(но котла с измененной методатой я в майнкрафте не нашел) котла при определенных действиях.
 
Последнее редактирование:
116
4
Как ты в блоке собираешься хранить стаки которые сейчас обрабатываются?

Ты пологал, что я сделаю возможность хранить в блоке больше 1 кожи за раз? Нет, если одна кожа будет лежать на другой, то процесс сушки обеих замедлится. Я делаю упор на реалистичность, так что такого не будет.
 
116
4
Шкура бывает разная и из разных животных. Тогда это не прокатит.
А можно же сделать как у котла
Код:
/**
     * Called upon block activation (right click on the block.)
     */
    public boolean onBlockActivated(World p_149727_1_, int p_149727_2_, int p_149727_3_, int p_149727_4_, EntityPlayer p_149727_5_, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_)
    {
        if (p_149727_1_.isRemote)
        {
            return true;
        }
        else
        {
            ItemStack itemstack = p_149727_5_.inventory.getCurrentItem();

            if (itemstack == null)
            {
                return true;
            }
            else
            {
                int i1 = p_149727_1_.getBlockMetadata(p_149727_2_, p_149727_3_, p_149727_4_);
                int j1 = func_150027_b(i1);

                if (itemstack.getItem() == Items.water_bucket)
                {
                    if (j1 < 3)
                    {
                        if (!p_149727_5_.capabilities.isCreativeMode)
                        {
                            p_149727_5_.inventory.setInventorySlotContents(p_149727_5_.inventory.currentItem, new ItemStack(Items.bucket));
                        }

                        this.func_150024_a(p_149727_1_, p_149727_2_, p_149727_3_, p_149727_4_, 3);
                    }

                    return true;
                }
                else
                {
                    if (itemstack.getItem() == Items.glass_bottle)
                    {
                        if (j1 > 0)
                        {
                            if (!p_149727_5_.capabilities.isCreativeMode)
                            {
                                ItemStack itemstack1 = new ItemStack(Items.potionitem, 1, 0);

                                if (!p_149727_5_.inventory.addItemStackToInventory(itemstack1))
                                {
                                    p_149727_1_.spawnEntityInWorld(new EntityItem(p_149727_1_, (double)p_149727_2_ + 0.5D, (double)p_149727_3_ + 1.5D, (double)p_149727_4_ + 0.5D, itemstack1));
                                }
                                else if (p_149727_5_ instanceof EntityPlayerMP)
                                {
                                    ((EntityPlayerMP)p_149727_5_).sendContainerToPlayer(p_149727_5_.inventoryContainer);
                                }

                                --itemstack.stackSize;

                                if (itemstack.stackSize <= 0)
                                {
                                    p_149727_5_.inventory.setInventorySlotContents(p_149727_5_.inventory.currentItem, (ItemStack)null);
                                }
                            }

                            this.func_150024_a(p_149727_1_, p_149727_2_, p_149727_3_, p_149727_4_, j1 - 1);
                        }
                    }
                    else if (j1 > 0 && itemstack.getItem() instanceof ItemArmor && ((ItemArmor)itemstack.getItem()).getArmorMaterial() == ItemArmor.ArmorMaterial.CLOTH)
                    {
                        ItemArmor itemarmor = (ItemArmor)itemstack.getItem();
                        itemarmor.removeColor(itemstack);
                        this.func_150024_a(p_149727_1_, p_149727_2_, p_149727_3_, p_149727_4_, j1 - 1);
                        return true;
                    }

                    return false;
                }
            }
        }
    }

А это значит, что можно написать много различных рецептов для этого блока. В зависимости от шкуры будет меняться на определенную метадату блока с текстурой шкуры моба, чья шкура хранится сейчас в блоке. Так по идее таймер можно привезать к каждому предмету, например, мокрая кожаная шапка сохнет быстрее, чем кожаная куртка. То есть отдельный таймер для шапки и для куртки.
 
Сверху