Ищу помощь по переменным в блоках

Версия Minecraft
1.7.10
81
3
Здравствуйте. Ищу помощь в изучении локальных переменных. Хочу хранить в блоке некие данные. В моем случае чиловые, если я не ошибаюсь то это int. Думаю что сменить на стринг не проблема будет, но об этом позже.

Пока что нашел ток инфу по следующему уроку:
Урок на форуме по NBT
Но он для 1.8
При попыке переноса в 1.7 естественно были ошибки и прочие неполадки. Так же, я полагаю что информация указанная в уроке слишком замудренная для простой перменной. Может конечно я ошибаюсь.

Хочу понять как хранить переменные в блоке.
Выводить значение переменной предлагаю пкм по блоку(Это я уже реализовал)
Подскажите как создать в блоке переменную и увеличивать ее значение, скажем каждую секунду(Предполагаю, что скорее всего для этого нужно будет дельта тайм или похожее. Ну тогда может проще каждые 20 тиков или как проще реализовать? Еще не сталкивался с вопросом похожим)
Можете дописать, или если время жалко, то хотя бы подкинуть где изучить вопрос. Буду очень признателен за пояснения.
Спасибо.

Вот мой класс блока:
Код:
package evo.aizark.testblock;

//Импорты, нужны для работы кода.
import cpw.mods.fml.common.registry.GameRegistry;
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.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.world.World;

public class TestBlockValue extends Block {

    //тут я принимаю из менйна материал блока, его имя, текстуру.
    protected TestGenerator(Material p_i45394_1_, String name, String texture) {
        super(p_i45394_1_);
   
        this.setBlockName("TestBlock"); //Имя

        this.setLightLevel(0F);  //Излучает свет
        this.setLightOpacity(10); //Прозрачность, 10 не прозрачный
        this.setHardness(2.0F);  //Прочность
        this.setCreativeTab(Main.tabTest); //Вкладка креатива CreativeTabs.tabBlock
        this.setResistance(10.0F); //Взрывоустойчиовость. Обсидиан 10к или 20к. Не помню.
        this.setHarvestLevel("axe", 3); //Каким инструментом добывается
        this.setStepSound(soundTypeMetal); //Звук при шагах по блоку
        //this.setBlockUnbreakable(); //Неразрушаемость. Закоментированно, иначе не сломать.
        this.setBlockTextureName(Main.MODID+":test/"+texture); //Текстура блока. Каталоги будут такими "assets/another/textures/block/wood.png или (Main.MODID+":"+texture)(Main.MODID+":wood/"+texture)
   
   
        GameRegistry.registerBlock(this, name); //Регистрируем блок
   
   
    }

    // Ниже закоментирован код, Позволяет сделать блок проходимым. Я его закоментил для себя. Сейчас он мне не нужен.

/*    public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
        return null;
    } */

    //Ниже событие, когда мы пкм жмем по блоку.
    @SideOnly(Side.CLIENT)
    public boolean onBlockActivated(World world, int p2, int p3, int p4, EntityPlayer player, int p6, float p7, float p8, float p9) { //Ловим событие с клиента, активация блока пкм. Что дальше за магия идет я незнаю совсем. Буду рад если объяснят что за p8 и пр.
        Minecraft.getMinecraft().thePlayer.sendChatMessage("Тестовое сообщение"); // демонстрируем что пкм по блоку прошел.
   
        return true;
    }
}

Для удобства укажу как в мейне указал блок:
Java:
@EventHandler
    public void preLoad(FMLPreInitializationEvent event)
    {
        testblock = new TestBlockValue(Material.iron, "TestBlock", "TestBlockTexture");
    }
 
Последнее редактирование:
917
22
332
Вот это:
Java:
    @SideOnly(Side.CLIENT)
    public boolean onBlockActivated(World world, int p2, int p3, int p4, EntityPlayer player, int p6, float p7, float p8, float p9) { //Ловим событие с клиента, активация блока пкм. Что дальше за магия идет я незнаю совсем. Буду рад если объяснят что за p8 и пр.
        Minecraft.getMinecraft().thePlayer.sendChatMessage("Тестовое сообщение"); // демонстрируем что пкм по блоку прошел.
 
        return true;
    }

Уверен, что всё работает? А на сервере? Я не знаю специфики 1.7.10, но мне кажется должно быть так:
Java:
    @Override
    public boolean onBlockActivated(World world, int p2, int p3, int p4, EntityPlayer player, int p6, float p7, float p8, float p9) {
        player.sendChatMessage("Тестовое сообщение");  
        return true;
    }
Для того, чтобы переменная увеличивалась каждую секунду тебе нужно создать TileEntity.
 
81
3
Да сообщение работает, но пишется два раза. Твой вариант чекну, уверен он будет работать, более верно.

Вот про тайл энтити, это слышал в разговорах и про версии старше. Но мне ничего не говорит tile entity ибо не работал с этим. Это какой то отдельный класс создавать нужно в котором указываю просчет или в мейне что то прописывать. Прошу помощи
 
1,057
50
234
Java:
@Override
public void onBlockAdded(World world, int x, int y, int z)
{     
    world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world) + world.rand.nextInt(10));
}

@Override
public void updateTick(World world, int x, int y, int z, Random rand) {

//тут проверка на тики % 20 * sec и переменная
world.scheduleBlockUpdate(x, y, z, this, 0);
}

Сообщение обверни в (!world.isRemote)
 
81
3
А, вот что ты имел ввиду по оберткой. Спасибо! Я впервые вижу условие "если" с remoto, что remoto означает?

В коде что ты скинул вначале, не вижу переменную, ее объявление, можешь мне указать на очевидное? Планирую потом брать переменную, изменять внешне, а я ее не вижу:D

Код попробую написать и испытать, у компа буду спустя 3-4 часа. И отпишусь естественно.
 
81
3
что тебе вообще нужно, начнем с этого?
Если в перспективе, то:

Я хочу понять как создавать локальную переменную для блока, и ее изменять от условия.

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

Понятно, что есть полно вариантов создавать мод на ue или rf энерги. Так называемый аддон делать используя api.
Но тогда я буду хуже контроллировать процессы и буду хуже понимать в целом работу с майном. По этому я решил что стоит помалому разобраться и сделать свое.

Что бы переменная энергии, бесконечно не шла вверх, я сделаю вторую переменную отвечающую за максимальное колличество энергии в блоке. Ну и при начислении переменной будет проверка на условия. Что бы не было например 120 энергии из 100.

Потом начну разбирать тему с гуи. Надо понять каквызывать гуи. Как выводить текст и картинки, выводить показания переменных. Разберу тему с созданием слотов и примеры собственной печи.


Изучив печки и слоты, а так же отображение энергии в графическом виде(возможно растягиыая картинку отвечающую за заполнение хранилища)
Начну возиться с рабочими процессами в блоке. Не знаю как в майне. Но думаю на условиях, переменеых и апдейте блока, можно реализовать процесс.

Крч это все не для одного поста.

Да, сейчас я пытаюсь понять как хранить в блоке переменную и ее увеличивать на + каждые 20 тиков. По скольку это локальная переменная, то в каждом блоке свое колличество этой переменной. Дальше уже буду объявлять вторую переменную и возиться с ней.

Код прикрутить попытаюсь спустя час, сейчас в дороге.

Спасибо что даёте ответы
 
81
3
Блок - синглтон, поэтому переменная глобальная получается
Хочешь сказать что блок не может хранить в себе отдельно, важную толтко для него информацию, и в примере толтко глобал будет, распространяя переменную на все блоки7

Верно ли я тогда понимаю, что локал переменную можно реализовать только через nbt¿
 
1,038
57
229
Верно, единственное что ты можешь хранить в блоке, это meta состоящая по моему из 5 или 6 бит, остальные раньше использовались.
Щас наверное под неё отдельный байтик. Хороший пример такого применения - ростки хлеба, сажанцы деревьев. Они растут 0-15 = 16 значений включая 0, затем подменяются другим блоком(блоками)
Так что свою энергию ты можешь хранить именно там. И это будет одновременно две переменные (две, потому что верхнее значение уже определено тобой). Для простых блоков которые лишь передают её (провода) тебе должно хватить.
А такие блоки к контейнера энергии (её источники и потребители), всё же придется делать через TileEntity и nbt (сундук, табличка, печь...)
 
81
3
Большое спасибо, это хороший ответ по проводам, а так же можно сделать например солнечную панель или источник энергии из блока. Но как я понимаю лучше сначала сделать то, где эту энергию хранить. К твоему пояснению как раз обращусь во время создания проводов и источников энергии. Гениально, от всей души благодарю.... хоть я еще и не знаю как хранить в блоке инфу, не делал я растений, может изучение примеров с собственными растениями даст мне ответ.

Так, на счет тайл энетити. Вчера дико спать хотел, не отписался тут. Долго искал и нашел форджовую документацию. Гугл переводчик помогает. Дословно все почти понятно, хотя на примере полюбому ошибки и не понимание как связать, привязать запустить и итп.
ссылка на фордж: Home - Forge Documentation

Ушел, попытаюсь применить то что там объясняется, и отпишусь об успехах, но уверен что это будут потраченные пару часов в пустую, ибо буду идти на ощупь. Кто может помочь, показав пример и объяснить, было бы весьма прекрасно.
 
81
3
Так ну и первый же вопрос возникает при прочтении.
Мне пишут:
Чтобы создать TileEntity вам необходимо расширить класс TileEntity . Важно, чтобы у вашего TileEntity был конструктор по умолчанию, чтобы Minecraft мог правильно его загрузить. После того, как вы создали свой класс, вам нужно зарегистрировать TileEntity. Для этого вам нужно позвонить

Однако, класс то я пустой создать могу, но не указанно как связать с мейном этот класс, или класс сам по себе ни откуда не вызывается и потом только будет обращение. Я не понимаю что надо делать, и я начинаю ворчать =) Возможно для продвинутых это очевидно, но я не понимаю что они хотят сказать под extend the TileEntityclass. "Расширить" .

Верно ли я понимаю, что бы работать лучше с тайл энетити, надо изучить кастомную печку?
Пойду гуглить информацию о печах, надюсь это даст мне ответы.
 
1,038
57
229
extend - указание родителя, начни с Proxy.
call - не только звонок переводится, но и вызов метода (к примеру)
Когда ты сможешь закрытыми глазами с ним работать. Поймешь чуть больше.
TileEntity может быть и пустым, просто его надо зарегистрировать, как и блок, как и рендер блока, как и любой предмет. Ты его создаешь и регистрируешь.
Пусть там не всё так хорошо, и можно даже запутаться, но это хороший материал Структура мода - Minecraft Modding
Может кто на свой линк скинет.
 
Сверху