Ребят, что-то не пойму в чем проблема, помогите =) Смысл следующий - есть GunGame сервер, голосование вызывается в зависимости от последнего раунда (чем больше квар, тем дальше от последнего раунда начало голосования gg_vote_setting 2). Так вот, у меня голосование должно вызываться на втором с конца уровне, т.е. когда кто-то получает гранату. Но тут я обратил внимание что голосование не вызывается вовсе, полез смотреть, увидел ошибку что мод не может отыскать плагин [Supp] MapChooser, окай, думаю я, есть у него кастом настройки для этого дела: gg_vote_custom "amx_rtv", все хорошо, голосование вызывается, но меняется карта сразу после него (#define NOROUND включен). В общем поразмыслил, решил полезть в код GG. Так выдается голосование если мод находит стоковый Nextmap Chooser: Код:
new oldWinLimit = get_cvar_num("mp_winlimit"), oldMaxRounds = get_cvar_num("mp_maxrounds"); set_cvar_num("mp_winlimit",0); // skip winlimit check set_cvar_num("mp_maxrounds",-1); // trick plugin to think game is almost over
// call the vote if(callfunc_begin_i(get_func_id("voteNextmap",plugin),plugin) == 1) callfunc_end();
// set maxrounds back set_cvar_num("mp_winlimit",oldWinLimit); set_cvar_num("mp_maxrounds",oldMaxRounds); }
По аналогии сделал с твоим чурезром, комменты от меня в коде: Код:
// [Supp] MapChooser - mapchooser.amxx else if((plugin = is_plugin_loaded("[Supp] MapChooser")) != -1) //Если находим названия плагина неугомона { log_amx("Starting a map vote from Nextmap Chooser"); //тупо лог
new oldWinLimit = get_cvar_num("mp_winlimit"), oldMaxRounds = get_cvar_num("mp_maxrounds"); //Собираем и схораняем квары, чтобы потом восстановить set_cvar_num("mp_winlimit",0); // меняем квары чтобы карта не кончилась, вроде set_cvar_num("mp_maxrounds",-1); // меняем квары чтобы карта не кончилась, вроде
//Вызываем voteNextmap функцию из плагина неугомона if(callfunc_begin_i(get_func_id("voteNextmap",plugin),plugin) == 1) callfunc_end();
Вроде ничего сложного, но во время голосования вываливается ошибка:
Код
L 01/20/2015 - 00:53:22: Public function -1 is invalid L 01/20/2015 - 00:53:22: [AMXX] Displaying debug trace (plugin "gungame.amxx") L 01/20/2015 - 00:53:22: [AMXX] Run time error 10: native error (native "callfunc_begin_i") L 01/20/2015 - 00:53:22: [AMXX] [0] gungame.sma::start_mapvote (line 9220) L 01/20/2015 - 00:53:22: [AMXX] [1] gungame.sma::change_level (line 5565) L 01/20/2015 - 00:53:22: [AMXX] [2] gungame.sma::change_score (line 5309) L 01/20/2015 - 00:53:22: [AMXX] [3] gungame.sma::ham_player_killed_post (line 1979)
Читал amxmodx wiki, там написано что -1 значит плагин не найден, и по идее не стоит обращать внимания на что, что ниже. Отсюда вопрос, как сделать так, чтобы плагин нашелся? Я вот грешу на return PLUGIN_HANDLED; из плагина мапчузера, он ретурнится в конце функции voteNextmap, может быть такое? В павне не силен, только осваиваю =)
Mapchooser
Код:
/* neygomon created ^_^ | Original Code: AMXX Dev Team
Credits: * serfreeman1337. Помощь по коду * UrpyHb9. Тетирование номинаций * firante. Баг с продлением карт */ #include <amxmodx> #if AMXX_VERSION_NUM < 183 #include <colorchat> #endif
#define SELECTMAPS 5 // Количество карт в голосовании. Не ставить больше 8! #define BLOCK_MAPS 8 // Количество последних сыгранных карт, которые не будут выставлены на голосование. #define MAX_NUMEXTEND 1 // Максимальное число продлений #define STEP_EXTEND 7 // Время продления [В минутах] #define VOTETIME 10 // Время голосования. #define RTV_FUNC // Функция досрочного голосования. Закоментируйте, если не требуется;) #if defined RTV_FUNC #define RTV_DELAY 120 // Через какое время от начала карты можно пользоваться функцией rtv. [В секундах... 60 = 1 минута] #define RTV_PERCENT 60 // Сколько процентов надо набрать, чтобы запустить досрочную смену карты. #endif #define NOMINATE_FUNC // Функция номинации карт. Закоментируйте, если не требуется;) #if defined NOMINATE_FUNC #define MAX_NOMINATE 2 // Максимум карт для номинации #define MAX_NOMINATE_PL 1 // Максимум карт для номинации ОДНИМ игроком #endif #define NOROUND // Поддержка бесконечных раундов. Аля CSDM, GunGame сервера
#if defined NOMINATE_FUNC new Trie:g_tNomMaps, Trie:g_tLoadedMaps; new g_iNomMap[33], g_iIdMapNom[MAX_NOMINATE+1], g_iCountNom; #endif new g_VoteMap[SELECTMAPS+2][32], g_iMapInMenu[SELECTMAPS+1], g_voteCount[SELECTMAPS + 2]; new Trie:g_tBlockedMaps, Array:g_aLoadMaps; new g_iVoteMapNum, g_iMapCount; new g_NextMap[32], szCurrentMap[32]; new bool:g_bVoteStarted, bool:g_bBeInVote, bool:g_bBlockExtended; new g_pTimeLimit, g_oldTimeLimit, g_iTempTimelimit; #if !defined NOROUND new g_pFreezeTime, Float:g_oldFreezeTime; #endif #if defined RTV_FUNC new bool:g_bRockVoted[33], g_iRockVote, g_iStartMap; #endif new const FILE_BLOCKEDMAPS[] = "addons/amxmodx/data/mm_last.ini"; new const FILE_MAPS[] = "addons/amxmodx/configs/maps.ini"; new const g_szSound[][] = { "", "fvox/one", "fvox/two", "fvox/three" }; new const END_SOUND[] = "misc/neugomon/vsem_sps.wav";
public plugin_precache() precache_sound(END_SOUND);
В общем твоим способом не работает =((( Вопрос открыт
gg_changelevel_custom "" Как бы и есть квар) в gangame.cfg Если квар пустой- запустится mapchooser, если и его нет, то будет nextmap В общем квар gg_changelevel_custom "" оставь пустым, даже если ставишь мапчузер. Если мапчузер не нужен- nextmap.amxx. С кодом некогда было разбираться, а так все работает.
[Supp] MapChooser - не есть квар =) Смысл в том, чтобы GunGame вызывал голосование и менял карту с помощью [Supp] MapChooser, как я уже писал, если я ставлю gg_vote_custom "amx_rtv" (голосование от кастом плагина), карта меняется сразу после голосования, а мне нужно чтобы доиграли карту, выявился победитель и только потом карта менялась на выбранную. Вариант с кварами не подходит явно, т.к. не дает доиграть, поэтому явно ему в код нужно дописать кастом плагин.
[quote name='oxoTHuk.' date='21.1.2015, 8:44' post='721360'] В общем квары gg_vote_custom "" gg_changelevel_custom "" оставь пустыми, даже если ставишь мапчузер. Если мапчузер не нужен- nextmap.amxx. С кодом некогда было разбираться, а так все работает.
Так вот, у меня голосование должно вызываться на втором с конца уровне, т.е. когда кто-то получает гранату. Но тут я обратил внимание что голосование не вызывается вовсе, полез смотреть, увидел ошибку что мод не может отыскать плагин [Supp] MapChooser
Ну извините что логи этого не скинул...и это происходило при пустых кварах, от этого я и начал плясать. В логи пишет текст из этого условия: Код:
else log_amx("Using gg_vote_setting without any compatible plugins: could not start a vote!");
Смысл в том, чтобы GunGame вызывал голосование и менял карту с помощью [Supp] MapChooser,
Если не поможет, как костыль))- переименуй [Supp] MapChooser => mapchooser.amxx, тогда при пустом gg_changelevel_custom он его вызовет) Я не стал заморачиваться с супер-мапчузерами (на кой они на ГГ)
Скрытый текст
L 01/21/2015 - 09:22:13: -------- Mapchange to gg_inferno -------- L 01/21/2015 - 09:29:48: [gungame.amxx] Starting a map vote from Nextmap Chooser L 01/21/2015 - 09:29:48: [mapchooser.amxx] Vote: Voting for the nextmap started L 01/21/2015 - 09:30:03: [mapchooser.amxx] Vote: Voting for the nextmap finished. The nextmap will be gg_33_shudder L 01/21/2015 - 09:30:58: -------- Mapchange to gg_33_shudder -------- L 01/21/2015 - 09:43:22: [gungame.amxx] Starting a map vote from Nextmap Chooser L 01/21/2015 - 09:43:22: [mapchooser.amxx] Vote: Voting for the nextmap started L 01/21/2015 - 09:43:37: [mapchooser.amxx] Vote: Voting for the nextmap finished. The nextmap will be gg_jackson2