np. /Adi
#include <amxmodx> #include <amxmisc> #include <fdata> #define PLUGIN "Players Seen" #define VERSION "1.0" #define AUTHOR "Alka" enum { seconds = 1, minutes, hours, days, months, years } new gDataDir[64], gFile[64]; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR); register_clcmd("say", "cmdHookChat"); register_clcmd("say_team", "cmdHookChat"); } public plugin_cfg() { get_datadir(gDataDir, sizeof gDataDir - 1); formatex(gFile, sizeof gFile - 1, "%s/players_seen.data", gDataDir); if(!file_exists(gFile)) write_file(gFile, "", -1); } public client_connect(id) { static sName[32]; get_user_name(id, sName, sizeof sName - 1); static sTime[32]; num_to_str(get_systime(), sTime, sizeof sTime - 1); fdata_set(gFile, sName, sTime); } public cmdHookChat(id) { static sArgs[128]; read_args(sArgs, sizeof sArgs - 1); remove_quotes(sArgs); if(!equali(sArgs, "/seen", 5)) return 0; static sTargetName[32]; strtok(sArgs, sArgs, sizeof sArgs - 1, sTargetName, sizeof sTargetName - 1, ' ', 0); if(!sTargetName[0]) return 0; static iFile; iFile = fopen(gFile, "rt"); static sBuffer[128], sTemp[2][64]; new iFind; static sFileName[32], sFileTime[32]; while(!feof(iFile)) { fgets(iFile, sBuffer, sizeof sBuffer - 1); if(!sBuffer[0]) continue; str_piece(sBuffer, sTemp, sizeof sTemp, sizeof sTemp[] - 1, ';'); if(containi(sTemp[0], sTargetName) != -1) { iFind += 1; formatex(sFileName, sizeof sFileName - 1, sTemp[0]); formatex(sFileTime, sizeof sFileTime - 1, sTemp[1]); } } fclose(iFile); if(iFind == 0) { client_print(id, print_chat, "No matches with this name.Be more specific!"); return 0; } else if(iFind == 1) { if(is_user_connected(get_user_index(sFileName))) { client_print(id, print_chat, "%s is on server now!", sFileName); return 0; } else { new sTime[64], iLen; if(get_time_dif(str_to_num(sFileTime), years) >= 1) iLen += formatex(sTime[iLen], (sizeof sTime - 1) - iLen, "%dy:", get_time_dif(str_to_num(sFileTime), years)); if( get_time_dif(str_to_num(sFileTime), months) >= 1) iLen += formatex(sTime[iLen], (sizeof sTime - 1) - iLen, "%dm:", get_time_dif(str_to_num(sFileTime), months) % 12); if(get_time_dif(str_to_num(sFileTime), days) >= 1) iLen += formatex(sTime[iLen], (sizeof sTime - 1) - iLen, "%dd:", get_time_dif(str_to_num(sFileTime), days) % 30); if(get_time_dif(str_to_num(sFileTime), hours) >= 1) iLen += formatex(sTime[iLen], (sizeof sTime - 1) - iLen, "%dh:", get_time_dif(str_to_num(sFileTime), hours) % 24); if(get_time_dif(str_to_num(sFileTime), minutes) >= 1) iLen += formatex(sTime[iLen], (sizeof sTime - 1) - iLen, "%dm:", get_time_dif(str_to_num(sFileTime), minutes) % 60); if(get_time_dif(str_to_num(sFileTime), seconds) >= 1) iLen += formatex(sTime[iLen], (sizeof sTime - 1) - iLen, "%ds", get_time_dif(str_to_num(sFileTime), seconds) % 60); client_print(id, print_chat, "%s was here %s ago.", sFileName, sTime); } } else if(iFind > 1) { client_print(id, print_chat, "There are %d matches with this name.Be more specific!", iFind); return 0; } return 0; } stock get_time_dif(StartTime, _:TimeUnits) { new ActualTime = get_systime(); switch(TimeUnits) { case seconds : { return ActualTime - StartTime; } case minutes : { return (ActualTime - StartTime) / 60; } case hours : { return (ActualTime - StartTime) / 3600; } case days : { return (ActualTime - StartTime) / 86400; } case months : { return (ActualTime - StartTime) / 2592000; } case years : { return (ActualTime - StartTime) / 31104000; } } return -1; } stock str_piece(const input[], output[][], outputsize, piecelen, token = '|') { new i = -1, pieces, len = -1 ; while ( input[++i] != 0 ) { if ( input[i] != token ) { if ( ++len < piecelen ) output[pieces][len] = input[i] ; } else { output[pieces++][++len] = 0 ; len = -1 ; if ( pieces == outputsize ) return pieces ; } } return pieces + 1; }