Dragon_Knight
Участник
- Сообщения
- 5
- Реакции
- 0
Всем привет
С языком знаком хорошо, но вот решил заняться сервером CSS. Вики и доки по SM написаны ужасно, без примеров и без сопутствующего материала. Отсюда и много вопросов...
Итак, понадобился какой-нить наглядный таймер, который было-бы крайне просто использовать. Ничего готово не нашёл, и решил написать свой. Собственно написал такой инклуд:
Работать с ним так: CountdownHintTimerCreate(pid, 25, "Таймер. осталось %d сек.", 0);
Нареканий по работе нету, однако есть много мест, которые сделаны откровенно ... плохо, в частности:
* CountdownHintTimerCreate > CountdownHintTimer(Handle:0, pack); - как более грамотно избавиться от этого топора, что-бы таймер начинал работать сразу.
* Как сделать полноценный колбэк OnCountdownHintTimerEnd(client, time, id) ?
* И что в целом можно сделать в коде, что-бы привести к более адекватному виду?
С языком знаком хорошо, но вот решил заняться сервером CSS. Вики и доки по SM написаны ужасно, без примеров и без сопутствующего материала. Отсюда и много вопросов...
Итак, понадобился какой-нить наглядный таймер, который было-бы крайне просто использовать. Ничего готово не нашёл, и решил написать свой. Собственно написал такой инклуд:
PHP:
new Handle:Timer_Countdown[MAXPLAYERS+1] = {INVALID_HANDLE, ...};
new CountdownCounts[MAXPLAYERS+1] = {0, ...};
forward OnCountdownHintTimerEnd(client, time, id);
public CountdownHintTimerCreate(client, time, String:text[], id)
{
if(Timer_Countdown[client] == INVALID_HANDLE)
{
new Handle:pack = CreateDataPack();
WritePackCell(pack, client);
WritePackCell(pack, time);
WritePackString(pack, text);
WritePackCell(pack, id);
CountdownHintTimer(Handle:0, pack); // Мегатопор
Timer_Countdown[client] = CreateTimer(1.0, CountdownHintTimer, pack, TIMER_REPEAT);
}
else
{
CPrintToChat(client, "{gold}[CountdownHintTimer]: {red}Ошибка создания таймера для Вас, таймер уже создан!");
}
}
public Action:CountdownHintTimer(Handle:timer, Handle:pack)
{
new client, time, String:text[64], id;
ResetPack(pack);
client = ReadPackCell(pack);
time = ReadPackCell(pack);
ReadPackString(Handle:pack, text, sizeof(text));
id = ReadPackCell(pack);
if(CountdownCounts[client] < time)
{
PrintHintText(client, text, (time - CountdownCounts[client]));
CountdownCounts[client]++;
}
else
{
ClearTimer(Timer_Countdown[client]);
CountdownHintTimerReset(client);
CloseHandle(pack);
PrintHintText(client, "");
new result;
Call_StartFunction(INVALID_HANDLE, OnCountdownHintTimerEnd);
Call_PushCell(client);
Call_PushCell(time);
Call_PushCell(id);
Call_Finish(result);
}
}
public CountdownHintTimerReset(client)
{
Timer_Countdown[client] = INVALID_HANDLE;
CountdownCounts[client] = 0;
}
Нареканий по работе нету, однако есть много мест, которые сделаны откровенно ... плохо, в частности:
* CountdownHintTimerCreate > CountdownHintTimer(Handle:0, pack); - как более грамотно избавиться от этого топора, что-бы таймер начинал работать сразу.
* Как сделать полноценный колбэк OnCountdownHintTimerEnd(client, time, id) ?
* И что в целом можно сделать в коде, что-бы привести к более адекватному виду?