Ошибка в обработке onBlockActivated

Версия Minecraft
1.7.10

VeniVidiVici

Санта Барбарис
327
15
198
Преамбула

У меня есть блок "А".

К этому блоку "А" привязано два GUI, контейнер у них одинаковый (один и тот же).

Первое gui меняет значения int или boolean в TileEntity этого блока с отправкой пакетов (по отдельности происходит).
Второе gui показывает текущее состояние этих int и boolean переменных.

Я беру предмет (могут быть совершенно разные), нажимаю им ПКМ по этому блоку, предмет добавляется в блок "Б" (эти gui и контейнеры блок "Б" не трогают), а также у меня пропадает этот предмет.

Фабула

Если я меняю значение переменной в блоке "А" (в gui #1), а потом нажимаю этим предметом ПКМ на блок, у меня вылетает краш, который я прилагаю ниже.

Однако, если я меняю значение в блоке "А" (в gui #1), а перед использованием предмета открываю gui #2 (с обычным просмотром, пустой рукой), либо перезахожу из меню, либо открываю какое-либо другое gui, то последующее использование предмета проходит штатно.

Ошибка возникает непосредственно из-за player.inventory.consumeInventoryItem(item). Без него всё работает, со сменой значений и без. Но, чёрт возьми, не понимаю почему такая шляпа.

Соль в том, что в краше логированы значения математики, выполняемые перед consumeInventoryItem, в них все значения новые (после изменений, значит пакеты проходят).

На форуме почти ничего не нашёл. Есть вот такая тема, но там что-то другое.

Класс блока:
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int integ, float i, float u, float j)
{
    if (world.isRemote)
        return true;
    else
    {
        /** Тут ещё разные условия и т.д. **/
        if (MoneyMath.storageCoins(factory.storage) >= cost)
        {
            tileStorage.addContents(k, new ItemStack(item, 1));
            MoneyMath.addCoins(player, cost);
            MoneyMath.factorySpend(factory.storage, cost);
            player.inventory.consumeInventoryItem(item); /** Вот тут проблема **/
            player.inventoryContainer.detectAndSendChanges();
            return true;
        }
        /** Дальше другой код**/
    }
    return false;
}
 
Краш-лог
[03:17:33] [Server thread/INFO] [STDOUT]: [com.directory.MoneyMath:factorySpend:486]: Операция выполнена успешно.
[03:17:33] [Server thread/ERROR]: Encountered an unexpected exception
net.minecraft.util.ReportedException: Ticking memory connection
at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:198) ~[NetworkSystem.class:?]
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) ~[MinecraftServer.class:?]
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) ~[MinecraftServer.class:?]
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) ~[IntegratedServer.class:?]
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?]
at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?]
Caused by: java.lang.NullPointerException
at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:657) ~[NetHandlerPlayServer.class:?]
at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74) ~[C08PacketPlayerBlockPlacement.class:?]
at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122) ~[C08PacketPlayerBlockPlacement.class:?]
at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) ~[NetworkManager.class:?]
at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) ~[NetworkSystem.class:?]
... 5 more
[03:17:33] [Server thread/INFO]: Stopping server
[03:17:33] [Server thread/INFO]: Saving players
[03:17:33] [Client thread/INFO] [STDOUT]: [net.minecraft.client.Minecraft:displayCrashReport:388]: ---- Minecraft Crash Report ----
// Oh - I know what I did wrong!

Time: 16.05.20 3:17
Description: Ticking memory connection

java.lang.NullPointerException: Ticking memory connection
at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:657)
at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)
at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)
at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)
at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)
at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Stacktrace:
at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:657)
at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)
at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)
at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)

-- Ticking connection --
Details:
Connection: net.minecraft.network.NetworkManager@4d5a99db
Stacktrace:
at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)
at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)
Краш-лог:
[03:17:33] [Server thread/INFO] [STDOUT]: [com.directory.MoneyMath:factorySpend:486]: Операция выполнена успешно.
[03:17:33] [Server thread/ERROR]: Encountered an unexpected exception
net.minecraft.util.ReportedException: Ticking memory connection
	at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:198) ~[NetworkSystem.class:?]
	at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) ~[MinecraftServer.class:?]
	at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) ~[MinecraftServer.class:?]
	at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) ~[IntegratedServer.class:?]
	at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?]
	at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?]
Caused by: java.lang.NullPointerException
	at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:657) ~[NetHandlerPlayServer.class:?]
	at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74) ~[C08PacketPlayerBlockPlacement.class:?]
	at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122) ~[C08PacketPlayerBlockPlacement.class:?]
	at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) ~[NetworkManager.class:?]
	at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) ~[NetworkSystem.class:?]
	... 5 more
[03:17:33] [Server thread/INFO]: Stopping server
[03:17:33] [Server thread/INFO]: Saving players
[03:17:33] [Client thread/INFO] [STDOUT]: [net.minecraft.client.Minecraft:displayCrashReport:388]: ---- Minecraft Crash Report ----
// Oh - I know what I did wrong!

Time: 16.05.20 3:17
Description: Ticking memory connection

java.lang.NullPointerException: Ticking memory connection
	at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:657)
	at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)
	at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)
	at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)
	at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)
	at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)
	at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)
	at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)
	at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)
	at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Stacktrace:
	at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:657)
	at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)
	at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)
	at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)

-- Ticking connection --
Details:
	Connection: net.minecraft.network.NetworkManager@4d5a99db
Stacktrace:
	at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)
	at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)
	at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)
	at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)
	at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)
	at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)
Последнее редактирование:

timaxa007

Модератор
5,831
409
672
как решить вопрос
Думаю мало кто сможет, учитывая маленький код.
/** Вот тут проблема **/
Caused by: java.lang.NullPointerException
at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:657) ~[NetHandlerPlayServer.class:?]
Ты каким-то образом ломаешь пакет. Тут всякое может быть. Не зарегистрированный твой пакет, не правильный id у твоего пакета, может твой Handler пакетов не правильно написан или не правильно используется какой-то Hanlder пакетов.
player.inventory.consumeInventoryItem(item); /** Вот тут проблема **/
И мы должны быть уверены, что item это наследник Item, а не null.
Думаю, лучше будет все return делать true.
 

VeniVidiVici

Санта Барбарис
327
15
198
Думаю, лучше будет все return делать true.
Всяко пробовал

И мы должны быть уверены, что item это наследник Item, а не null.
Точно не null, чуть выше есть другой метод, который успешно этот item обрабатывает.

Ты каким-то образом ломаешь пакет. Тут всякое может быть. Не зарегистрированный твой пакет, не правильный id у твоего пакета, может твой Handler пакетов не правильно написан или не правильно используется какой-то Hanlder пакетов.
Пакетов там уже много, по накатанной, вроде как все всегда работали :unsure:

В любом случае, спасибо за советы (y)
 
Сверху