[1.7.2] Как работает класс Container?

398
4
7
Мне нужно отображать в GUI множество данных из TileEntity. Проблема в том, что данных очень много и меняются они часто, а значит методы getDescriptionPacket и onDataPacket в TileEntity не подходят для синхронизации.
Нужно синхронизировать данные только когда отрыт GUI. Как я понял, для этого лучше использовать контейнерные классы, а не GuiScreen.
Смотрел тему "Просто приведу пример с комментариями, как сделать GuiContainer". Возникло несколько вопросов:

1) На стороне сервера в GuiHandler-е создается объект ContainerTest каждый раз, когда кто-то открывает GUI (у одного и того же блока)? То есть, если несколько игроков откроет GUI у одного и того же блока, то создастся несколько объектов ContainerTest?

2) Из кода печки (класс ContainerFurnace):
Код:
    public void detectAndSendChanges()
    {
        super.detectAndSendChanges();

        for (int i = 0; i < this.crafters.size(); ++i)
        {
            ICrafting icrafting = (ICrafting)this.crafters.get(i);
Если на каждого открывшего GUI игрока, на стороне сервера есть по одному такому объекту, то зачем этот цикл? Что вообще находится в this.crafters ?

3) Можно ли сделать у ContainerTest конструктор вида
Код:
public ContainerComputer(EntityPlayer player, MyBlockTileEntity te) {
  var1 = player;
  var2 = te;
}
А потом в методе detectAndSendChanges отправлять пакеты (с данными из TileEntity) к player?
 
Asd73 написал(а):
Мне нужно отображать в GUI множество данных из TileEntity. Проблема в том, что данных очень много и меняются они часто, а значит методы getDescriptionPacket и onDataPacket в TileEntity не подходят для синхронизации.
Нужно синхронизировать данные только когда отрыт GUI. Как я понял, для этого лучше использовать контейнерные классы, а не GuiScreen.
Смотрел тему "Просто приведу пример с комментариями, как сделать GuiContainer". Возникло несколько вопросов:

1) На стороне сервера в GuiHandler-е создается объект ContainerTest каждый раз, когда кто-то открывает GUI (у одного и того же блока)? То есть, если несколько игроков откроет GUI у одного и того же блока, то создастся несколько объектов ContainerTest?

2) Из кода печки (класс ContainerFurnace):
Код:
    public void detectAndSendChanges()
    {
        super.detectAndSendChanges();

        for (int i = 0; i < this.crafters.size(); ++i)
        {
            ICrafting icrafting = (ICrafting)this.crafters.get(i);
Если на каждого открывшего GUI игрока, на стороне сервера есть по одному такому объекту, то зачем этот цикл? Что вообще находится в this.crafters ?

3) Можно ли сделать у ContainerTest конструктор вида
Код:
public ContainerComputer(EntityPlayer player, MyBlockTileEntity te) {
  var1 = player;
  var2 = te;
}
А потом в методе detectAndSendChanges отправлять пакеты (с данными из TileEntity) к player?
1) Ага.
2) Да ты же упорот. А как же РАССИНХРОНИЗАЦИЯ? Всем же надо сказать, что изменилось.
3) Твой контейнер, твои правила. Но проще, конечно, через ICrafting. Код там простейший.
 
Спасибо за ответы, но я еще не понял что содержится в this.crafters
Туда попадает лишь игрок открывший GUI?
Например, один игрок откроет GUI, создастся объект ContainerTest. Потом второй игрок откроет GUI, создастся еще один ContainerTest. В этом случае this.crafters в первом ContainerTest останется без изменений?
 
> Туда попадает лишь игрок открывший GUI?
Туда идет список открытых гуев.
> Например, один игрок откроет GUI, создастся объект ContainerTest. Потом второй игрок откроет GUI, создастся еще один ContainerTest. В этом случае this.crafters в первом ContainerTest останется без изменений?
Нет, конечно. Синхорнизируется же.

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