Пакет для динамического обновления гампов сервера - Hotride/OrionUO GitHub Wiki

Пакет для динамического обновления гампов сервера

Для корректной работы необходимо после объявления элемента в гампе задать ему серийный номер, например:

page 0
resizepic ...
button ...
button ...
text ...
gumppic ...
text ... <- его нужно динамически менять
serial 1 <- задаем ему серийный номер 1
gumppic ... <- его нужно динамически менять
serial 2 <- задаем ему серийный номер 2

Серийные номера должны быть у каждого типа элементов уникальными, по ним будет производиться поиск элементов в гампе.

Список доступных элементов с набором параметров, формат elementName parameters:

  • page index

  • group index

  • endgroup 0

  • resizepic serial x y graphic width height

  • checkertrans serial x y width height

  • button serial x y up down action toPage color

  • buttontileart serial x y up down action toPage color tileGraphic tileColor tileX tileY

  • checkbox serial x y up down state color

  • radio serial x y up down state color

  • text serial x y color width height hasText

  • croppedtext serial x y color width height hasText

  • textentry serial NOT IMPLEMENTED YET

  • textentrylimited serial NOT IMPLEMENTED YET

  • tilepic serial x y graphic color width height colorSelected doubleDraw

  • tilepichue serial x y graphic color width height colorSelected doubleDraw

  • gumppic serial x y graphic color width height colorSelected

  • gumppictiled serial x y graphic color width height colorSelected

  • picinpic serial NOT IMPLEMENTED YET

  • htmlgump serial NOT IMPLEMENTED YET

  • xmfhtmlgumpcolor serial NOT IMPLEMENTED YET

  • xmfhtmlgump serial NOT IMPLEMENTED YET

  • xmfhtmltok serial NOT IMPLEMENTED YET

  • tooltip serial NOT IMPLEMENTED YET

  • itemproperty serial NOT IMPLEMENTED YET

  • scope serial NOT IMPLEMENTED YET

  • scissor serial NOT IMPLEMENTED YET

  • coloredpolygone serial NOT IMPLEMENTED YET

  • line serial NOT IMPLEMENTED YET

  • shader serial NOT IMPLEMENTED YET

  • hitbox serial NOT IMPLEMENTED YET

  • databox serial NOT IMPLEMENTED YET

  • blending serial NOT IMPLEMENTED YET

  • globalcolor serial NOT IMPLEMENTED YET

  • combobox serial NOT IMPLEMENTED YET

  • slider serial NOT IMPLEMENTED YET

  • minmaxbuttons serial NOT IMPLEMENTED YET

  • spoiler serial NOT IMPLEMENTED YET

PacketOrionUpdateGump

От сервера

Пакет обновления элементов гампа.

  • BYTE[1] - ID пакета (0xBF)

  • BYTE[2] - размер пакета (динамический)

  • BYTE[2] - Номер подкоманды, выделенной для Ориона (0xFACE)

  • BYTE[2] - ИД команды Ориона (0x0041)

  • BYTE[1] - Compressed, пакет пожат функцией compress2 библиотеки ZLib

if Compressed != 0

  • BYTE[4] - compressedSize размер сжатых данных

  • BYTE[4] - rawSize оригинальный размер данных в сжатом блоке

  • BYTE[compressedSize] - блок сжатых данных, структура данных из проверки (Compressed == 0)

else // Compressed == 0

  • BYTE[4] - serial серийный номер гампа

  • BYTE[4] - id идентификатор гампа

  • BYTE[2] - Новая X координата гампа. Если указано 0xFFFF - это поле игнорируется.

  • BYTE[2] - Новая Y координата гампа. Если указано 0xFFFF - это поле игнорируется.

  • BYTE[1] - Новое состояние NoClose гампа. Если указано 0xFF - это поле игнорируется.

  • BYTE[1] - Новое состояние NoMove гампа. Если указано 0xFF - это поле игнорируется.

  • BYTE[1] - Новое состояние Visible гампа (для случаев, когда гамп нужно оставить у клиента, но временно скрыть). Если указано 0xFF - это поле игнорируется.

  • BYTE[1] - Новый номер текущей страницы гампа. Если указано 0xFF - это поле игнорируется.

  • BYTE[2] - removeItemsCount количество элементов для удаления из гампа.

LOOP removeItemsCount

  • BYTE[*] - null-terminated utf-8 строка с командами для удаления.

Доступные варианты команд:

** elementName serial - для удаления элемента (и его содержимого, если это контейнер); Если указано page - удаляет все элементы для указанной страницы.

** elementName serial clear - для очистки контейнера (или страницы, без удаления самой страницы)

END_LOOP removeItemsCount

  • BYTE[2] - addOrUpdateItemsCount количество элементов для добавления/обновления в гампе.

LOOP addOrUpdateItemsCount

  • BYTE[*] - null-terminated utf-8 строка с командами для добавления/обновления.

Доступные варианты команд:

** select gump - выбрать последний элемент гампа, добавление элементов пбудет происходить в конец гампа.

** select gump front - сбросить выбор с элемента гампа, следующий новый элемент добавится в самое начало гампа.

** select elementName serial - выбрать указанный элемент (если это контейнер - выберется последний элемент в контейнере).

** select elementName serial front - если это контейнер - выберется контейнер и следующий новый элемент добавится в начало контейнера.

** elementName parameters - добавиление нового или обновление существующего элемента (поиск происходит по elementName и serial). При обновлении элемента - поля которые не нужно изменять заменить на прочерк -

Для текстовых элементов, если поле hasText указано и не равно 0 - добавляется поле * BYTE[*] - null-terminated unicode строка - текст для элемента.

END_LOOP addOrUpdateItemsCount

endif // Not Compressed

Пример пакета для RunUO/ServUO сервера для обновления resizepic и text:

public sealed class PacketOrionUpdateGump : Packet
{
    public PacketOrionUpdateGump(string text) : base(0xBF)
    {
	EnsureCapacity(4096); // change to real size?
        m_Stream.Write((ushort)0xFACE);
        m_Stream.Write((ushort)0x0041);
        m_Stream.Write((byte)0); // not compressed
        m_Stream.Write((uint)0x00000001); // gump serial
        m_Stream.Write((uint)0x000003F1); // gump id

        m_Stream.Write((ushort)0xFFFF); // x
        m_Stream.Write((ushort)0xFFFF); // y
        m_Stream.Write((byte)0xFF); // noclose
        m_Stream.Write((byte)0xFF); // nomove
        m_Stream.Write((byte)0xFF); // visible
        m_Stream.Write((byte)0xFF); // new page index
        m_Stream.Write((ushort)0); // remove items count
        m_Stream.Write((ushort)2); // add/update items count
        	m_Stream.WriteAsciiNull("text 4 - - - - - 1"); //element 1
        		m_Stream.WriteBigUniNull("test update text"); //element 1 text
        	m_Stream.WriteAsciiNull("resizepic 3 - - - 44"); //element 2, change width
        	m_Stream.WriteAsciiNull("resizepic 1 - - - 11 88"); //element 3, change width and height
    }
}