| Stepan23 | Дата: Среда, 04.04.2012, 20:51 | Сообщение # 1 |
 Майор
Группа: Администраторы
Сообщений: 91
Статус: Offline
| Всем привет! Надеюсь такой темы нет на pawno.ru, поиск мне не особо помог. Так вот, создавая свой мод, я понял, что мне необходима система логов.
Чему меня научит это готовое решение? В этой теме я научу вас создавать систему логов, которая поможет прочитать/получить необходимую вам информацию. (чат,пм,подключение/отключение игроков). Особенности системы: Данная система довольно проста, используется всего 1 stock. Каждый лог имеет формат:[день][месяц]Имя.log Текст внутри лога записывается так: [Час:Мин:Сек]Текст Как это сделать? 1) Как я и говорил выше, используется всего 1 stock, поэтому в конец мода добавляем:
Code stock WriteLog(namelog[],string[]) { new text[256],log[50],computation1, computation2, computation3,File:LogFile,i; gettime(computation1, computation2, computation3); format(text, sizeof(text), "[%02d:%02d:%02d]%s\r\n",computation1,computation2,computation3,string); getdate(computation1, computation2, computation3); format(log,sizeof(log),"logs/%s/[%02d][%02d]%s.log",namelog,computation3,computation2,namelog); LogFile = fopen(log, io_append); while (text[i] != EOS) { fputchar(LogFile, text[i], false); i++; } fclose(LogFile); } Параметры: namelog[] - имя лога string[] - текст, который нужно записать в лог.
2) В scriptfiles создаем папку logs
Использование системы: Возьмем банальный пример, запись пм сообщения в лог по такому формату: [время]Имя Отправителя[ид] -> Имя Получателя[ид]: текст пм Время у нас определяется автоматически, поэтому нам нужно указать только имена отправителя/получателя, их ид, ну и сам текст.
Возьмем простую систему пм:
Code public OnPlayerCommandText(playerid, cmdtext[]) { new cmd[256], idx, tmp[256]; cmd = strtok(cmdtext, idx);
if(!strcmp(cmd, "/pm", true)) { new message[256]; new id; cmd = strtok(cmdtext,idx); id = strval(cmd); cmd = strrest(cmdtext,idx); format(message, sizeof(message), "{ffd700}PM для %s(%i): %s", PlayerName(id), id, cmd); SendClientMessage(playerid, -1, message); format(message, sizeof(message), "{ffd700}PM от %s(%i): %s", PlayerName(playerid), playerid, cmd); SendClientMessage(id, -1, message); //------------Запись в лог---------------------------------------------------------- format(message,sizeof(message),"%s[%d]->%s[%d]:%s",PlayerName(playerid),playerid,PlayerName(id),id,cmd); WriteLog("PmLog",message); //-------------------------------------------------------------------------------------- return 1; } return 1; } Как видно на примере, за запись в лог отвечает всего 2 строки: format(message,sizeof(message),"%s[%d]->%s[%d]:%s",PlayerName(playerid),playerid,PlayerName(id), id,cmd); WriteLog("PmLog",message);
Переменная message уже была объявлена в команде.
WriteLog("PmLog",message); "PmLog" - имя лога, указывается в ковычках.
Внимание!!! В logs должна быть создана папка с именем, которое указано в WriteLog(namelog[],string[]);
В результате этого, вы получите такой лог: Возможные ошибки/проблемы:
1) error 017: undefined symbol "strtok"
Вниз мода добавить:
Code strtok(const string[], &index) { new length = strlen(string); while ((index < length) && (string[index] <= ' ')) index++; new offset = index; new result[20]; while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1))) { result[index - offset] = string[index]; index++; } result[index - offset] = EOS; return result; } 2) error 017: undefined symbol "PlayerName"
Вниз мода добавить:
Code stock PlayerName(playerid){ new pname[MAX_PLAYER_NAME]; GetPlayerName(playerid,pname,sizeof(pname)); return pname;} 3) У меня вылетает сервер при записи.Что делать?
Не создана папка logs, или не создана папка, которая указана в WriteLog(namelog[],string[]);
|
| |
|
|