[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » DataPack (Запись/хранение данных разных типов Взято с world-source.ru)
DataPack
rootДата: Воскресенье, 03.02.2013, 01:10 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 561
Статус: Offline
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); 

Пример: 

Код
#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 (SourcePawn) Скриптинга » DataPack (Запись/хранение данных разных типов Взято с world-source.ru)
  • Страница 1 из 1
  • 1
Поиск: