Автор: S_S
Код
const MAX_PLAYERS = 32; //Константа с максимальным количеством игроков
const PatchToUserFiles = "myplayers";//Путь к папке с файлами пользователей
pInfo <- {}; //Создаем таблицу которая будут хранить данные игроков
pInfo.name <- array(MAX_PLAYERS); //Имя игрока
pInfo.money <- array(MAX_PLAYERS); //Деньги
pInfo.score <- array(MAX_PLAYERS); //Очки
/*
Функция кодировки имени пользователя для использования в качестве имени файла.
Использование данной функции позволяет экранировать специальные символы в имени
игроков.
*/
function encodeName(playername)
{
local str = playername.tolower();
local out="";
local ex = regexp("[a-z0-9]");
local tmp="";
foreach(id,val in str){
tmp=val.tochar();
if(ex.match(tmp)){
out+=val.tochar();
}
else
{
out+="("+val+")";
}
tmp="";
}
return out;
}
//Функция формирует путь к файлу с данными игрока
function playerFile(playername)
{
local str;
str = format(PatchToUserFiles + "/%s.ini",encodeName(playername));
return str;
}
//Функция загрузки данных игрока с использованием класса EasyINI
function loadplayer(playerid)
{
pInfo.name[playerid] <- getPlayerName(playerid); //Записываем имя игрока в таблицу
local ini; //Переменная будет хранить идентификатор класса
ini = EasyINI(playerFile(pInfo.name[playerid])); //Ионизируем класс
pInfo.money[playerid] = (ini.keyExists("general", "money"))?ini.getKey("general", "money"):0; //Получаем деньги из файла игрока
pInfo.score[playerid] = (ini.keyExists("general", "score"))?ini.getKey("general", "score"):0; //Получаем очки из файла игрока
}
//Функция перезагрузки данных пользователя
function reloadplayer(playerid)
{
local ini = null; //Переменная будет хранить идентификатор класса
ini = EasyINI(playerFile(pInfo.name[playerid])); //Ионизируем класс
pInfo.money[playerid] = (ini.keyExists("general", "money"))?ini.getKey("general", "money"):0; //Получаем деньги из файла игрока
pInfo.score[playerid] = (ini.keyExists("general", "score"))?ini.getKey("general", "score"):0; //Получаем очки из файла игрока
}
//Функция сохранения данных пользователя
function saveplayer(playerid)
{
local ini = null; //Переменная будет хранить идентификатор класса
ini = EasyINI(playerFile(pInfo.name[playerid])); //Ионизируем класс
ini.setKey("general", "money", pInfo.money[playerid]); //Записываем деньги в файл игрока
(ini.keyExists("general", "score", pInfo.score[playerid]); //Записываем очки в файл игрока
}
//Функция сохраняет данные всех пользователей
//Рекомендую использовать таймер для ее применения
function saveAllPlayers()
{
for(local i = 0; i < getPlayerSlots(); i++)
{
if(isPlayerConnected(i)) //Функция сработает только для тех игроков которые есть на сервере
{
saveplayer(i); //Запускаем сохранение
//sendPlayerMessage(i,"All save complited.",0xFFFF00AA); //Выводим сообщение в чат об успешном сохранение данных игрока
//log("All save complited."); //Выводим в консоль сообщение об успешном сохранении
}
}
}
/*
Функция удаления данных пользователя из памяти сервера
Необходима для того, чтобы при входи другого пользователя
с данным ID, данные не пересекались. И вновь зашедшему игроку
присваивались именно его данные.
*/
function clearplayer(playerid)
{
pInfo.name[playerid] <- "";
pInfo.money[playerid] <- 0;
pInfo.score[playerid] <- 0;
}
//Использование
function onScriptInit()
{
timer(saveAllPlayers,1800000,-1); //Таймер для автоматического сохранения (периодичность можете менять, это не критично)
return 1;
}
addEvent("scriptInit", onScriptInit);
function onPlayerConnect(playerid)
{
loadplayer(playerid); //Загружаем данные игрока
/*
...
Ваш код
...
*/
return 1;
}
addEvent("playerConnect", onPlayerConnect);
function onPlayerDisconnect(playerid, reason)
{
/*
...
Ваш код
...
*/
saveplayer(playerid); //Сохраняем данные
clearplayer(playerid); //Очищаем переменные
return 1;
}
addEvent("playerDisconnect", onPlayerDisconnect);
/*
Теперь после произведения изменений, требующих
записи в файл, вызываем функцию saveplayer(playerid).
Все изменения сначала записываем в переменные объявленные
выше и уж потом вызываем функцию.
*/