PDA

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



denis01
17.05.2014, 00:51
Ув. пользователи портала Pro-pawn будьте любезны помогите оптимизировать и добавить чтобы кикало после 15 минут AFK, просто сам в этом не очень разбираюсь.

Ко всем new:

new plafk[MAX_PLAYERS];
В паблик OnPlayerSpawn:

plafk[playerid] = 0;
В паблик OnPlayerConnect:

plafk[playerid] = -2;
В паблик OnPlayerDeath:

plafk[playerid] = -2;
В паблик OnPlayerUpdate:
При выходе из АФК игроку будет писать его время АФК

if(plafk[playerid] > -2)
{
if(plafk[playerid] > 0)
{
new string[128];
format(string,sizeof(string),"Время вашего АФК: %s",ConvertSeconds(plafk[playerid]));
SendClientMessage(playerid, COLOR_ORANGE, string);
SetPlayerChatBubble(playerid, "АФК: завершено", COLOR_WHITE, 10.0, 1);
}
plafk[playerid] = 0;
}
В паблик OnGameModeInit:

SetTimer("AFKSystem", 1000, 1);
В конец мода:

forward AFKSystem();
public AFKSystem()
{
for(new playerid;playerid < MAX_PLAYERS;playerid++)
{
if(IsPlayerConnected(playerid))
{
if(plafk[playerid] == 0) plafk[playerid] -= 1;
else if(plafk[playerid] == -1)
{
plafk[playerid] = 1;
new string[128];
format(string, sizeof(string), "АФК: %s", ConvertSeconds(plafk[playerid]));
SetPlayerChatBubble(playerid, string, COLOR_WHITE, 10.0, 70000000);
}
else if(plafk[playerid] > 0)
{
new string[255];
plafk[playerid] += 1;
format(string, sizeof(string), "АФК: %s", ConvertSeconds(plafk[playerid]));
SetPlayerChatBubble(playerid, string, COLOR_WHITE, 10.0, 70000000);
}
}
}
}
Тоже в конец мода, отвечает за время:

stock ConvertSeconds(time)
{
new string[128];
if(time < 60) format(string, sizeof(string), "%d секунд", time);
else if(time == 60) string = "1 минуту";
else if(time > 60 && time < 3600)
{
new Float: minutes;
new seconds;
minutes = time / 60;
seconds = time % 60;
format(string, sizeof(string), "%.0f минут и %d секунд", minutes, seconds);
}
else if(time == 3600) string = "1 час";
else if(time > 3600)
{
new Float: hours;
new minutes_int;
new Float: minutes;
new seconds;
hours = time / 3600;
minutes_int = time % 3600;
minutes = minutes_int / 60;
seconds = minutes_int % 60;
format(string, sizeof(string), "%.0f:%.0f:%d", hours, minutes, seconds);
}
return string;
}

wAx
17.05.2014, 06:52
Вот мой вариант:

Ко всем new

new is_afk[MAX_PLAYERS];
new afk_time[2][MAX_PLAYERS];

В OnPlayerConnect

is_afk[playerid] = 0;
afk_time[0][playerid] = 0, afk_time[1][playerid] = 0;

В AfkSystem


if(is_afk[playerid] != 0) is_afk[playerid] = 0;
else {
afk_time[0][playerid]++;
if(afk_time[0][playerid] > 60) afk_time[1][playerid]++,afk_time[0][playerid] = 0;
if(afk_time[1][playerid] > 15) return Kick(playerid); // тут кикаем игрока
new string[50];
format(string,sizeof(string),"АФК: %02d:%02d",afk_time[1][playerid],afk_time[0][playerid]);
SetPlayerChatBubble(playerid, string, COLOR_WHITE, 10.0, 70000000);
}


В OnPlayerUpdate


is_afk[playerid] = 1;

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

Если хочешь такие же функции что и в твоем Convert Seconds, то вот:


if(is_afk[playerid] != 0) is_afk[playerid] = 0;
else {
afk_time[0][playerid]++;
if(afk_time[0][playerid] > 60) afk_time[1][playerid]++,afk_time[0][playerid] = 0;
if(afk_time[1][playeird] > 15) return Kick(playerid); // тут кикаем игрока
new string[50];
if(afk_time[1][playerid] <= 0) format(string,sizeof(string),"АФК: %d секунд",afk_time[0][playerid]);
else format(string, 50, "АФК: %02d:%02d", afk_time[1][playerid], afk_time[0][playerid]);
SetPlayerChatBubble(playerid, string, COLOR_WHITE, 10.0, 70000000);
}

А больше подсчета минут тебе не нужно, ибо ты хочешь кик после 15 минут.

denis01
17.05.2014, 11:56
Спасибо, можно еще вопрос,

В AfkSystem вы говорите так?

forward AFKSystem();
public AFKSystem()
{
if(is_afk[playerid] != 0) is_afk[playerid] = 0;
else
{
afk_time[0][playerid]++;
if(afk_time[0][playerid] > 60) afk_time[1][playerid]++,afk_time[0][playerid] = 0;
if(afk_time[1][playeird] > 15) return Kick(playerid); // тут кикаем игрока
new string[50];
format(string,sizeof(string),"АФК: %02d:%02d",afk_time[1][playerid],afk_time[0][playerid]);
SetPlayerChatBubble(playerid, string, COLOR_WHITE, 10.0, 70000000);
}
}

Nurick
17.05.2014, 12:38
afk_time[0][playerid] = 0, afktime[1][playerid] = 0;// тут исправь
afk_time[0][playerid] = 0, afk_time[1][playerid] = 0;


if(afk_time[1][playeird] > 15) return Kick(playerid); // тут тоже
if(afk_time[1][playerid] > 15) return Kick(playerid);


forward AFKSystem();
public AFKSystem()
{
for(new playerid;playerid < MAX_PLAYERS;playerid++)
{
if(IsPlayerConnected(playerid))
{
if(is_afk[playerid] != 0) is_afk[playerid] = 0;
else
{
afk_time[0][playerid]++;
if(afk_time[0][playerid] > 60) afk_time[1][playerid]++,afk_time[0][playerid] = 0;
if(afk_time[1][playerid] > 15) return Kick(playerid); // тут кикаем игрока
new string[50];
format(string,sizeof(string),"АФК: %02d:%02d",afk_time[1][playerid],afk_time[0][playerid]);
SetPlayerChatBubble(playerid, string, COLOR_WHITE, 10.0, 70000000);
}
}
}
}

denis01
17.05.2014, 12:47
При компиляции выходит Варнинг
warning 209: function "AFKSystem" should return a value

wAx
17.05.2014, 14:25
forward AFKSystem();
public AFKSystem()
{
for(new playerid;playerid < MAX_PLAYERS;playerid++)
{
if(IsPlayerConnected(playerid))
{
if(is_afk[playerid] != 0) is_afk[playerid] = 0;
else
{
afk_time[0][playerid]++;
if(afk_time[0][playerid] > 60) afk_time[1][playerid]++,afk_time[0][playerid] = 0;
if(afk_time[1][playerid] > 15) return Kick(playerid); // тут кикаем игрока
new string[50];
format(string,sizeof(string),"АФК: %02d:%02d",afk_time[1][playerid],afk_time[0][playerid]);
SetPlayerChatBubble(playerid, string, COLOR_WHITE, 10.0, 70000000);
}
}
}
return 1;
}

DOS-Protection
17.05.2014, 16:35
Оптимизаторы от бога.

DeimoS
17.05.2014, 17:36
Если значение переменной не может быть меньше 0 или больше 255 - можно использовать char, по идее

wAx
17.05.2014, 17:44
Оптимизаторы от бога.
Ну вот если бы ты предложил свой вариант, твой пост имел бы хоть какой то смысл, а так...

denis01
17.05.2014, 18:06
Код не рабочий, не показывает то что ты АФК: %02d:%02d

Salvacore
17.05.2014, 18:14
бамп. (http://pro-pawn.ru/showthread.php?8252-%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0-AFK)

denis01
17.05.2014, 18:16
бамп. (http://pro-pawn.ru/showthread.php?8252-%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0-AFK)
А текст над игроком не будет выводиться АФК