shape1
shape2
shape3
shape4
shape7
shape8

Бан на время с использованием unix времени.

  • Автор темы Amfy
  • Дата начала

A

Amfy

Гость
Гость
Важно:

1) Скачайте инклуд mxdate.inc

2) Создайте папку в scriptfiles с названием banlist

3) Время перевода с Unix на нормальное настроено на московское (время зависит от часового пояса сервера).
Ко всем #include добавляем:

#include <mxdate>

Ко всем #define добавляем:

#define DIALOGUNBAN 1377 // 1377 - ид диалога, в случае необходимости поменяйте

В свободное место или в конец мода:

stock GetBan(playerid)
{
new PlayerNick[MAX_PLAYER_NAME],string[255];
GetPlayerName(playerid, PlayerNick, MAX_PLAYER_NAME);
format(string, sizeof(string), "banlist/%s.ini", PlayerNick);
if(fexist(string))
{
new OpenBan = ini_openFile(string);
new bantime, unbantime, PlayerBan[MAX_PLAYER_NAME], reason[128];
ini_getInteger(OpenBan, "BanTime", bantime);
ini_getInteger(OpenBan, "UnBanTime", unbantime);
ini_getString(OpenBan, "PlayerBan", PlayerBan);
ini_getString(OpenBan, "Reason", reason);
ini_closeFile(OpenBan);
if(gettime() >= unbantime) return UnBan(PlayerNick);
else
{
format(string, sizeof(string), "\
Дата бана: %s\n\
Дата Разбана: %s\n\
Забанил: %s\n\
Причина бана: %s\n\
",
date("%dd.%mm.%yyyy в %hh:%ii:%ss",bantime),
date("%dd.%mm.%yyyy в %hh:%ii:%ss",unbantime),
PlayerBan,reason);
ShowPlayerDialog(playerid,DIALOGUNBAN,0,"Вы забанены",string,"Выйти","");
return Kick(playerid);
}
}
else return true;
}
stock UnBan(name[])
{
    new string[64];
    format(string, sizeof(string), "banlist/%s.ini", name);
    return fremove(string);
}
stock AddBan(player, playerid[], giveplayerid[], type = 1, chislo = 0, reason[])
{
new totalban = 0;
switch(type)
{
case 1: totalban = 60*chislo; // минуты
case 2: totalban = 3600*chislo; // часы
case 3: totalban = 86400*chislo; // сутки
default: totalban = chislo; // секунды
}
new string[64];
format(string, sizeof(string), "banlist/%s.ini", playerid);
new OpenBan = ini_createFile(string);
if(OpenBan < 0) ini_openFile(string);
ini_setInteger(OpenBan, "BanTime", gettime());
ini_setInteger(OpenBan, "UnBanTime", gettime()+totalban);
ini_setString(OpenBan, "PlayerBan", giveplayerid);
ini_setString(OpenBan, "Reason", reason);
ini_closeFile(OpenBan); // Закрываем файл.
ShowPlayerDialog(player,DIALOGUNBAN,0,"Вы забанены","{FF0000}Вы забанены","Выйти","");
return Kick(player);
}

В начало public OnPlayerConnect вставляем:

GetBan(playerid);

В public OnPlayerCommandText вставляем:

if(strcmp(cmd, "/ban", true) == 0)
{
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, 0xFFFFFFFF, "USAGE: /ban [playerid] [type:(1-минуты)(2-часы)(3-дни)(другое секунды)] [число] [причина]");
giveplayerid = strval(tmp);
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, 0xFFFFFFFF, "USAGE: /ban [playerid] [type:(1-минуты)(2-часы)(3-дни)(другое секунды)] [число] [причина]");
new type = strval(tmp);
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, 0xFFFFFFFF, "USAGE: /ban [playerid] [type:(1-минуты)(2-часы)(3-дни)(другое секунды)] [число] [причина]");
new chislo = strval(tmp);
if(PlayerInfo[playerid][pAdmin] >= 4)
{
if(giveplayerid != INVALID_PLAYER_ID)
{
new length = strlen(cmdtext);
while ((idx < length) && (cmdtext[idx] <= ' ')) idx++;
new offset = idx;
new result[64];
while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
{
result[idx - offset] = cmdtext[idx];
idx++;
}
result[idx - offset] = EOS;
if(!strlen(result)) return SendClientMessage(playerid, 0xFFFFFFFF, "USAGE: /ban [playerid] [type:(1-минуты)(2-часы)(3-дни)(другое секунды)] [число] [причина]");
new PlayerNick[MAX_PLAYER_NAME], PlayerBan[MAX_PLAYER_NAME];
GetPlayerName(playerid, PlayerNick, MAX_PLAYER_NAME);
GetPlayerName(giveplayerid, PlayerBan, MAX_PLAYER_NAME);
AddBan(giveplayerid, PlayerBan, PlayerNick, type, chislo, result);
return true;
}
}
return true;
}
if(strcmp(cmd,"/unban",true)==0)
{
if(PlayerInfo[playerid][pAdmin] >= 8)
{
tmp = strtok(cmdtext,idx);
if(!strlen(tmp)) return SendClientMessage(playerid,COLOR_GRAD1,"/unban [players nick]");
UnBan(tmp);
}
return true;
}

Автор: Lik

 
Последнее редактирование:

JdmO_O

Новичок
Пользователь
13.05.2015
233
8
0
Не скачивает инклуд, ссылку поправь

 

Alexr

Новичок
Пользователь
30.05.2016
46
3
0
А как сделать что бы было,"Администратор (Ник) забанил игрока (Ник) на (Число дней)дней.Причина:(Причина)"???

 

Vlad_Trifonov

Гуру
Пользователь
13.03.2015
1 465
5
331
0
@Alexr

Код:
    if(strcmp(cmd, "/ban", true) == 0)
{
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp)) return SendClientMessage(playerid, 0xFFFFFFFF, "USAGE: /ban [playerid] [type:(1-минуты)(2-часы)(3-дни)(другое секунды)] [число] [причина]");
    giveplayerid = strval(tmp);
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp)) return SendClientMessage(playerid, 0xFFFFFFFF, "USAGE: /ban [playerid] [type:(1-минуты)(2-часы)(3-дни)(другое секунды)] [число] [причина]");
    new type = strval(tmp);
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp)) return SendClientMessage(playerid, 0xFFFFFFFF, "USAGE: /ban [playerid] [type:(1-минуты)(2-часы)(3-дни)(другое секунды)] [число] [причина]");
    new chislo = strval(tmp);
    new string[100];
    new nametype[7];
    if(PlayerInfo[playerid][pAdmin] >= 4)
    {
        if(giveplayerid != INVALID_PLAYER_ID)
        {
            new length = strlen(cmdtext);
            while ((idx < length) && (cmdtext[idx] <= ' ')) idx++;
            new offset = idx;
            new result[64];
            while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
            {
                result[idx - offset] = cmdtext[idx];
                idx++;
            }
            result[idx - offset] = EOS;
            if(!strlen(result)) return SendClientMessage(playerid, 0xFFFFFFFF, "USAGE: /ban [playerid] [type:(1-минуты)(2-часы)(3-дни)(другое секунды)] [число] [причина]");
            new PlayerNick[MAX_PLAYER_NAME], PlayerBan[MAX_PLAYER_NAME];
            GetPlayerName(playerid, PlayerNick, MAX_PLAYER_NAME);
            GetPlayerName(giveplayerid, PlayerBan, MAX_PLAYER_NAME);
            AddBan(giveplayerid, PlayerBan, PlayerNick, type, chislo, result);
            switch(type)
            {
            case 1: { nametype = "минут"; }
            case 2: {nametype = "часов"; }
            case 3: {nametype = "дней"; }
            case 0,4:{ nametype = "секунд";}
            }
            format(string, sizeof(string), "Администратор %s[%i] заблокировал аккаунт игроку %s на %i %s. Причина: %s", PlayerNick, playerid, PlayerBan, chislo, nametype, result);
            SendClientMessageToAll(0xFFFFFFFF, string);
            return true;
        }
    }
    return true;
}
 

Maxim_Nike

Новичок
Пользователь
27.10.2015
200
4
0
у меня ощибка 

Код:
error 017: undefined symbol "memcpy"
warning 215: expression has no effect
warning 215: expression has no effect
warning 215: expression has no effect
warning 215: expression has no effect
error 001: expected token: ";", but found ")"
error 029: invalid expression, assumed zero
fatal error 107: too many error messages on one line
 
Последнее редактирование модератором:

noname_idk

Гуру
Пользователь
19.07.2015
4 046
7
787
0
Скриптер
error 017: undefined symbol "memcpy"
в данном мануале вообще не увидел этой переменной. Вы где ее откапали?


warning 215: expression has no effect warning 215: expression has no effect warning 215: expression has no effect warning 215: expression has no effect error 001: expected token: ";", but found ")" error 029: invalid expression, assumed zero fatal error 107: too many error messages on one line
скидывайте строки
 

Maxim_Nike

Новичок
Пользователь
27.10.2015
200
4
0
@Elrmrnt-Kritik, эту ощибку выдает в include mxdate

Код:
memcpy( outStr, formatStr, 0, (sizeOfOutput - 1)*4 ); 
 
Последнее редактирование модератором:

noname_idk

Гуру
Пользователь
19.07.2015
4 046
7
787
0
Скриптер
@Maxim_Nike, ну, во-первых, смотрите на ошибку error 017: undefined symbol "memcpy". Вам нужно объявить эту переменную. Выше вставьте:

new memcpy;
Касаемо остального, еще есть строки? Мне кажется дело не только в этой строке. Пару сверху и пару снизу скиньте.

 

vasya2015

Молодой холостяк.
Пользователь
10.01.2015
644
30
0
27
А вот как сделать нормальное время?... Или что там сменить часовой пояс

Просто например у меня сейчас 02:40 ночи, а в бане указывает 15:40...

И что за цифырки в файле сохраняются? Я баню на 5минут а в файле там какиэто цифры

 

noname_idk

Гуру
Пользователь
19.07.2015
4 046
7
787
0
Скриптер
@vasya2015, в интернете есть онлайн-калькуляторы UNIX времени. Только их могу посоветовать использовать. 

 

vasya2015

Молодой холостяк.
Пользователь
10.01.2015
644
30
0
27
@Elrmrnt-Kritik,

Я не очень знаю что там делать) и как пользоваться)...

Поможешь?

Подскажи что куда вставлять и как) 

И да, еще, может как то можно стырить что из системы часов? (/time)

Там все норм указывает время...

Если можно напишите, скину команду /time

 
Последнее редактирование модератором:

vasya2015

Молодой холостяк.
Пользователь
10.01.2015
644
30
0
27
Крч снова вшил данную систему, теперь время бана указывает на 1день и 1час вперед, например я забанил сегодня 29.06 в 12:23, а оно указывает время бана 30.06 13:23 и потом розбан также на день и час впереди... В инклуде mxdate было что-то типо

stock date_to_timestamp
(
year = 1970, month = 1, day = 1,
hour = 0, minute = 0, second = 0
)
и
stock timestamp_to_date
(
unix_timestamp = 0,

& year = 1970, & month = 1, & day = 1,
& hour = 0, & minute = 0, & second = 0
)  


я (1) сменил на (0), но не помогло, все равно спешит на 1день и 1час
 

Vlad_Trifonov

Гуру
Пользователь
13.03.2015
1 465
5
331
0
@vasya2015, в инклуде mxdate содержатся некоторые ошибки. Поэтому проще, на мой взгляд, будет "подводить" время вручную. Там где у вас вывод даты идет просто отнимите один день и один час. Один час в секундах 3600. 3600*25=90000. Значит, необходимо отнять 90000 секунд.