RenderWorldLastEvent и данные...

Версия Minecraft
1.7.10
173
1
3
РЕШЕНО! ОТВЕТ НИЖЕ!  :)

Приветствую.

Проблема такая: я рендерю коробку в мире через RenderWorldLastEvent. Он берет данные из tileEntity, который стоит в мире. 
Моя цель в том, чтобы размеры этой коробки можно было менять через гуи, которая открывается по нажатию на тайл. Но вот беда, он умеет брать этот тайл только на клиенте, то есть через Minecraft.getMinecraft().theWorld, а изменения через мои гуи посылают пакеты на сервер. 

То есть получается так, что игрок видит рендер клиентской коробки. Если он ее меняет, то она меняется сначала в соответствии с сервером, после перезахода на сервер коробка рендерится по стандартным значениям (Неправильными!), но серверная коробка остается правильной. То есть при последующем смещении идет десинхрон.

Вот пара скриншотов для понимания происходящего...
Что видит 1 игрок до движения коробки через гуи


Что видит 2 игрок до движения коробки через гуи(Всё одинаково)


Вот первый игрок сдвинул коробку через гуишку и отлетел назад:


В это время второй игрок просто смотрел на происходящее, для него ничего не изменилось


На сервере коробка стоит правильно. Это точно проверено, свои функции она выполняет. Но для обоих игроков после перезахода на сервер она будет выглядеть одинаково стандартно


Вот и вопрос: Можно ли как-то отослать в этот RenderWorldLastEvent серверный мир, или же каким образом можно зарендерить поля и линии в мире независимо от эвента, а, скажем, в каком-нибудь тайле?
 
4,045
63
645
В ГУИ печки (или в контейнере...) есть спецметод для обновления прогрессбаров на клиенте. Может действовать таким же способом?


Хотя, наверное, это будет работать только когда ты в ГУИ.


Тогда, видимо, только обратные пакеты ))) С сервера на клиент...
Пример: при использовании костной муки на каком-нибудь растении, частицы от этого использования видят все игроки... Хотя, там, вроде, даже радиус можно задать, кому из игроков пакет доставляется, а кому нет...
 
173
1
3
Что-то я туплю как обратные пакеты слать...

На сервер научился через IMessage отправлять с помощью MODID.sendToServer(new Message()), а вот как на клиент? :D
 
173
1
3
Так он там вроде EntityPlayerMP, а где ж мне его брать?
 
2,505
81
397
markDirty() это вообще не то.
Я так понял стоит задача синхронизировать данные тайла между всеми? Тогда нужно смотреть табличку.


В табличке переопределен метод
public Packet getDescriptionPacket()
Вот только я не знаю, что это за Packet, точнее нужно ли его как-то регистрировать.
 
173
1
3
Уффф... Решено.
Порыскал на форуме через запрос с этими методами, помог код Тимахи: 
Код:
@Override
    public Packet getDescriptionPacket() {
        NBTTagCompound nbt = new NBTTagCompound();
        writeToNBT(nbt);
        return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, nbt);
    }

// Timahe privet!

    @Override
    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) {
        readFromNBT(packet.func_148857_g());
    } 

Всем огромное спасибо. На самом деле труднее всего было просто сформулировать эту проблему ибо я уже наворотил десятки методов по синхронизации через тики, это было ужасно муторно и к тому же не работало.
 
173
1
3
... Не до шло... Каким образом?
 
173
1
3
Но... Я же уже синхронизирую отдельные величины в writeToNBT?
Код:
@Override
    public Packet getDescriptionPacket() {
        NBTTagCompound compound = new NBTTagCompound();

        writeSync(compound);
        return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, compound);
    }

    public void writeSync(NBTTagCompound compound) {
        compound.setInteger("RadiusAX", radiusAX);
        compound.setInteger("RadiusAY", radiusAY);
        compound.setInteger("RadiusAZ", radiusAZ);
        compound.setInteger("RadiusBX", radiusBX);
        compound.setInteger("RadiusBY", radiusBY);
        compound.setInteger("RadiusBZ", radiusBZ);
    } 


Разве это не оно?
 
Сверху