Заказать Сервер Заказать Плагин Контакты Поиск

[ вход ]
[ последние сообщения ]

Страница 1 из 11
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » DataPack (Запись/хранение данных разных типов)
DataPack
_wS_ Дата: Среда, 30.11.2011, 18:56:38 | Сообщение # 1
DataPack

Может хранить в себе разные типы данных (целые числа, float, строки). Бывают случаи, когда нужно передать сразу несколько разных параметров, но функция принимает лишь один - здесь и поможет DataPack. Вы можете записать в него нужную иформацию, передать этот пак в функцию, там извлечь эту информацию и уничтожить пак (при необходимости).

Handle:CreateDataPack(); - создаёт пак и возвращает его Handle (ниже он как Handle:pack)
WritePackCell(Handle:pack, cell); - добавляет в пак целое число
WritePackFloat(Handle:pack, Float:val); - с точкой
WritePackString(Handle:pack, const String:str[]); - строку
ReadPackCell(Handle:pack) - извлекает из пака целое число
Float:ReadPackFloat(Handle:pack);
ReadPackString(Handle:pack, String:buffer[], maxlen);

ResetPack(Handle:pack, bool:clear=false);
Сбрасывает позицию. Это нужно сделать 1 раз перед первым извлечением данных.
Если clear = true, то все данные будут уничтожены (пак станет пустым).

GetPackPosition(Handle:pack); - Получает позицию чтения / записи в пакете данных.
SetPackPosition(Handle:pack, position); - Устанавливает позицию.
bool:IsPackReadable(Handle:pack, bytes);

Пример:

Code
#include <sourcemod>

public OnPluginStart()
{
     new Handle:pack = CreateDataPack();
     WritePackString(pack, "wS");
     WritePackCell(pack, 5);
     WritePackFloat(pack, 5.5);

     // Передаем функции wS_Func Handle нашего пака
     wS_Func(pack);

     // С таймером это выглядело бы так: CreateTimer(<sec>, <x_func>, pack);
}

wS_Func(Handle:pack)
{
     // Перед извлечением данных, надо сбросить позицию
     ResetPack(pack);

     // Получаем данные, которые мы записывали (в том же порядке)
     decl String:Name[5];
     ReadPackString(pack, Name, 5);

     PrintToServer("Ник = %s", Name);
     PrintToServer("Возраст: %d лет", ReadPackCell(pack));
     PrintToServer("Через полгода будет лет: %.1f", ReadPackFloat(pack));

     // Убиваем наш пак, удаляем из памяти сервера, так как он нам уже не нужен.
     CloseHandle(pack);
}

Извлекать данные нужно в том же порядке, в каком они были записаны.
 
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » DataPack (Запись/хранение данных разных типов)
Страница 1 из 11
Поиск: