PDA

Просмотр полной версии : [Вопрос] Перехват KillTimer, как бы его ммм?



vovandolg
03.08.2016, 18:39
Как можно сделать правильно такой перехват с KillTimer:



KillTimer(gTimer); // вот к примеру убийца таймера

//вот перехват будет
stock KillTimerEx(timerid)
{
gTimer = EOS; // что нужно поставить в аргументах чтобы эту переменную можно было передать сюда
KillTimer(timerid);
return 1;
}
#if defined _ALS_KillTimer
#undef KillTimer
#else
#define _ALS_KillTimer
#endif
#define KillTimer KillTimerEx

$continue$
03.08.2016, 21:14
Чет не вкурил, что нужно ТС.

vovandolg
03.08.2016, 22:29
В таймер передаётся всего лишь id таймера, а мне нужно чтобы ещё название переменной таймера передавалось или переменная как нибудь

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

Чтобы чистить/обнулять переменную...

Nexius_Tailer
03.08.2016, 22:42
Передавать переменную по ссылке


KillTimer(timerid, &timervar)
{
//...
}

Daniel_Cortez
03.08.2016, 22:58
http://pro-pawn.ru/showthread.php?10611 (в самом начале темы пункт 2).

Nexius_Tailer
03.08.2016, 23:22
http://pro-pawn.ru/showthread.php?10611 (в самом начале темы пункт 2).

KillTimer(timerid, &timervar = 0)
{
//...
}

Или вообще имя функции поменять, это ж пример. К тому-же та тема скорее с советами, нежели правилами

vovandolg
04.08.2016, 00:14
Вот как я и хотел, не знал только как переменной название обозначать в аргументах
Nexius_Tailer, благодарю :victory:
Так же сделал по совету DC и вот что вышло

stock KillTimerEx(&timervar)
{
timervar = EOS;
KillTimer(timervar);
return 1;
}
#if defined _ALS_KillTimer
#undef KillTimer
#else
#define _ALS_KillTimer
#endif
#define KillTimer KillTimerEx

Nexius_Tailer
04.08.2016, 00:37
Вот как я и хотел, не знал только как переменной название обозначать в аргументах
Nexius_Tailer, благодарю :victory:
Так же сделал по совету DC и вот что вышло

stock KillTimerEx(&timervar)
{
timervar = EOS;
KillTimer(timervar);
return 1;
}
#if defined _ALS_KillTimer
#undef KillTimer
#else
#define _ALS_KillTimer
#endif
#define KillTimer KillTimerEx
Обнулять в конце надо, иначе убиваешь ты не тот ид.

vovandolg
04.08.2016, 00:41
Обнулять в конце надо, иначе убиваешь ты не тот ид.

Да, зашёл чтобы это написать:sarcastic:
А то думаю что не так на сервере таймеры копируются))

В итоге вот:

stock KillTimerEx(&timervar)
{
KillTimer(timervar);
timervar = EOS;
return 1;
}
#if defined _ALS_KillTimer
#undef KillTimer
#else
#define _ALS_KillTimer
#endif
#define KillTimer KillTimerEx

$continue$
04.08.2016, 02:09
Я один не понял в чем профит от этого?

vovandolg
04.08.2016, 02:55
Я один не понял в чем профит от этого?

То не понял, это не понял,
у меня есть проверки на таймеры включены ли они и я проверяю их через переменную,
обнулена ли она, если да то запускаю ещё таймер, ну?

Nexius_Tailer
04.08.2016, 03:32
То не понял, это не понял,
у меня есть проверки на таймеры включены ли они и я проверяю их через переменную,
обнулена ли она, если да то запускаю ещё таймер, ну?
Стоп. Иды таймеров начинаются не с 1, а с нуля.
Если нужно их "обнулять" - нужно ставить отрицательное значение, например -1

vovandolg
04.08.2016, 03:38
Да прав) но для моего мода это нормальное явление так как 1ый таймер зарождается невинный и не тронутый в дальнейшем.

Seregamil
04.08.2016, 07:36
new timer_value = 0 ;

--[[ ]]

timer_value = SetTimer(...);

--[[ ]]

KillTimer(timer_value);
не?

vovandolg
04.08.2016, 08:03
new timer_value = 0 ;

--[[ ]]

timer_value = SetTimer(...);

--[[ ]]

KillTimer(timer_value);
не?

Не не не, он у меня без указания ID, просто в OnGameModeInit стоит

ziggi
04.08.2016, 10:57
Стоп. Иды таймеров начинаются не с 1, а с нуля.
Если нужно их "обнулять" - нужно ставить отрицательное значение, например -1

Не правда, они начинаются с 1, как и все ID в игре (кроме ID игрока).

А по теме: так лучше не перехватывать, и лучше после KillTimer менять переменную самостоятельно.

Nexius_Tailer
04.08.2016, 15:17
Не правда, они начинаются с 1, как и все ID в игре (кроме ID игрока).
Значит опять вики ошиблась, исправлю. А насчёт "как и все", нет. Большинство как раз именно с нуля начинают счёт

[14:14:39] Starting IDs:
[14:14:39] 3D Text Label: 0
Actor: 0
File: 5134872
GangZone: 0
Object: 1
Pickup: 0
Player Class: 0
TextDraw: 0
Timer: 1
Vehicle: 1

new label = _:Create3DTextLabel("I'm at the coordinates:\n30.0, 40.0, 50.0", 0x008080FF, 30.0, 40.0, 50.0, 40.0, 0, 0);
new actor = CreateActor(0, 0.0, 0.0, 3.0, 0.0);
new handle = _:fopen("file.txt", io_write);
new gangzone = GangZoneCreate(1248.011, 2072.804, 1439.348, 2204.319);
new object = CreateObject(2587, 2001.195679, 1547.113892, 14.283400, 0.0, 0.0, 96.0);
new pickup = CreatePickup(1242, 2, 1503.3359, 1432.3585, 10.1191, -1);
new classid = AddPlayerClass(0, 1958.33, 1343.12, 15.36, 269.15, 26, 36, 28, 150, 0, 0);
new wText = _:TextDrawCreate(240.0,580.0,"Welcome to my SA-MP server");
new timer = SetTimer("message", 1000, false);
new vehicle = CreateVehicle(520, 2109.1763, 1503.0453, 32.2887, 82.2873, -1, -1, 60);
print("Starting IDs:");
printf("3D Text Label: %d\nActor: %d\nFile: %d\nGangZone: %d\nObject: %d\nPickup: %d\nPlayer Class: %d\n\
TextDraw: %d\nTimer: %d\nVehicle: %d", label, actor, handle, gangzone, object, pickup, classid, wText, timer, vehicle);

ziggi
04.08.2016, 16:43
Значит опять вики ошиблась, исправлю. А насчёт "как и все", нет. Большинство как раз именно с нуля начинают счёт

[14:14:39] Starting IDs:
[14:14:39] 3D Text Label: 0
Actor: 0
File: 5134872
GangZone: 0
Object: 1
Pickup: 0
Player Class: 0
TextDraw: 0
Timer: 1
Vehicle: 1

new label = _:Create3DTextLabel("I'm at the coordinates:\n30.0, 40.0, 50.0", 0x008080FF, 30.0, 40.0, 50.0, 40.0, 0, 0);
new actor = CreateActor(0, 0.0, 0.0, 3.0, 0.0);
new handle = _:fopen("file.txt", io_write);
new gangzone = GangZoneCreate(1248.011, 2072.804, 1439.348, 2204.319);
new object = CreateObject(2587, 2001.195679, 1547.113892, 14.283400, 0.0, 0.0, 96.0);
new pickup = CreatePickup(1242, 2, 1503.3359, 1432.3585, 10.1191, -1);
new classid = AddPlayerClass(0, 1958.33, 1343.12, 15.36, 269.15, 26, 36, 28, 150, 0, 0);
new wText = _:TextDrawCreate(240.0,580.0,"Welcome to my SA-MP server");
new timer = SetTimer("message", 1000, false);
new vehicle = CreateVehicle(520, 2109.1763, 1503.0453, 32.2887, 82.2873, -1, -1, 60);
print("Starting IDs:");
printf("3D Text Label: %d\nActor: %d\nFile: %d\nGangZone: %d\nObject: %d\nPickup: %d\nPlayer Class: %d\n\
TextDraw: %d\nTimer: %d\nVehicle: %d", label, actor, handle, gangzone, object, pickup, classid, wText, timer, vehicle);

И правда, ошибся. Пора уже было привыкнуть, что в SA-MP нет никакой логики :)

vovandolg
04.08.2016, 18:54
Не правда, они начинаются с 1, как и все ID в игре (кроме ID игрока).

А по теме: так лучше не перехватывать, и лучше после KillTimer менять переменную самостоятельно.

А почему это лучше не делать?
Что может критического быть в таком подходе?
Частое использование EOS? Или ссылки в аргументах как то негативно влияют?

ziggi
04.08.2016, 19:43
А почему это лучше не делать?
Что может критического быть в таком подходе?
Частое использование EOS? Или ссылки в аргументах как то негативно влияют?

Нужно сохранять обратную совместимость, это поможет избежать потенциальных ошибок в будущем.

Daniel_Cortez
04.08.2016, 20:14
и лучше после KillTimer менять переменную самостоятельно.
... или написать свою функцию, которая вызывает KillTimer и записывает значение в переменную.


А почему это лучше не делать?
Что может критического быть в таком подходе?
Частое использование EOS? Или ссылки в аргументах как то негативно влияют?


new const timer_id = GetSomeTimerID();
DestroyTimer(timer_id);

С приведённым ранее перехватом такой код не скомпилируется. И хотя вряд ли кто-то стал бы использовать new и const вместе, перехват с изменёнными аргументами всё же нарушает совместимость. Но вы, конечно же, можете "прибивать гвоздями" к перехватам и уродовать свой код, как захотите. Это же ваш код, вам в нём потом копаться.

vovandolg
04.08.2016, 22:55
Написал тексту на строк десять, да думаю не стану это отправлять
Кратко и понятно:
Палки и гвозди - есть "все" перехваты, а то какие они это каждому своё, лижбы не нарушалось не чего и не давало сбои.


Я придержался пунктов, а под конец до меня до копались всё таки чтобы я изменил название, что вся магия в названии только..
Обидно чёт :sarcastic:

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

Тема решена кстате закрыть можно, не будем ругаться ради кодинга =3

Daniel_Cortez
05.08.2016, 12:11
Я придержался пунктов, а под конец до меня до копались всё таки чтобы я изменил название, что вся магия в названии только..
Обидно чёт :sarcastic:
Вы не читали по той ссылке, что я вам скидывал, так ведь? Между прочим, там подробно расписано, почему не следует менять параметры в перехватах.
Хотя... чего я вообще стараюсь? Вы же опять прочтёте всё между строк и будете потом обижаться.

Закрыто. Переместил тему в архив.