PDA

Просмотр полной версии : [Вопрос] Система мута, построенная на GetTickCount()



SteveStage
18.10.2019, 18:37
Я сделал систему мута, основанную на получении тиков сервера, которые равны миллисекундам, и умножая их на 60к, и записывая в энум игрока, соответственно система мута у меня по минутам. Но на форуме sa-mp.com говорят, что при работе сервера более 24 часов GetTickCount переполняется, и нужно использовать сток с параметрами oldtick и newtick, но у меня не идет подсчет времени на вычитании тиков, соответственно я не могу пользоваться этим тиком - вычитать нечего. Повлияет ли переполнение GetTickCount на работу мута?

- - - Добавлено - - -

Вот код:


enum pInfo {
pPass[50+1], pMail[60+1], pMoney, pLevel, pAge, pNational, pSkin, pSex, pID, pReferal[MAX_PLAYER_NAME+1],
pDateReg[10+1], pExp, pDeath, pNockout, pItem1, pItem2, pItem3, pItemAmmo1, pItemAmmo2, pItemAmmo3,
pItemSelect, pAdmin, pMute
}
new
player[MAX_PLAYERS][pInfo];


public OnPlayerText(playerid, text[])
{
if(login_check{playerid} == false)
{
SCM(playerid, COLOR_GREY, "Вы не авторизованы!");
return false;
}
if(player[playerid][pMute] >= GetTickCount())
{
SCM(playerid, COLOR_RED, !"Вы заткнуты!");
printf("GetTickCount - %d, Mute - %d", GetTickCount(), player[playerid][pMute]);
return false;
}
return false;
}


CMD:mute(playerid, params[])
{
if(player[playerid][pAdmin] == 0)
{
SCM(playerid, COLOR_RED, !"Вы не администратор!");
return false;
}
if(player[playerid][pAdmin] <= 1)
return SCM(playerid, COLOR_RED, !"Вы не можете замутить игрока!");
new
targetid,
targettime,
reason[51];

if(sscanf(params, "uds[51]", targetid, targettime, reason))
return SCM(playerid, COLOR_RED, !"Образец мута: /mute [playerid] [minute] [reason]");
if(!IsPlayerConnected(targetid))
return SCM(playerid, COLOR_RED, !"Игрок с введенным вами ID не в сети!");
if(reason[50] != EOS)
return SCM(playerid, COLOR_RED, !"Максимальная длина причины мута: 50 символов");
if(targetid == playerid)
return SCM(playerid, COLOR_RED, !"Вы не можете замутить себя!");
if(targettime < 1)
return SCM(playerid, COLOR_RED, !"Вы не можете замутить игрока меньше, чем на 1 минуту!");

new
server_tick = GetTickCount();

if(player[targetid][pMute] > server_tick)
return SendClientMessage(playerid, COLOR_RED, !"Игрок уже заткнут!");

player[targetid][pMute] = server_tick+targettime*60000;

SavePlayer(targetid, "Mute", player[targetid][pMute], "d");

static const
fmt_str[] = "Администратор %s заткнул игрока %s на %d минут по причине: %s";

new
str[sizeof(fmt_str)-6+MAX_PLAYER_NAME*2+4+50+1];

format(str, sizeof(str), fmt_str, GetName(playerid), GetName(targetid), targettime, reason);
SCMTA(COLOR_RED, str);
return true;
}

Nexius_Tailer
18.10.2019, 19:12
А зачем вообще делать на GetTickCount, если есть gettime?)

SteveStage
18.10.2019, 19:17
А зачем вообще делать на GetTickCount, если есть gettime?)

У меня с ним проблемы - он не подсчитывает время, я кое-как на нем сделал систему бана по дням. Если ты на пальцах объяснишь, как с ним работать, и почему он получает время в секундах - буду благодарен (я знаю, что он записывает в переменные часы, потом минуты, а потом секунды)

Daniel_Cortez
18.10.2019, 19:34
У меня с ним проблемы - он не подсчитывает время, я кое-как на нем сделал систему бана по дням. Если ты на пальцах объяснишь, как с ним работать, и почему он получает время в секундах - буду благодарен (я знаю, что он записывает в переменные часы, потом минуты, а потом секунды)
gettime() не только записывает часы/минуты/секунды в переменные, но и сама тоже возвращает результат (да, так тоже бывает).
На Pro-Pawn wiki есть и объяснение, и примеры использования: http://wiki.pro-pawn.ru/wiki/Gettime

UnO
18.10.2019, 19:42
У меня с ним проблемы - он не подсчитывает время, я кое-как на нем сделал систему бана по дням. Если ты на пальцах объяснишь, как с ним работать, и почему он получает время в секундах - буду благодарен (я знаю, что он записывает в переменные часы, потом минуты, а потом секунды)

если чуть-чуть перевести пример с вики:


new Hour, Minute, Second, Timestamp;
Timestamp = gettime(Hour, Minute, Second);
printf("%02d:%02d:%02d", Hour, Minute, Second);//выведет: "час:минута:секунда" (в данный момент)
printf("Столько секунд прошло с полуночи 1 января 1970: %d", Timestamp);//unix time другими словами

Принцип системы бана можно подать следующим образом:


new unbantime;

cmd:ban(...)
{
unbantime = gettime() + (10*24*60*60);//10 дней * 24 часа * 60 минут * 60 секунд
//прибавляем к unix time количество секунд в 10 днях
//то есть значение unix time будет равно переменной unbantime через 10 дней
}

public OnPlayerConnect(...)
{
if(unbantime < gettime())//если раньше 10 дней - кик
return Kick(...);
}

SteveStage
18.10.2019, 20:13
И еще хотел бы задать вопрос, не связанный с unix временем. Как при коннекте делать запрос на нахождение ника игрока в таблице banlist? Я понимаю, что нужно форматировать, делать запросы, но, делая это, я сам запутался в своем коде, и в итоге получил MySql error, который не могу решить(

- - - Добавлено - - -

Но ты можешь просто проигнорировать его, т.к. я должен сам создать новую тему на форуме по поводу MySql запроса

SteveStage
18.10.2019, 21:23
Спасибо, что проигнорировал, ато я бы совсем разленился)

- - - Добавлено - - -

Закрыто

UnO
18.10.2019, 22:09
Есть миллион тем как с уже готовой системой банов, так и с туториалами по построению запросов.
У меня не всегда есть желание разжевывать уже хренову тучу раз пережеванные до меня вопросы, так шо сорян (:

SteveStage
18.10.2019, 22:35
Я уже сделал, и кстати, спасибо)