PDA

Просмотр полной версии : [Вопрос] Оптимизация команды



DmitriyVasilev
02.02.2019, 19:49
Здравствуйте, форумчане. Подскажите как можно оптимизировать данную команду, пожалуйста.
CMD:goverment(playerid, params[])
{
if(IsACop(playerid) || IsAArm(playerid) || IsAMayor(playerid) || IsAMedic(playerid) || IsALicenser(playerid))
if(!GetPVarInt(playerid,"Fraction_Duty")) return 1;
{
new rtext[30];
if(User[playerid][pMuted] > 0)
{
format(YCMDstr, sizeof(YCMDstr), "У Вас бан чата! До снятия: %i секунд(ы)",User[playerid][pMuted]);
SCM(playerid, COLOR_LIGHTRED, YCMDstr);
return 1;
}
if(sscanf(params, "s[128]", params[0])) return SCM(playerid, -1, "Введите: (/gov)erment [текст]");
if(User[playerid][pMember] == 1 || User[playerid][pLeader] == 1)
{
if(User[playerid][pRank] < 14) return 1;
if(User[playerid][pRank] == 14) rtext = "Новости:";
else if(User[playerid][pRank] == 15) rtext = "Новости:";
}
else if(User[playerid][pMember] == 2 || User[playerid][pLeader] == 2)
{
if(User[playerid][pRank] < 8) return 1;
if(User[playerid][pRank] == 8) rtext = "Новости:";
else if(User[playerid][pRank] == 9) rtext = "Новости:";
}
else if(User[playerid][pMember] == 3 || User[playerid][pLeader] == 3)
{
if(User[playerid][pRank] < 15) return true;
if(User[playerid][pRank] == 15) rtext = "Новости:";
else if(User[playerid][pRank] == 16) rtext = "Новости:";
}
else if(User[playerid][pMember] == 4 || User[playerid][pLeader] == 4)
{
if(User[playerid][pRank] < 9) return 1;
if(User[playerid][pRank] == 10) rtext = "Новости:";
else if(User[playerid][pRank] == 9)
{
if(User[playerid][pJobHealLeader] == 1) rtext = "Новости:";
else if(User[playerid][pJobHealLeader] == 2) rtext = "Новости:";
else if(User[playerid][pJobHealLeader] == 3) rtext = "Новости:";
}
else SCM(playerid,COLOR_GREY,"Вам недоступна данная команда");
}
else if(User[playerid][pMember] == 7 || User[playerid][pLeader] == 7)
{
if(User[playerid][pRank] < 5) return 1;
if(User[playerid][pRank] == 5) { rtext = "Новости:"; }
else if(User[playerid][pRank] == 6) { rtext = "Новости:"; }
}
else if(User[playerid][pMember] == 10 || User[playerid][pLeader] == 10)
{
if(User[playerid][pRank] < 14) return 1;
if(User[playerid][pRank] == 14) rtext = "Новости:";
else if(User[playerid][pRank] == 15) rtext = "Новости:";
}
else if(User[playerid][pMember] == 11 || User[playerid][pLeader] == 11)
{
if(User[playerid][pRank] < 9) return 1;
if(User[playerid][pRank] == 9) rtext = "Новости:";
else if(User[playerid][pRank] == 10) rtext = "Новости:";
}
else if(User[playerid][pMember] == 19 || User[playerid][pLeader] == 19)
{
if(User[playerid][pRank] < 15) return 1;
if(User[playerid][pRank] == 15) rtext = "Новости:";
else if(User[playerid][pRank] == 16) rtext = "Новости:";
}
else if(User[playerid][pMember] == 21 || User[playerid][pLeader] == 21)
{
if(User[playerid][pRank] < 14) return 1;
if(User[playerid][pRank] == 14) rtext = "Новости:";
else if(User[playerid][pRank] == 15) rtext = "Новости:";
}
else if(User[playerid][pMember] == 22 || User[playerid][pLeader] == 7)
{
if(User[playerid][pRank] < 9) return 1;
if(User[playerid][pRank] == 10) rtext = "Новости:";
else if(User[playerid][pRank] == 9) rtext = "Новости:";
}
else if(User[playerid][pMember] == 33 || User[playerid][pLeader] == 7)
{
if(User[playerid][pRank] < 9) return 1;
if(User[playerid][pRank] == 10) rtext = "Новости:";
else if(User[playerid][pRank] == 9) rtext = "Новости:";
}
else return 1;
SendClientMessageToAll(-1, "---========== Государственные Новости ==========---");
format(YCMDstr, sizeof(YCMDstr), "{2641ED}%s %s: %s", rtext, User[playerid][pName], params[0]);
SendClientMessageToAll(-1, YCMDstr);
}
return 1;
}

UnO
02.02.2019, 20:59
CMD:goverment(playerid, params[])
{
switch(User[playerid][pMember])
{
case 1,10,21:
if(User[playerid][pRank] < 14) return 1;
case 2:
if(User[playerid][pRank] < 8) return 1;
case 3,19:
if(User[playerid][pRank] < 15) return 1;
case 4,11,22,33:
if(User[playerid][pRank] < 9) return 1;
case 7:
if(User[playerid][pRank] < 5) return 1;
default:
return 1;
}

if(!GetPVarInt(playerid, "Fraction_Duty"))
return 1;

if(User[playerid][pMuted] > 0)
{
format(YCMDstr, sizeof(YCMDstr), "У Вас бан чата! До снятия: %i секунд(ы)", User[playerid][pMuted]);
return SCM(playerid, COLOR_LIGHTRED, YCMDstr);
}

if(isnull(params))
return SCM(playerid, -1, !"Введите: (/gov)erment [текст]");

SendClientMessageToAll(-1, !"---========== Государственные Новости ==========---");
format(YCMDstr, sizeof(YCMDstr), "{2641ED}Новости %s: %s", User[playerid][pName], params);
SendClientMessageToAll(-1, YCMDstr);
return 1;
}

А вообще макс.ранг для фракций лучше в массив поместить, чтобы потом каждый раз не париться со свитчом.

DmitriyVasilev
03.02.2019, 12:58
а иснулл чем лучше парамса?

m1n1vv
03.02.2019, 13:26
а иснулл чем лучше парамса?

isnull - функция для проверки значения строки (введено что-то или нет), а params - строка.
Если в параметрах команды нужно указать одно значение, то params можно указывать без массива. Если там текст, то указываем везде params, а если число, через strval присваиваем значение к какой-то переменной и уже ее дальше используем.
Если больше одного параметра, то нужно использовать sscanf. И уже будут params[0], params[1] и так далее. Но есть директива extract params, через которую можно превращать строку в значения нужного типа. Например:

extract params -> new id, Float:health, string:text[70];

Daniel_Cortez
03.02.2019, 15:11
ИМХО, когда в вашем коде достаточно других проблем (беглым взглядом удалось найти форматирование в глобальный массив, неправильную табуляцию и лишнюю пару "{}" после 2-го if), оптимизация должна волновать в последнюю очередь.

bullplex
03.02.2019, 15:27
@Daniel_Cortez, чем «форматирование в глобальный массив» Вам не угодило?

Geebrox
03.02.2019, 18:36
@Daniel_Cortez, чем «форматирование в глобальный массив» Вам не угодило?

Вы с соседями едите из одной тарелки?

bullplex
03.02.2019, 20:49
Вы с соседями едите из одной тарелки?

Да, время на мытье посуды сокращается.

Geebrox
03.02.2019, 20:53
Да, время на мытье посуды сокращается.

Отлично, но нормальные люди предпочитают иметь свои посуды.