[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Нужные функции для squirrel
Дата: 14.07.2013, Воскресенье, 13:12:22 | Сообщение # $NUMBER
Группа: Модераторы
Сообщений: 1045
Репутация: 1112+
Автор: 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).
   Все изменения сначала записываем в переменные объявленные
   выше и уж потом вызываем функцию.
*/
  • Страница 1 из 1
  • 1
Поиск: