Top.Mail.Ru

admin Дата публикации 2024-10-7 00:04:37

Отчет по проделанной работе с файлом 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]
Посмотреть полную версию: Отчет по проделанной работе с файлом ExCrossEventInfo.java