Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
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
- // Получаем предмет из инвентаря игрока по ID
- var item = _player.getInventory().getItemByItemId(ITEM_TO_PLAY_ID);
- // Проверяем, найден ли предмет в инвентаре
- if (item != null) {
- // Если предмет найден, записываем его количество
- buffer.writeInt((int) item.getCount()); // nCoupon
- } else {
- // Если предмет не найден, записываем 0
- buffer.writeInt(0); // nCoupon
- }
Скопировать код
- Тестирование:После внесения изменений файл был скомпилирован, и сборка была протестирована на сервере. Исправление позволило предотвратить ошибку NullPointerException при отсутствии предмета в инвентаре.
Результат:Исправление успешно устранило ошибку, связанную с передачей информации о событии клиенту. Теперь программа корректно обрабатывает ситуации, когда предмет с заданным ID отсутствует в инвентаре игрока, и вместо вызова метода getCount() у несуществующего объекта, записывает в буфер значение 0. Это предотвращает сбой выполнения пакета и улучшает стабильность работы системы.
Заключение:Работа с файлом ExCrossEventInfo.java завершена успешно. Была выявлена и исправлена ошибка, которая могла приводить к сбоям в работе сервера при попытке взаимодействия с инвентарем игрока.
Так выглядел код до изменения:
- /*
- * This file is part of the L2J Mobius project.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- package org.l2jmobius.gameserver.network.serverpackets.crossevent;
- import java.util.List;
- 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.itemcontainer.Inventory;
- import org.l2jmobius.gameserver.model.holders.CrossEventHolder;
- import org.l2jmobius.gameserver.model.holders.CrossEventNormalRewardHolder;
- import org.l2jmobius.gameserver.network.GameClient;
- import org.l2jmobius.gameserver.network.ServerPackets;
- import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;
- public class ExCrossEventInfo extends ServerPacket
- {
-
- int ITEM_TO_PLAY_ID = Inventory.EINHASAD_COIN_ID;
- private final Player _player;
- final List<CrossEventNormalRewardHolder> cellRewards;
-
- public ExCrossEventInfo(Player player)
- {
- _player = player;
- cellRewards = CrossEventData.getInstance().getCellRewards();
- }
-
- @Override
- protected void writeImpl(GameClient client, WritableBuffer buffer)
- {
- ServerPackets.EX_CROSS_EVENT_INFO.writeId(this, buffer);
- buffer.writeByte(1); // bOnEvent
-
- buffer.writeInt(0); // <_CrossBlock> blocks
-
- buffer.writeInt((int) _player.getInventory().getItemByItemId(ITEM_TO_PLAY_ID).getCount()); // nCoupon
- buffer.writeInt(_player.getCrossRewards()); // nRareRewardCnt
-
- buffer.writeInt(4); // nRemainResetCnt
- buffer.writeInt(4); // nMaxResetCnt
- buffer.writeLong(1209599); // nEndSeconds
- }
- }
Скопировать код
|