_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);
Пример:
Код #include <sourcemod>
public OnPluginStart() { new Handle:pack = CreateDataPack(); WritePackString(pack, "wS"); WritePackCell(pack, 5); WritePackFloat(pack, 5.5);
// Передаем функции wS_Func Handle нашего пака f(pack);
// С таймером это выглядело бы так: CreateTimer(<sec>, <x_func>, pack); }
f(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); } Извлекать данные нужно в том же порядке, в каком они были записаны.
|
|
| |