Отчет по проделанной работе с файлом ExCrossEventInfo.java
Отчет по проделанной работе с файлом 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
}
}
Страниц:
[1]