Создание нового итема.

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

crossover

Последний из атеистов
VIP
Победитель в номинации 2023
Сообщения
775
Розыгрыши
0
Решения
3
Репутация
118
Реакции
291
Баллы
823
Хроники
  1. Interlude
Исходники
Присутствуют
Сборка
другая
Доброй ночи дорогие форумчане.

Потребовалось реализовать "SP" персонажа как валюту (для того что бы можно было вставлять в мультиселл)
Опишу что делал, прошу сильно не гнобить так как навыков Java не имею (скажите ну и нехер тогда лезть, ну мб и правы)
Делал по аналогу "L2Item.ITEM_ID_PC_BANG_POINTS"

И так в файлах где я нашел данный итем (ITEM_ID_PC_BANG_POINTS) я проделал следующие действия.

1) source\gameserver\l2p\gameserver\templates\L2Item.java создал новый новый предмет
Код:
public static final int ITEM_ID_SP_POINTS = 15236;

2) source\gameserver\l2p\gameserver\data\xml\holder\MultiSellHolder.java я продублировал но с изменениями
Код:
    else if(ingredient.getItemId() == L2Item.ITEM_ID_SP_POINTS)
    {
        if(!itms.contains(ingredient.getItemId()) && player.getSp() >= ingredient.getItemCount())
            itms.add(ingredient.getItemId());
        continue;
    }

3) source\gameserver\l2p\gameserver\clientpackets\RequestMultiSellChoose.java так продублировал
Код:
    else if(ingridientItemId == L2Item.ITEM_ID_SP_POINTS)
    {
        if(activeChar.getSp() < total_amount)
        {
            activeChar.sendMessage(activeChar.isLangRus() ? "Вам не хватает SP поинтов." : "You are short of SP points.");
            return;
        }
        if(!ingridient.getMantainIngredient())
            _items.add(new ItemData(ingridientItemId, total_amount, null));
        }
Код:
else if(id.getId() == L2Item.ITEM_ID_SP_POINTS)
                    {
           
                        activeChar.addSp((int)-count);
                        activeChar.sendPacket(new SystemMessage(SystemMessage.SP_HAS_DECREASED_BY_S1).addNumber(count));
                    }
Код:
else if (in.getItemId() == L2Item.ITEM_ID_SP_POINTS)
                    activeChar.addSp(in.getItemCount() * this._amount);  
                }
Компилится все без ошибок, геймсервер чистый, но суть проблемы в том что когда нажимаешь на мультисел и кликаешь по итему вылетает крит клиента
Код:
2023.2.15 23:31:26
OS : Windows Vista 6.2 (Build: 9200)
CPU : GenuineIntel PentiumPro-class processor @ 2901 MHz with 2047MB RAM
Video : Radeon (TM) RX 470 Graphics (7000)

General protection fault!

History: UUIDATA_ITEM::execGetSetItemIDList <- UObject::execClassContext <- (ToolTip Transient.ToolTip0 @ Function Interface.ToolTip.735 : 156B) <- UObject::ProcessEvent <- (ToolTip Transient.ToolTip0, Function Interface.ToolTip.OnEvent) <- XMLUIManager::ExecuteUIEvent <- NCTooltipManager::MakeTooltipInfo <- NCNameCtrl::SetNameData <- UUIAPI_MULTISELLNEEDEDITEM::execAddData <- UObject::execClassContext <- (MultiSellWnd Transient.MultiSellWnd0 @ Function Interface.MultiSellWnd.OnClickItem : 021F) <- UObject::ProcessEvent <- (MultiSellWnd Transient.MultiSellWnd0, Function Interface.MultiSellWnd.OnClickItem) <- NCItemWnd::OnLButtonUp <- NCVirtualWndMain::PassToFocusedWindow <- NCVirtualWndMain::PassToFocusedWindow <- NCVirtualWndMain::PassToFocusedWindow <- NCVirtualWndMain::DispatchWndMsg <- NConsoleWnd::DispatchWndMsgX <- NConsoleWnd::MasterConsoleEventProcess <- UEngine::InputEvent <- UWindowsViewport::CauseInputEvent <- UWindowsViewport::UpdateInput <- UViewport::ReadInput <- APlayerController::Tick <- ALineagePlayerController::Tick <- TickAllActors <- ULevel::Tick <- (NetMode=0) <- TickLevel <- UGameEngine::Tick <- UpdateWorld <- MainLoop

Ну собственно так же создал итем в базе sp point c id15236 и в патче создал.
 
Проблему решил, не корректно добавил в патч, дольше тему писал чем исправил))))
Почти мануал получился)))
 
Решение
Плохо одно, это то что счетчик SP обновляется только после релога(
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу