PDA

Просмотр полной версии : [Вопрос] Команда /gov с отчетом времени.



Skyline
11.07.2018, 16:29
Доброго дня, назрел такой вопрос, сейчас стоит антифлуд для игрока, т.е. неважно игрок какой фракции написал команду /gov откат будет только у него, так например в LSPD если 10 человек, могут все разом написать в /gov. Как сделать откат по фракции, т.е. если игрок с LSPD написал в /govб другие игроки с его фракции не могли, нужно отдельно создавать массив для каждой фракции?


CMD:gov(playerid, params[])
{
if(!player_is_authorized{playerid})
return SendClientMessage(playerid, COLOR_GREY, !"Вы не авторизировались.");

if(pInfo[playerid][pMute] == 1)
return MutePlayer(playerid);

if(!IsACop(playerid) && pInfo[playerid][pMember] != 4 && pInfo[playerid][pMember] != 19 && pInfo[playerid][pMember] != 17)
return SendClientMessage(playerid, COLOR_GREY, !"Ты не можешь использовать эту команду.");

if(pInfo[playerid][pRank] < 5)
return SendClientMessage(playerid, COLOR_GREY, !"Тебе нужен 5-й и выше ранг.");

if(GovChat[playerid] > 0 && pInfo[playerid][pMember] != pInfo[playerid][pMember])
{
static const fmt_str[] ="Для следующего сообщения осталось %d сек.";
new string[sizeof(fmt_str) - 2 + 40];
format(string, sizeof string, fmt_str, GovChat[playerid]);
SendClientMessage(playerid, COLOR_GREY, string);
return 0;
}

if(isnull(params))
return SendClientMessage(playerid, COLOR_GREY, !"Использование: /gov [Текст].");

switch(pInfo[playerid][pMember])
{
case 1: SendClientMessageToAll(0x2641FEAA, "|___________ Новости Департамента Полиции LS ___________|");
case 2: SendClientMessageToAll(0x2641FEAA, "|___________ Новости Федерального Бюро Штата ___________|");
case 3: SendClientMessageToAll(0x2641FEAA, "|___________ Новости Воинской Части Штата ___________|");
case 4: SendClientMessageToAll(0x2641FEAA, "|___________ Медицинские Новости Штата ___________|");
case 10: SendClientMessageToAll(0x2641FEAA, "|___________ Новости Департамента Полиции LV ___________|");
case 17: SendClientMessageToAll(0x2641FEAA, "|___________ Новости Tаксопарка ___________|");
case 19: SendClientMessageToAll(0x2641FEAA, "|___________ Новости Коллегии Адвокатов ___________|");
}
new string[MAX_PLAYER_NAME - 6 + 85];
format(string, sizeof(string), "%s[%d]: %s",pInfo[playerid][pName],playerid, params);
SendClientMessageToAll(COLOR_WHITE, string);
GovChat[playerid] = 120;
return 1;
}

whale
11.07.2018, 16:37
Примерно так:

new
gFractionGovLimit[MAX_FRACTIONS]; // MAX_FRACTIONS - количество фракций


{
if(gFractionGovLimit[pInfo[playerid][pFraction]] > 0)
{
// code ...
}
gFractionGovLimit[pInfo[playerid][pFraction]] = 120;
}

Skyline
11.07.2018, 16:59
if(gFractionGovLimit[pInfo[playerid][pMember]] > 0)
{
if(pInfo[playerid][pMember] == 1) SendClientMessageToAll(0x2641FEAA, "|___________ Новости Департамента Полиции LS ___________|");
else if(pInfo[playerid][pMember] == 2) SendClientMessageToAll(0x2641FEAA, "|___________ Новости Федерального Бюро Штата ___________|");
}
gFractionGovLimit[pInfo[playerid][pMember]] = 120;

Примерно так?

I'm Legend
11.07.2018, 17:13
Если ты хочешь делать, как написал Twixyck.

Команда будет выглядеть следующим образом:

CMD:gov(playerid, params[])
{
if(!player_is_authorized{playerid})
return SendClientMessage(playerid, COLOR_GREY, !"Вы не авторизировались.");

if(pInfo[playerid][pMute] == 1)
return MutePlayer(playerid);

if(!IsACop(playerid) && pInfo[playerid][pMember] != 4 && pInfo[playerid][pMember] != 19 && pInfo[playerid][pMember] != 17)
return SendClientMessage(playerid, COLOR_GREY, !"Ты не можешь использовать эту команду.");

if(pInfo[playerid][pRank] < 5)
return SendClientMessage(playerid, COLOR_GREY, !"Тебе нужен 5-й и выше ранг.");

if(gFractionGovLimit[pInfo[playerid][pMember]] > 0)
{
static const
fmt_str[] = "Для следующего сообщения осталось %d сек.";

new
string[sizeof(fmt_str) - 2 + 40];

format(string, sizeof string, fmt_str, gFractionGovLimit[pInfo[playerid][pMember]]);
SendClientMessage(playerid, COLOR_GREY, string);
}

if(isnull(params))
return SendClientMessage(playerid, COLOR_GREY, !"Использование: /gov [Текст].");

switch(pInfo[playerid][pMember])
{
case 1: SendClientMessageToAll(0x2641FEAA, "|___________ Новости Департамента Полиции LS ___________|");
case 2: SendClientMessageToAll(0x2641FEAA, "|___________ Новости Федерального Бюро Штата ___________|");
case 3: SendClientMessageToAll(0x2641FEAA, "|___________ Новости Воинской Части Штата ___________|");
case 4: SendClientMessageToAll(0x2641FEAA, "|___________ Медицинские Новости Штата ___________|");
case 10: SendClientMessageToAll(0x2641FEAA, "|___________ Новости Департамента Полиции LV ___________|");
case 17: SendClientMessageToAll(0x2641FEAA, "|___________ Новости Tаксопарка ___________|");
case 19: SendClientMessageToAll(0x2641FEAA, "|___________ Новости Коллегии Адвокатов ___________|");
}
new string[MAX_PLAYER_NAME - 6 + 85];
format(string, sizeof(string), "%s[%d]: %s",pInfo[playerid][pName],playerid, params);
SendClientMessageToAll(COLOR_WHITE, string);
gFractionGovLimit[pInfo[playerid][pMember]] = 120;
return 1;
}
И не забудь в секундном таймере отнимать единицу.

Skyline
11.07.2018, 17:20
if(gFractionGovLimit[pInfo[i][pMember]] > 0) gFractionGovLimit[pInfo[i][pMember]] --;

Сделал, спасибо, буду проверять.

DeimoS
11.07.2018, 19:14
А UNIX время вам на что дано? -_- Действительно, лучше ведь вкинуть дополнительное действие в таймер

Вот

CMD:gov(playerid, params[])
{
if(!player_is_authorized{playerid})
return SendClientMessage(playerid, COLOR_GREY, !"Вы не авторизировались.");

if(pInfo[playerid][pMute] == 1)
return MutePlayer(playerid);

static const
government_messages[][] =
{
"|___________ Новости Департамента Полиции LS ___________|",
"|___________ Новости Федерального Бюро Штата ___________|",
"|___________ Новости Воинской Части Штата ___________|",
"|___________ Медицинские Новости Штата ___________|",
"|___________ Новости Департамента Полиции LV ___________|",
"|___________ Новости Tаксопарка ___________|",
"|___________ Новости Коллегии Адвокатов ___________|"
};

new frac_idx = -1;
switch(pInfo[playerid][pMember])
{
case 1: frac_idx = 0;
case 2: frac_idx = 1;
case 3: frac_idx = 2;
case 4: frac_idx = 3;
case 10: frac_idx = 4;
case 17: frac_idx = 5;
case 19: frac_idx = 6;
}
if(!(0 <= frac_idx < sizeof(government_messages)))
{
SendClientMessage(playerid, COLOR_GREY, !"Ты не можешь использовать эту команду.");
return 1;
}

if(pInfo[playerid][pRank] < 5)
return SendClientMessage(playerid, COLOR_GREY, !"Тебе нужен 5-й и выше ранг.");

if(isnull(params))
return SendClientMessage(playerid, COLOR_GREY, !"Использование: /gov [Текст].");

static
flood_protection_time[sizeof(government_messages)],
unix_timestamp;

unix_timestamp = gettime();
if(flood_protection_time[frac_idx] > unix_timestamp)
{
static const fmt_str[] ="Для следующего сообщения осталось %d сек.";
new string[sizeof(fmt_str) - 2 + 10];
format(string, sizeof string, fmt_str, flood_protection_time[frac_idx]-unix_timestamp);
SendClientMessage(playerid, COLOR_GREY, string);
return 1;
}

SendClientMessageToAll(0x2641FEAA, government_messages[frac_idx]);
new string[MAX_CHATBUBBLE_LENGTH+1];
format(string, sizeof(string), "%s[%d]: %s",pInfo[playerid][pName], playerid, params);
SendClientMessageToAll(COLOR_WHITE, string);


flood_protection_time[frac_idx] = unix_timestamp+(2*60);// 2 - число минут
return 1;
}
Только при любых правках (удалении/изменении ID фракций) не забудь в switch выставить значение frac_idx в порядке возрастания (они определяют то, к какой ячейке массивов government_messages и flood_protection_time нужно обращаться для той или иной фракции. К слову, такого велосипеда можно было бы избежать, если изначально нормально распределить фракции по ID, хотя бы расположив все правительственные фракции "рядом").

Skyline
11.07.2018, 21:52
Спасибо за ответы!