Контейнер на локальной серверной части

Версия Minecraft
1.7.10
355
2
17
Добро! Если делать кастомный контейнер и тестировать его в одиночке, то вылетает из-за того, что на внутреннем сервере другой контейнер и количество слотов отличается.

Пробовал с IGuiHandler, но getServerGuiElement не вызывается на внутреннем сервере, даже если регистрировать его в общем прокси. Как это можно исправить? На выделенном сервере думаю все будет работать, т.к. будет вызываться getServerGuiElement, а тут как?

1584441483491.png
 
Решение
Эээээм, а ничего что ты открываешь на клиенте? :m_faceplam: :m_faceplam: :m_faceplam:
Господи, я так и думал почему-то. Тебе пакет нужно отправлять на сервер, нажатие клавиши ведь срабатывает ТОЛЬКО НА КЛИЕНТЕ. И там уже открывать свой гуи.
GuiHandler работает так: открываешь на сервере, он сам шлет пакет на клиент и там показывает гуишку. НО НЕ НАОБОРОТ.
355
2
17
Ну, собственно погоду не поменяло, регистрирую в корне мода в preInit этот хэндлер - вызывается только Клиентский.
Интегрированный сервер как-то там по особому работает, он игнорирует большинство всяких серверных хэндлеров
 
355
2
17
В ClientProxy регистрирую KeyHandler
FMLCommonHandler.instance().bus().register(keyHandler);

Java:
    @SubscribeEvent
    public void onKeyInput(InputEvent.KeyInputEvent event)
    {
        if (INVENTORY_KEY.isPressed())
        {
            if (minecraft.currentScreen == null)
            {
//                minecraft.thePlayer.openGui(Mod.instance, 0,
//                              minecraft.thePlayer.worldObj, (int) minecraft.thePlayer.posX, (int) minecraft.thePlayer.posY, (int) minecraft.thePlayer.posZ);

                FMLNetworkHandler.openGui(minecraft.thePlayer, Mod.instance, 0,
                  minecraft.thePlayer.worldObj, (int) minecraft.thePlayer.posX, (int) minecraft.thePlayer.posY, (int) minecraft.thePlayer.posZ);
            }
        }
    }

IGuiHandler

Java:
public class UIHandler
        implements IGuiHandler
{
    @Override
    public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z)
    {

        Logger.info("UI Server element {ID: %s}", ID);

        switch (ID)
        {
            case 0:
            {
                return new MainContainer(player, player.inventory, new ExtendInventory(player), new QuestInventory());
            }
        }
        return null;
    }

    @Override
    public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z)
    {

        Logger.info("UI Client element {ID: %s}", ID);

        switch (ID)
        {
            case 0:
            {
                return new UIMainInventory(new MainContainer(player, player.inventory, new ExtendInventory(player), new QuestInventory()));
            }
        }
        return null;
    }
}


Ну и в корне

Java:
    @Mod.EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
        proxy.preInit(event);
        NetworkRegistry.INSTANCE.registerGuiHandler(this, new UIHandler());
    }

Контейнера и инвентари пока нигде не храню, пытаюсь просто завести. Поэтому там везде new
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Эээээм, а ничего что ты открываешь на клиенте? :m_faceplam: :m_faceplam: :m_faceplam:
Господи, я так и думал почему-то. Тебе пакет нужно отправлять на сервер, нажатие клавиши ведь срабатывает ТОЛЬКО НА КЛИЕНТЕ. И там уже открывать свой гуи.
GuiHandler работает так: открываешь на сервере, он сам шлет пакет на клиент и там показывает гуишку. НО НЕ НАОБОРОТ.
 
355
2
17
А, ну собственно да, ранее так и делал, провтыкал видать этот момент.
Но все же, если у меня есть отдельный ServerProxy, в котором я регистрирую всякие обработчики пакетов и прочие трали-вали, как вызывать обработку ServerProxy если это интегрированный сервер?

И еще вспомнил проблемку одну с этой отправкой пакета, при открытии такого GUI бывают микро задержки в 0.5 секунд где-то, и в принципе логично, это может быть связанно как раз таки с отправкой пакетов, но ванильный инвентарь работает без этих задержек, что может влиять?
 

tox1cozZ

aka Agravaine
8,454
598
2,890
ClientProxy - только для клиента. ServerProxy - только для физического, отдельно запущенного сервера. CommonProxy - для логического сервера(одиночки).

И еще вспомнил проблемку одну с этой отправкой пакета, при открытии такого GUI бывают микро задержки в 0.5 секунд где-то
Не замечал такого, показывай свои пакеты и где отправляешь.
 
355
2
17
Ранее на версии 1.6.4 был такой пакет, который отправлялся в Packet250CustomPayload

Java:
    @Override
    public byte[] getBytes()
    {
        try {

            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            DataOutputStream out = new DataOutputStream(bytes);

            out.writeUTF("open:inventory");
            out.writeInt(ID);

            return bytes.toByteArray();

        } catch (IOException ex) {ex.printStackTrace();}

        return new byte[] {};
    }


При получении собственно вызывал FMLNetworkHandler.openGui
И IGuiHandler

Java:
    @Override
    public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z)
    {
        ExtendedPlayer extendedPlayer = ExtendedPlayer.get(player);

        switch (ID)
        {
            case 2:
                ServerProxy.handleQuestsData(player);
                return new RPGContainer(player, player.inventory, extendedPlayer.getInventory(), extendedPlayer.getInventoryQuests());
        }

        return null;
    }


    @Override
    public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z)
    {
        ExtendedPlayer extendedPlayer = ExtendedPlayer.get(player);

        switch (ID)
        {
            case 2:
                return new GuiRpgInventory(player, new RPGContainer(player, player.inventory, extendedPlayer.getInventory(), extendedPlayer.getInventoryQuests()));
        }

        return null;
    }

Сам контейнер по сути не сильно отличается от ванильного, просто слотов чутка больше, ничего сверх гениального
 
355
2
17
CommonProxy - для логического сервера(одиночки)
Вернусь к проблеме, логический сервер по сути не инициализируется отдельно, это все по сути на стороне Клиента.
У меня просто самая обычная структура Client, Common, Server. В конечном счете, в собранном .jar файле отсутствует исключающая сторона.

Так вот, на этих сторонах элементы регистрируются отдельно и не пересекаются с друг другом, единственное что у них общее это все что в Common. И соответственно пакеты, перехватчик и их обработка разбита на эти обе части. И получается так, что в сингл игре не зарегистрированы серверные пакеты и их обработка.

Но для дебага и тестов я использую одиночку и очень как раз таки нужна инициализация серверной части, без всякого вырезания и вставки кода лишний раз. Обычными путями такое можно провернуть?
 
355
2
17
Ну типа, зачем мне использовать вырезалку, если я изначально планирую архитектуру разделяя все элементы на свои стороны? Хотя, судя по тому как вот все зависимо, то придется кашу лепить.

Запускать то можно, но это на уровне того что и вырезать вставлять код - трата времени.
 
Сверху