Harnak Underground Ruins

Gigi

Выдающийся
Местный
Сообщения
246
Розыгрыши
0
Репутация
173
Реакции
69
Баллы
1 373
Если кто занимался системой перерождение монстров в руинах, не подскажите реализацию этого ExSendUIEvent

hurnak.png
Методом перебора не получиолсь, всё время вызывается не тот, то яйца дракончиков то ситема норнила и т.п, основа лыжа
За ранее спасибо :)
 
это не ExSendUIEvent, а пакет из системы динамических/зональных квестов - ExDynamicQuest

Хотя после линда как бы формально эту систему то конечно выпилили, но реально она без проблем все еще работает - я вон в Артее даже не стал выпиливать эти квесты ибо никаких проблем с их работой нет, а для разнообразия игры пусть лучше они продолжают работать.

Если в лыже нет реализованной системы динамических квестов, то поздравляю - тебе предстоит много работы...
 
Последнее редактирование:
Я могу подогнать только тут
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_SEND_UIEVENT.writeId(packet);

packet.writeD(_objectId);
packet.writeD(_type); // 0 = show, 1 = hide (there is 2 = pause and 3 = resume also but they don't work well you can only pause count down and you cannot resume it because resume hides the counter).
packet.writeD(0); // unknown
packet.writeD(0); // unknown
packet.writeS(String.valueOf(_countUp)); // 0 = count down, 1 = count up timer always disappears 10 seconds before end
packet.writeS(String.valueOf(_startTime));
packet.writeS(String.valueOf(_startTime2));
packet.writeS(String.valueOf(_endTime));
packet.writeS(String.valueOf(_endTime2));
packet.writeD(_npcstringId);
if (_params != null)
{
for (String param : _params)
{
packet.writeS(param);
}
}
return true;
}
Не может быить это так сложно, так как механику всё сделал, только надо донести всё это до ума игрока на визуале - в конце сделал так, но это не верно

111.png
а из динамики можно же вызвать например окно ожидание на регистрацию на хаос ? она работает на ура ...
 
Последнее редактирование:
а причем здесь фестиваль хаоса?
там совсем другие пакеты.

и вот если что пакет ExDynamicQuest, он сложный - отсылаемая структура зависит от ситуации
Код:
package l2p.gameserver.network.serverpackets;

import l2p.gameserver.model.dynamicquest.DynamicQuestParticipant;
import l2p.gameserver.model.dynamicquest.DynamicQuestTask;
import l2p.gameserver.model.dynamicquest.DynamicQuest.DynamicQuestState;
import l2p.gameserver.network.serverpackets.components.Opcode;

import java.util.Collection;
import java.util.Collections;

public class ExDynamicQuest extends L2GameServerPacket
{
    private final DynamicQuestInfo _questInfo;

    public ExDynamicQuest(DynamicQuestInfo questInfo)
    {
        _questInfo = questInfo;
    }

    @Override
    protected void writeImpl()
    {
        writeEx(Opcode.ExDynamicQuest);
        writeC(_questInfo.questType); // isCampaign
        writeC(_questInfo._subType); // subType
        writeD(_questInfo.questId); // campaignId
        writeD(_questInfo.step); // step
        _questInfo.write(this);
    }

    public static class DynamicQuestInfo
    {
        // Base class, subType = 0 - start, subType = 1 - end quest
        public int questType;
        public int questId;
        public int step;
        private int _subType;

        public DynamicQuestInfo(int subType)
        {
            _subType = subType;
        }

        public void write(ExDynamicQuest packet)
        {}
    }

    public static class StartedQuest extends DynamicQuestInfo
    {
        private DynamicQuestState _state;
        private int _remainingTime;
        private int _participantsCount;
        private Collection<DynamicQuestTask> _tasks = Collections.emptyList();

        public StartedQuest(DynamicQuestState state, int remainingTime, int participantsCount, Collection<DynamicQuestTask> tasks)
        {
            super(2);
            _state = state;
            _remainingTime = remainingTime;
            _participantsCount = participantsCount;
            _tasks = tasks;
        }

        @Override
        public void write(ExDynamicQuest packet)
        {
            packet.writeC(_state.ordinal());
            packet.writeD(_remainingTime);

            if (questType == 1) // zone quest
                packet.writeD(_participantsCount);

            packet.writeD(_tasks.size());

            for (DynamicQuestTask task : _tasks)
            {
                packet.writeD(task.getTaskId());
                packet.writeD(task.getCurrentPoints());
                packet.writeD(task.getMaxPoints());
            }
        }
    }

    public static class ScoreBoardInfo extends DynamicQuestInfo
    {
        private final int _remainingTime;
        private final int _friendsCount;
        private final Collection<DynamicQuestParticipant> _participants;

        public ScoreBoardInfo(int remainingTime, int friendsCount, Collection<DynamicQuestParticipant> participants)
        {
            super(3);
            _remainingTime = remainingTime;
            _friendsCount = friendsCount;
            _participants = participants;
        }

        @Override
        public void write(ExDynamicQuest packet)
        {
            if (questType == 1)
            {
                packet.writeD(_remainingTime); // remaining time
                packet.writeD(_friendsCount); // party members count
                packet.writeD(_participants.size()); // participants size

                for (DynamicQuestParticipant participant : _participants)
                {
                    packet.writeS(participant.getName());
                    packet.writeD(participant.getCurrentPoints());// current points
                    packet.writeD(participant.getAdditionalPoints()); // additional
                    packet.writeD(participant.getCurrentPoints() + participant.getAdditionalPoints()); // total
                }
            }
            else
            {
                packet.writeD(_participants.size()); // participants size

                for (DynamicQuestParticipant participant : _participants)
                    packet.writeS(participant.getName()); // name
            }
        }
    }
}
я в свое время за основу при реализации этих динамических квестов взял то что писал Килрой в сборке таути, которая давно уже им выложена в шару. так что можешь если надо тоже за основу взять оттуда реализацию - правда тебе придется повозиться с адаптацией, т.к. та сборка на базе овера, а у тебя лыжа
 
а да, и вот более нормально описаный ExSendUIEvent
Код:
package l2p.gameserver.network.serverpackets;

import l2p.gameserver.model.Player;
import l2p.gameserver.network.serverpackets.components.NpcString;
import l2p.gameserver.network.serverpackets.components.Opcode;

public class ExSendUIEvent extends NpcStringContainer
{
    public static final int STYLE_TIMER_SHOW = 0;
    public static final int STYLE_TIMER_HIDE = 1;
    public static final int STYLE_BALLISTA_CHARGE = 2;
    public static final int STYLE_COUNTER = 3;
    public static final int STYLE_GP_TIMER = 4;
    public static final int STYLE_PROGRESS_BAR = 5;
    public static final int STYLE_TEMPERATURE_1 = 6;
    public static final int STYLE_TEMPERATURE_2 = 7;
    public static final int STYLE_CLAN_PROGRESS_BAR = 8;

    public static final int MODE_NONE = -1;
    public static final int MODE_REMAINING = 0;
    public static final int MODE_ELAPSED = 1;

    private int _objectId;
    private int _style;
    private int _mode;
    private int _value1;
    private int _value2;
    private int _sysStringId1;
    private int _sysStringId2;

    public ExSendUIEvent(Player player, int style, int mode, int value1, int value2, String... params)
    {
        this(player, style, mode, value1, value2, 0, 0, NpcString.NONE, params);
    }

    public ExSendUIEvent(Player player, int style, int mode, int value1, int value2, NpcString npcString, String... params)
    {
        this(player, style, mode, value1, value2, 0, 0, npcString, params);
    }

    public ExSendUIEvent(Player player, int style, int mode, int value1, int value2, int sysStringId1, int sysStringId2, NpcString npcString, String... params)
    {
        super(npcString, params);

        _objectId = player != null ? player.getObjectId() : 0;
        _style = style;
        _mode = mode;
        _value1 = value1;
        _value2 = value2;
        _sysStringId1 = sysStringId1;
        _sysStringId2 = sysStringId2;
    }

    @Override
    protected void writeImpl()
    {
        writeEx(Opcode.ExSendUIEvent);
        writeD(_objectId);
        writeD(_style); // ID timer (any style)
        writeD(0x00); // unknown
        writeD(0x00); // unknown
        writeS(String.valueOf(_mode)); // Name indicator

        if (_mode >= 0 && _style < 6)
        {
            writeS(String.valueOf(_value1 / 60)); // timer starting minute(s)
            writeS(String.valueOf(_value1 % 60)); // timer starting second(s)
            writeS(String.valueOf(_value2 / 60)); // timer length minute(s) (timer will disappear 10 seconds before it ends)
            writeS(String.valueOf(_value2 % 60)); // timer length second(s) (timer will disappear 10 seconds before it ends)
        }
        else
        {
            writeS(String.valueOf(_value1));
            writeS(String.valueOf(_value2));
            writeS(String.valueOf(_sysStringId1));
            writeS(String.valueOf(_sysStringId2));
        }

        writeElements();
    }
}
 
Спасибо за разъяснения, буду изучать и внедрять
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
смотри что то из этого, я точно не помню где компил а где исход (дано забили на все это)
 
Последнее редактирование:
  • Мне нравится
Реакции: Gigi
Назад
Сверху Снизу