Вчера был уставшим. Отвечу по порядку...
Как по мне в Вашем примере необязательно было дублировать датапак ...
Датапак как таковой не дублируется. CloneHandle просто увеличивает кол-во ссылок на объект, при этом сам объект не клонируется, а TIMER_DATA_HNDL_CLOSE закрывает хендл, уменьшая кол-во ссылок на объект. Объект будет уничтожен, когда кол-во ссылок на него станет = 0.
Раз он всё равно перезаписывается, то можно попробовать сыграть на TIMER_REPEAT, но в теле функции обыграть момент выключения таймера, например, через TriggerTimer(g_timer) и KillTimer(timer) ...
TIMER_REPEAT не используется по причине ТЗ - сделать рандомное время срабатывания каждого из циклов таймера.
TIMER_REPEAT с TriggerTimer это конечно интересная идея, но кто будет вызывать этот самый TriggerTimer в нужное время - еще один отдельный таймер?
И я всё таки сомневаюсь в безопасности использования delete по отношению к handle.
Если почитать несколько тем на AM, то можно убедиться, что ее сами разработчики рекомендуют вместо KillTimer и CloseHandle. Но, ваше право.
Я не смог найти в Вашей теме про ретаггинг.
Как раз потому, что там его нет. Вместо этого, можно сейфово изменять тип данных непосредственно в самом прототипе функции:
public Action Timer_SpawnWitch(Handle timer, DataPack hPack)
не прибегая к ре-тагу view_as<DataPack>. Это на самом деле не является приведением типов (как вы выразились), т.к. в случае с view_as значение просто помечается другим тегом, но никаких операций с самим значением не производится.
У него свой тип данных, но по факту производная от Handle. Просто так ответ от базы не скопировать, ибо не Handle. Поэтому пришлось приводить к Handle, а потом копировать.
Здесь всё тоже самое. Можно объявить прототип с заранее необходимыми типами (главное чтобы их размер совпадал) и дальше view_as не потребуется.
Проблемы началась, когда я пытался гонять функции и Handle плагинов в датапаке из Натива. Ну вот вроде всё правильно, а вылетает ошибка о несуществующей ссылке.
Потому что у каждого у каждого хендла есть владелец и права доступа.
Чтобы обратиться к хендлу из другого плагина, нужно сменить его владельца, выполнив клонирование (CloneHandle) из вызывающей стороны. См.: https://hlmod.ru/thr...unctions.41366/
Исключение: квары, т.к. являются публично доступными, а также хендлы, не позволяющие себя клонировать.