Ошибка L2J_Mobius_12.2_ShieldOfKingdom

Статус
В этой теме нельзя размещать новые ответы.

Егоровна

Знаменитый
Участник
Сообщения
45
Розыгрыши
0
Репутация
0
Реакции
5
Баллы
1 245
Хроники
  1. Master Class
Исходники
Присутствуют
Сборка
Mobius_12.2_ShieldOfKingdom
Кто-нибудь сталкивался?
Я так понял какого-то предмета не хватает в инвентаре

JavaScript:
[21/08 10:11:06] Restore Cross
[21/08 10:11:10] Error writing packet ExCrossEventInfo to client (Cannot invoke "org.l2jmobius.gameserver.model.item.instance.Item.getCount()" because the return value of "org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory.getItemByItemId(int)" is null) [Character: rwrr[268512960] - Account: w - IP: 127.0.0.1]]]
[21/08 10:11:10] java.lang.NullPointerException: Cannot invoke "org.l2jmobius.gameserver.model.item.instance.Item.getCount()" because the return value of "org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory.getItemByItemId(int)" is null
    at org.l2jmobius.gameserver.network.serverpackets.crossevent.ExCrossEventInfo.writeImpl(ExCrossEventInfo.java:52)
    at org.l2jmobius.gameserver.network.serverpackets.ServerPacket.write(ServerPacket.java:154)
    at org.l2jmobius.gameserver.network.serverpackets.ServerPacket.write(ServerPacket.java:31)
    at org.l2jmobius.commons.network.WritablePacket.writeDataToBuffer(WritablePacket.java:72)
    at org.l2jmobius.commons.network.WritablePacket.writeData(WritablePacket.java:48)
    at org.l2jmobius.commons.network.Client.write(Client.java:144)
    at org.l2jmobius.commons.network.Client.writeNextPacket(Client.java:129)
    at org.l2jmobius.commons.network.internal.fairness.SingleBucketStrategy.doNextAction(SingleBucketStrategy.java:42)
    at org.l2jmobius.commons.network.internal.fairness.FairnessController.nextFairAction(FairnessController.java:65)
    at org.l2jmobius.commons.network.Client.finishWriting(Client.java:268)
    at org.l2jmobius.commons.network.WriteHandler.completed(WriteHandler.java:59)
    at org.l2jmobius.commons.network.WriteHandler.completed(WriteHandler.java:29)
    at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:125)
    at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:280)
    at java.base/sun.nio.ch.WindowsAsynchronousSocketChannelImpl$WriteTask.completed(WindowsAsynchronousSocketChannelImpl.java:842)
    at java.base/sun.nio.ch.Iocp$EventHandlerTask.run(Iocp.java:387)
    at java.base/sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:113)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
    at java.base/java.lang.Thread.run(Thread.java:1570)
 
Решение
Этот ивент там не готовый, это был залит патч из раздела где они за бабки что то делают, это версия ивента самая первая.

Ошибка эта появляется когда идет проверка на нужный итем для ивента, монета эйнхасад, а у тебя ее нету.
 
Решение
При отправке пакета ExCrossEventInfo клиенту в инвентаре персонажа отсутствовал предмет с айди 48472, что и вызвало исключение NullPointerException при попытке получить кол-во этого предмета (_player.getInventory().getItemByItemId(ITEM_TO_PLAY_ID).getCount()).
Перед вызовом метода getCount необходимо проверять, не возвращает ли метод getItemByItemId(ITEM_TO_PLAY_ID) значение null

Код:
Index: java/org/l2jmobius/gameserver/network/serverpackets/crossevent/ExCrossEventInfo.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- java/org/l2jmobius/gameserver/network/serverpackets/crossevent/ExCrossEventInfo.java    (date 1724226356486)
+++ java/org/l2jmobius/gameserver/network/serverpackets/crossevent/ExCrossEventInfo.java    (date 1724226356486)
@@ -21,9 +21,11 @@
 import org.l2jmobius.commons.network.WritableBuffer;
 import org.l2jmobius.gameserver.data.xml.CrossEventData;
 import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.item.instance.Item;
 import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
 import org.l2jmobius.gameserver.model.holders.CrossEventHolder;
 import org.l2jmobius.gameserver.model.holders.CrossEventNormalRewardHolder;
+import org.l2jmobius.gameserver.model.itemcontainer.ItemContainer;
 import org.l2jmobius.gameserver.network.GameClient;
 import org.l2jmobius.gameserver.network.ServerPackets;
 import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;
@@ -34,11 +36,18 @@
     int ITEM_TO_PLAY_ID = Inventory.EINHASAD_COIN_ID;
     private final Player _player;
     final List<CrossEventNormalRewardHolder> cellRewards;
-   
+
+    int _einhasadCoinCount = 0;
+
     public ExCrossEventInfo(Player player)
     {
         _player = player;
         cellRewards = CrossEventData.getInstance().getCellRewards();
+
+        Item einhasadCoin = _player.getInventory().getItemByItemId(ITEM_TO_PLAY_ID);
+        if (einhasadCoin != null) {
+            _einhasadCoinCount = (int) einhasadCoin.getCount();
+        }
     }
    
     @Override
@@ -48,8 +57,8 @@
         buffer.writeByte(1); // bOnEvent
        
         buffer.writeInt(0); // <_CrossBlock> blocks
-       
-        buffer.writeInt((int) _player.getInventory().getItemByItemId(ITEM_TO_PLAY_ID).getCount()); // nCoupon
+
+        buffer.writeInt(_einhasadCoinCount); // nCoupon
 
         buffer.writeInt(_player.getCrossRewards()); // nRareRewardCnt
 
Спасибо за ответы , вы оба правы , не подскажите какой ивент нужно отключить?
 

а почему значение null крашит все? ведь айтема может не быть в инвентаре, если еще не добыт, это должно корректно обрабатываться. Может и можно ли как-то пофиксить обработку значения null?
 
способ избежать подобной ошибки я привел выше. Есть вариант перехватывать исключения через try catch, но в данном случае крайне не удобное.
Java:
        try {
            buffer.writeInt((int) _player.getInventory().getItemByItemId(ITEM_TO_PLAY_ID).getCount()); // nCoupon
        } catch (NullPointerException e) {
            buffer.writeInt(0);
        }

не подскажите какой ивент нужно отключить?
необходимо закомментировать отправку пакета ExCrossEventInfo (и ExCrossEventData до кучи) при входе персонажа в мир (EnterWorld)

 
Статус
В этой теме нельзя размещать новые ответы.