Top.Mail.Ru

[Доработка кода l2j_Modius] Отчет по проделанной работе с файлом ExCrossEventInfo.java

[Скопировать ссылку]
admin Опубликовано 2024-10-7 00:04:37 | Показать все сообщения |Режим чтения Распечатать Назад Вперед

Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!

Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться

x
Отчет по проделанной работе с файлом ExCrossEventInfo.java (L2J_Mobius\java\org\l2jmobius\gameserver\network\serverpackets\crossevent\)Задача:Исправить ошибку, возникающую при отправке пакета ExCrossEventInfo клиенту, которая приводила к исключению NullPointerException при попытке вызова метода getCount() у объекта Item, который мог быть равен null. Ошибка возникала в строке, где программа пыталась получить количество предметов в инвентаре игрока по идентификатору ITEM_TO_PLAY_ID.
Описание ошибки:Исключение NullPointerException возникало из-за того, что метод getItemByItemId(ITEM_TO_PLAY_ID) мог возвращать null, если в инвентаре игрока отсутствовал предмет с данным идентификатором. В таких случаях вызов метода getCount() у значения null вызывал ошибку.
Проведенная работа:
  • Анализ кода:Было установлено, что ошибка происходит в методе writeImpl, где из инвентаря игрока извлекается предмет по ID, и затем программа пытается получить его количество с помощью метода getCount(). Однако проверка на существование предмета в инвентаре отсутствовала.
  • Исправление кода:В метод writeImpl было добавлено условие, проверяющее, существует ли предмет в инвентаре. Если предмет найден, программа получает его количество через метод getCount(). Если предмета нет, вместо вызова getCount() программа записывает 0 в буфер, тем самым предотвращая возникновение NullPointerException.
    Изменение кода: java
    1. // Получаем предмет из инвентаря игрока по ID
    2. var item = _player.getInventory().getItemByItemId(ITEM_TO_PLAY_ID);

    3. // Проверяем, найден ли предмет в инвентаре
    4. if (item != null) {
    5.     // Если предмет найден, записываем его количество
    6.     buffer.writeInt((int) item.getCount()); // nCoupon
    7. } else {
    8.     // Если предмет не найден, записываем 0
    9.     buffer.writeInt(0); // nCoupon
    10. }
    Скопировать код






  • Тестирование:После внесения изменений файл был скомпилирован, и сборка была протестирована на сервере. Исправление позволило предотвратить ошибку NullPointerException при отсутствии предмета в инвентаре.

Результат:Исправление успешно устранило ошибку, связанную с передачей информации о событии клиенту. Теперь программа корректно обрабатывает ситуации, когда предмет с заданным ID отсутствует в инвентаре игрока, и вместо вызова метода getCount() у несуществующего объекта, записывает в буфер значение 0. Это предотвращает сбой выполнения пакета и улучшает стабильность работы системы.
Заключение:Работа с файлом ExCrossEventInfo.java завершена успешно. Была выявлена и исправлена ошибка, которая могла приводить к сбоям в работе сервера при попытке взаимодействия с инвентарем игрока.

Так выглядел код до изменения:
  1. /*
  2. * This file is part of the L2J Mobius project.
  3. *
  4. * This program is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation, either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. package org.l2jmobius.gameserver.network.serverpackets.crossevent;

  18. import java.util.List;

  19. import org.l2jmobius.commons.network.WritableBuffer;
  20. import org.l2jmobius.gameserver.data.xml.CrossEventData;
  21. import org.l2jmobius.gameserver.model.actor.Player;
  22. import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
  23. import org.l2jmobius.gameserver.model.holders.CrossEventHolder;
  24. import org.l2jmobius.gameserver.model.holders.CrossEventNormalRewardHolder;
  25. import org.l2jmobius.gameserver.network.GameClient;
  26. import org.l2jmobius.gameserver.network.ServerPackets;
  27. import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;

  28. public class ExCrossEventInfo extends ServerPacket
  29. {
  30.        
  31.         int ITEM_TO_PLAY_ID = Inventory.EINHASAD_COIN_ID;
  32.         private final Player _player;
  33.         final List<CrossEventNormalRewardHolder> cellRewards;
  34.        
  35.         public ExCrossEventInfo(Player player)
  36.         {
  37.                 _player = player;
  38.                 cellRewards = CrossEventData.getInstance().getCellRewards();
  39.         }
  40.        
  41.         @Override
  42.         protected void writeImpl(GameClient client, WritableBuffer buffer)
  43.         {
  44.                 ServerPackets.EX_CROSS_EVENT_INFO.writeId(this, buffer);
  45.                 buffer.writeByte(1); // bOnEvent
  46.                
  47.                 buffer.writeInt(0); // <_CrossBlock> blocks
  48.                
  49.                 buffer.writeInt((int) _player.getInventory().getItemByItemId(ITEM_TO_PLAY_ID).getCount()); // nCoupon

  50.                 buffer.writeInt(_player.getCrossRewards()); // nRareRewardCnt
  51.                
  52.                 buffer.writeInt(4); // nRemainResetCnt
  53.                 buffer.writeInt(4); // nMaxResetCnt
  54.                 buffer.writeLong(1209599); // nEndSeconds
  55.         }
  56. }
Скопировать код


Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

Правил начисления баллов

Опубликовать
Сектор творческих людей
Горячая линия

638638758

С понедельника по воскресенье с 9:00 до 23:00

Обратной связь

admin@artace.ru Онлайн

QR-код

Powered by Discuz! X3.5© 2001-2021 Comsenz Inc.