Свиток запечатки

ncknxk

Путник
Пользователь
Сообщения
13
Розыгрыши
0
Репутация
0
Реакции
0
Баллы
4
Хроники
  1. Prelude
  2. Harbingers of War
  3. Age of Splendor
  4. Rise of Darkness
  5. Scions of Destiny
  6. Oath of Blood
  7. Interlude
  8. The 1st Throne: The Kamael
  9. The 1st Throne: Hellbound
  10. The 2nd Throne: Gracia
  11. The 2nd Throne: Freya
  12. Chaotic Throne: High Five
  13. Goddess of Destruction Awakening
  14. Goddess of Destruction Harmony
  15. Goddess of Destruction Tauti
  16. Goddess of Destruction Glory Days
  17. Goddess of Destruction Lindvior
  18. Valliance / Epeisodion / Raiders
  19. Ertheia / Dimensional Strangers
  20. Infinite Odyssey
  21. Helios
  22. Grand Cursade
  23. Salvation
  24. Fafurion
  25. Shadow of the Kamael
  26. Prelude Of War
  27. Homunculus
  28. Return Of The Queen Ant
  29. Master Class
Исходники
Присутствуют
Сборка
L2J_Mobius_Essence_8.2_HeartOfVolcano
Здравствуйте, правильно ли я понимаю что свиток запечатки должен работать примерно так же как и свиток благословения, через вызов окна на клиенте, в данный момент на сервере с которым я работаю в качестве хендлера к айтему "свиток запечатки" используется айтем скилл тоесть при использовании свитка он просто вызывает скилл этого айтема на таргетированную цель, так же не должно быть ? Эту логику стоит полностью переписать ?
 
при юзе свитка в клиент просто отправляется пакет ExChooseLockedItem с ид свитка и от типа предмета с этим ид зависит какой список предметов будет показан в окне выбора предметов. например для 48400 (тип scrl_lock_item) покажет какие предметы можно запечатать, а для 48401 (тип scrl_unlock_item) покажет список уже запечатанных для того чтобы выбрать с какого предмета снять печать.
Ну и при выборе предмета с клиента придет RequestLockedItem или RequestUnlockedItem с objId выбранного предмета.
 
Если касаемо шары/привата Мобиуса - этой реализации там нет.

Скрытое содержимое для пользователя(ей): ncknxk
 
при юзе свитка в клиент просто отправляется пакет ExChooseLockedItem с ид свитка и от типа предмета с этим ид зависит какой список предметов будет показан в окне выбора предметов. например для 48400 (тип scrl_lock_item) покажет какие предметы можно запечатать, а для 48401 (тип scrl_unlock_item) покажет список уже запечатанных для того чтобы выбрать с какого предмета снять печать.
Ну и при выборе предмета с клиента придет RequestLockedItem или RequestUnlockedItem с objId выбранного предмета.
Понял вас спасибо большое!

Я представляю себе процесс следующим образом:
Создается новый хендлер для предмета:
Код:
public class SealingScrollItemHandler implements IItemHandler {

 @Override
    public boolean useItem(Playable playable, Item item, boolean forceUse) {
  if (!playable.isPlayer()) {
 playable.sendPacket(SystemMessageId.YOUR_PET_CANNOT_CARRY_THIS_ITEM);
  return false;
        }

  final Player player = playable.asPlayer();
  if (player.isCastingNow()) {
  return false;
        }

  if (player.hasItemRequest()) {
            player.sendPacket(
 SystemMessageId.ANOTHER_ENCHANTMENT_IS_IN_PROGRESS_PLEASE_COMPLETE_THE_PREVIOUS_TASK_THEN_TRY_AGAIN);
  return false;
        }

 player.addRequest(new SealRequest(player, item.getId()));
 player.sendPacket(new ExOpenSealOptionScroll(item.getId()));
  return true;
    }
}

Создается серверный пакет с отправляемым типом EX_CHOOSE_LOCKED_ITEM

Код:
public class ExOpenSealOptionScroll extends ServerPacket
{
 private final int _itemId;

 public ExOpenSealOptionScroll(int itemId)
    {
  _itemId = itemId;
    }
    
 @Override
    public void writeImpl(GameClient client, WritableBuffer buffer)
    {
 ServerPackets.EX_CHOOSE_LOCKED_ITEM.writeId(this, buffer);
 buffer.writeInt(_itemId);
    }
}

и потом нужно добавить этот хендлер предмету (свитку печати)
тут, с вашего позволения, еще один вопрос, как добавить новый хендлер предмету, я что то эту логику никак не найду
 
Если касаемо шары/привата Мобиуса - этой реализации там нет.

*** Скрытый текст не может быть процитирован. ***
Странно если в мобиусе не реализовано конечно полноценно - там делов от силы на полчаса-час.
Я когда у себя в 286 (хомке) реализовывал - где-то столько времени в целом и потратил, притом на серверную часть от силы половину времени от этого - остальное на клиентскую часть, т.к. в 286 для мейна в Item_BaseInfo не расписано какие предметы можно локать и пришлось еще эти данные с клиента более новых хроник переносить.

кстати к мейну из доп свойств предметов еще это можно прикрутить почти полноценно
работает это все нормально, единственно что в тултайпе у предмета не будет инфы о дающихся бонусах, т.к. в режиме мейна не грузятся и не обрабатываются нужные для этой инфы датники.
 
Последнее редактирование:
и потом нужно добавить этот хендлер предмету (свитку печати)
тут, с вашего позволения, еще один вопрос, как добавить новый хендлер предмету, я что то эту логику никак не найду
прямо в хэндлере обычно объявляются нужные ид и регаются.
на овере к примеру это будет так
Java:
package handler.items;

import l2p.gameserver.holders.requests.ItemLockRequest;
import l2p.gameserver.model.Playable;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.items.ItemInstance;
import l2p.gameserver.network.components.SystemMsg;
import l2p.gameserver.network.s2c.item_lock.ExChooseLockedItem;

public class SealScrolls extends ScriptItemHandler
{
    private static final int[] _itemIds = { 48400, 48401 };

    @Override
    public final int[] getItemIds()
    {
        return _itemIds;
    }

    @Override
    public boolean useItem(Playable playable, ItemInstance item, boolean forceUse, boolean autoUse)
    {
        if (playable == null || !playable.isPlayer())
            return false;

        Player player = (Player) playable;

        if (player.isInTrade() || player.isInPrivateStore())
        {
            player.sendPacket(SystemMsg.YOU_CANNOT_SEAL_OR_UNSEAL_AN_ITEM_WHILE_YOURE_RUNNING_A_PRIVATE_STORE_OR_PRIVATE_WORKSHOP);
            return false;
        }

        if (player.getItemRequest() != null)
            return false;

        final ItemLockRequest request = new ItemLockRequest(player);
        request.setScroll(item.getObjectId());
        request.setItem(0);
        player.sendPacket(new ExChooseLockedItem(item.getId()));
        return true;
    }
}
тут рега идет в родительском ScriptItemHandler при инициализации хэндлера при запуске сервера.
 
прямо в хэндлере обычно объявляются нужные ид и регаются.
на овере к примеру это будет так
Java:
package handler.items;

import l2p.gameserver.holders.requests.ItemLockRequest;
import l2p.gameserver.model.Playable;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.items.ItemInstance;
import l2p.gameserver.network.components.SystemMsg;
import l2p.gameserver.network.s2c.item_lock.ExChooseLockedItem;

public class SealScrolls extends ScriptItemHandler
{
    private static final int[] _itemIds = { 48400, 48401 };

    @Override
    public final int[] getItemIds()
    {
        return _itemIds;
    }

    @Override
    public boolean useItem(Playable playable, ItemInstance item, boolean forceUse, boolean autoUse)
    {
        if (playable == null || !playable.isPlayer())
            return false;

        Player player = (Player) playable;

        if (player.isInTrade() || player.isInPrivateStore())
        {
            player.sendPacket(SystemMsg.YOU_CANNOT_SEAL_OR_UNSEAL_AN_ITEM_WHILE_YOURE_RUNNING_A_PRIVATE_STORE_OR_PRIVATE_WORKSHOP);
            return false;
        }

        if (player.getItemRequest() != null)
            return false;

        final ItemLockRequest request = new ItemLockRequest(player);
        request.setScroll(item.getObjectId());
        request.setItem(0);
        player.sendPacket(new ExChooseLockedItem(item.getId()));
        return true;
    }
}
тут рега идет в родительском ScriptItemHandler при инициализации хэндлера при запуске сервера.
В моей версии кажется нет этого родительского класса там сразу интерфейс имплементится
public class SealingScrollItemHandler implements IItemHandler

1732895988781.webp
 
Ну естественно не будет - я то с овера, с которым работаю, пример показал :)
ты просто глянь у себя в других хэндлерах предметов как идет рега нужных ид и все
 
прямо в хэндлере обычно объявляются нужные ид и регаются.
на овере к примеру это будет так
Java:
package handler.items;

import l2p.gameserver.holders.requests.ItemLockRequest;
import l2p.gameserver.model.Playable;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.items.ItemInstance;
import l2p.gameserver.network.components.SystemMsg;
import l2p.gameserver.network.s2c.item_lock.ExChooseLockedItem;

public class SealScrolls extends ScriptItemHandler
{
    private static final int[] _itemIds = { 48400, 48401 };

    @Override
    public final int[] getItemIds()
    {
        return _itemIds;
    }

    @Override
    public boolean useItem(Playable playable, ItemInstance item, boolean forceUse, boolean autoUse)
    {
        if (playable == null || !playable.isPlayer())
            return false;

        Player player = (Player) playable;

        if (player.isInTrade() || player.isInPrivateStore())
        {
            player.sendPacket(SystemMsg.YOU_CANNOT_SEAL_OR_UNSEAL_AN_ITEM_WHILE_YOURE_RUNNING_A_PRIVATE_STORE_OR_PRIVATE_WORKSHOP);
            return false;
        }

        if (player.getItemRequest() != null)
            return false;

        final ItemLockRequest request = new ItemLockRequest(player);
        request.setScroll(item.getObjectId());
        request.setItem(0);
        player.sendPacket(new ExChooseLockedItem(item.getId()));
        return true;
    }
}
тут рега идет в родительском ScriptItemHandler при инициализации хэндлера при запуске сервера.
Еще раз добрый день и спасибо, получилось добавить вызов окна наложения печати на клиенте, только вот новая проблема, не приходят от клиента нужные пакеты которые вы указывали, по сути буфер вообще пустой приходит, видимо нет реализации на сервере этих пакетов, на вашей версии сервера и на мобиусе одинаковые коды команд приходящих с клиента ?

вот в этот метод просто приходит null при попытке наложить печать


Код:
    public ClientPacket newPacket()
    {
        final ClientPacket packet = _packetSupplier.get();              <----------- packet == null
        if (Config.DEBUG_EX_CLIENT_PACKETS)
        {
            if (packet != null)
            {
                final String name = packet.getClass().getSimpleName();
                if (!Config.ALT_DEV_EXCLUDED_PACKETS.contains(name))
                {
                    PacketLogger.info("[C EX] " + name);
                }
            }
            else if (Config.DEBUG_UNKNOWN_PACKETS)
            {
                PacketLogger.info("[C EX] 0x" + Integer.toHexString(_packetId).toUpperCase());
            }
        }
        return packet;
    }
 
Последнее редактирование модератором:
А вобще классы этих пакетов то в энуме клиентских пакетов у тебя зареганы хоть?

Энум org.l2jmobius.gameserver.network.ClientPackets если что.

Вобще там 4 пакета если что от клиента на эту тему есть
Java:
    EX_REQUEST_LOCKED_ITEM(0x158, RequestLockedItem::new),
    EX_REQUEST_UNLOCKED_ITEM(0x159, RequestUnlockedItem::new),
    EX_LOCKED_ITEM_CANCEL(0x15A, RequestLockedItemCancel::new),
    EX_UNLOCKED_ITEM_CANCEL(0x15B, RequestUnlockedItemCancel::new),
те что с Cancel в названии - приходят когда просто жмут отмену в окне выбора предметов. служат для того чтобы можно было убрать статус "игрок в окне выбора предметов для лока/унлока".
 
А вобще классы этих пакетов то в энуме клиентских пакетов у тебя зареганы хоть?

Энум org.l2jmobius.gameserver.network.ClientPackets если что.

Вобще там 4 пакета если что от клиента на эту тему есть
Java:
    EX_REQUEST_LOCKED_ITEM(0x158, RequestLockedItem::new),
    EX_REQUEST_UNLOCKED_ITEM(0x159, RequestUnlockedItem::new),
    EX_LOCKED_ITEM_CANCEL(0x15A, RequestLockedItemCancel::new),
    EX_UNLOCKED_ITEM_CANCEL(0x15B, RequestUnlockedItemCancel::new),
те что с Cancel в названии - приходят когда просто жмут отмену в окне выбора предметов. служат для того чтобы можно было убрать статус "игрок в окне выбора предметов для лока/унлока".
Да зареганы
 
Назад
Сверху