SNauPeR, А теперь, как и обещал, по полочкам.
Как я понимаю в вашем понимании API это такое (пример из РеГГ)
Код:
StartMapVote()
{
if(callfunc_begin(g_szVoteFunction, g_szCallPluginName) == 1)
{
//callfunc_push_int(0);
callfunc_end();
}
}
Смею вас разочаровать, но нет. Это не АПИ, а костыль как и говорили все мы раньше.
Вы в вашем же плагине как раз таки используете апи ММ вызывая натив map_scheduler_start_vote из инклуда. Я ошибся сказав, что это паттерн (программирования) прокси. На самом деле это адаптер. Если вы хотите использовать ММ
Mistrick-а, то вам нужно вызывать не паблик функцию, а именно map_scheduler_start_vote. Пример
Код:
StartMapVote()
{
map_scheduler_start_vote(VOTE_BY_CMD);
}
Тогда это будет более правильно. Если хотите поддержку разных ММ, то есть дефайны, модули и прочие техники.
И та же ситуация с вашим примером. Зачем какому то плагину Х знать о какой то паблик функции в плагине У, если он может напрямую вызвать старт голосования нативом их ММ. У вас получается лишняя прослойка, которая способствует усложнению дебага и понимании что творится в коде. А также не дает никаких гарантий успешного исполнения. В случае если вы будете вызывать натив, у вас АМХХ в самом начале проверить есть ли такой плагин, который зарегистрировал данный натив, сможет обработать исключение. В логах получите более адекватное представление, что пошло не так. И чисто архитектурно это более грамотно. Что в случаее с нативом, что в случае с паблик функцие плагину использущему их нужно знать их название. Только в случаи с использованием паблик функции, плагину еще нужно знать имя другого плагина. А вы думали что будет, если кто-то захочет его переименовать в mm_fix.amxx например? Ему придется указывать новое имя. А учитывая общий уровень умений серверодержателей, то вы получите тонну сообщений (не багрепортов), о том, что ничего не работает.
Постараюсь навести аналогию. Есть электроприбор в котором есть предохранитель. И вот ваш плагин, это то же самое, если бы вы взяли и вынули предохранитель и соединили провода напрямую. Результат один и тот же. Прибор работает. Но правильно ли это? Думаю сами понимаете. Так что лучше если уж и так форкаете РеГГ, то добавьте в него сразу поддержку ММ мистрика (даже тем же дефайном).
Ну и еще пару слов о примере с переключением при достижении количества килов, пока идет поток мыслей в моей голове. Если забыть, что данный функционал уже есть в самом ММ и это чисто как пример, то ваш плагин тут попросту не нужен. Примерный код будет выглядеть так
Код:
if (kills > 1000)
{
map_scheduler_start_vote(VOTE_BY_CMD);
}
Так как вы говорите это будет выглядеть так
Код:
if (kills > 1000)
{
if(callfunc_begin("mm_startvote", "map_manager_changer.amxx") == 1)
{
callfunc_end();
}
}
Выводы делайте сами. Во втором случае +1 плагин, + 1 прослойка, +1 непредсказуемое поведение. А результат один и тот же