Пакет для динамического обновления гампов сервера - 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
}
}