RTV
| |
Naykon
|
Дата: Воскресенье, 26.02.2012, 10:54:19 | Сообщение # 1 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Переписываю ртв на свой лад столкнулся с проблемой когда высвечивает голосование иногда рандомом в сеню появляется текущая карта хотя она там не нужна!!! Как можно исправитьь ситуацию? Code new Handle:hMapVoteMenu = CreateMenu(Handler_MapVoteMenu); SetMenuTitle(hMapVoteMenu, "%t", "Rock The Vote"); AddMenuItem(hMapVoteMenu , "", "Лучше подумай дважды!", ITEMDRAW_DISABLED); AddMenuItem(hMapVoteMenu , "", "Прежде чем тыкать куда нибудь!\n \n", ITEMDRAW_DISABLED); SetMenuExitButton(hMapVoteMenu , true); for (new i = 0; i < g_NextMapsCount; i++) { AddMenuItem(hMapVoteMenu, g_MapNames[g_NextMaps[i]], g_MapNames[g_NextMaps[i]]); }
new mapIdx; for (new i = g_NextMapsCount; i < (g_MapCount < GetConVarInt(g_Cvar_Maps) ? g_MapCount : GetConVarInt(g_Cvar_Maps)); i++) { mapIdx = GetRandomInt(0, g_MapCount - 1); while (IsInMenu(mapIdx)) if(++mapIdx >= g_MapCount) mapIdx = 0;
g_NextMaps[i] = mapIdx; AddMenuItem(hMapVoteMenu, g_MapNames[mapIdx], g_MapNames[mapIdx]); } decl String:nochange[64]; Format(nochange, 64, "%T", "Don't Change", LANG_SERVER); AddMenuItem(hMapVoteMenu, nochange, nochange); SetMenuExitButton(hMapVoteMenu, false); VoteMenuToAll(hMapVoteMenu, 20); LogMessage("[RTV] Rockthevote was successfully started."); }
public Action:Timer_ChangeMap(Handle:hTimer, Handle:dp) { new String:map[65]; ResetPack(dp); ReadPackString(dp, map, sizeof(map)); ServerCommand("changelevel \"%s\"", map); return Plugin_Stop; }
|
|
| |
_wS_
|
Дата: Воскресенье, 26.02.2012, 11:33:28 | Сообщение # 2 |
|
Если переписываешь, то делай это с самого начала, а ты используешь чужой код и поэтому не понимаешь. Должно быть несколько глобальных переменных, чтобы можно было:
Quote - запоминать, голосовал игрок или нет - сколько всего было голосов - сколько нужно голосов для запуска голосования - др.
Чтобы в меню были только нужные карты, делай проверки перед AddMenuItem. Вникать в чужой код гораздо тяжелее, чем самому сделать свой скрипт.
|
|
| |
Naykon
|
Дата: Среда, 29.02.2012, 11:13:24 | Сообщение # 3 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Понял спс учту =)Добавлено (29.02.2012, 11:13:24) --------------------------------------------- А как сказать "если до конца раунда осталось X секунд то { }"
|
|
| |
_wS_
|
Дата: Среда, 29.02.2012, 11:37:39 | Сообщение # 4 |
|
У тебя нет никаких идей?
Code #pragma semicolon 1 #include <sourcemod>
new MaxSec;
public OnPluginStart() { HookEvent("round_start", round_start); }
public round_start(Handle:event, const String:name[], bool:dontBroadcast) { MaxSec = GetEventInt(event, "timelimit") + GetTime(); }
GetSecondsLeft() { return MaxSec - GetTime(); }
Если GetSecondsLeft() вернет значение меньше 1, то раунд окончен. GetTime() - число, растущее с каждой секундой.
|
|
| |
Naykon
|
Дата: Четверг, 01.03.2012, 10:08:05 | Сообщение # 5 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Code public Action:Timer_ChangeMap(Handle:hTimer, Handle:dp) { if new String:map[65]; ResetPack(dp); ReadPackString(dp, map, sizeof(map)); ServerCommand("changelevel \"%s\"", map); return Plugin_Stop; }
Как можно приметить код сюда?? Это RTV плагин. нужно чтоб changelevel запускалась в конце раунда ( полсе голосования )Добавлено (29.02.2012, 21:54:26) --------------------------------------------- А есть попроще способ совершить действие в конце раунда?? Добавлено (01.03.2012, 10:08:05) ---------------------------------------------
Code GetMenuItem(menu, param1, map, sizeof(map)); if (param1 == GetConVarInt(g_Cvar_Maps)) { decl Handle:h; if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(h, param1); BfWriteByte(h, true); decl String:xStR[128]; Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Текущая карта продлена!"); BfWriteString(h, xStR); EndMessage(); } LogMessage("[RTV] Rockthevote has ended, current map kept."); } else { decl Handle:h; if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(h, param1); BfWriteByte(h, true); decl String:xStR[128]; Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Карта измениться на %s", map); BfWriteString(h, xStR); EndMessage(); }
LogMessage("[RTV] Rockthevote has ended, changing to map %s.", map); WritePackString(dp, map); go = 1; //Если сюда вставить ServerCommand("changelevel \"%s\"", map); то уарта сметиться стразу после голосования } g_RTVEnded = true; } }
public round_start(Handle:event, const String:name[], bool:dontBroadcast) {
if (go = 1) { new String:map[65]; ResetPack(dp); ReadPackString(dp, map, sizeof(map)); ServerCommand("changelevel \"%s\"", map); return Plugin_Stop; } }
В коде отметил где раньше было ServerCommand("changelevel \"%s\"", map); и карта менялась сразу.. я решил дать глобальную переменную go = 0; и поставить на место где было ServerCommand... Дальше из кода все понятно.. Но карта не меняется в начале раунда.. почему?
|
|
| |
_wS_
|
Дата: Четверг, 01.03.2012, 14:06:11 | Сообщение # 6 |
|
Зачем в round_start делать return Plugin_Stop;? Ошибка в if (go = 1). = это присвоение, == это сравнение.
И после этого:
Quote ResetPack(dp); ReadPackString(dp, map, sizeof(map));
Надо убить пак:
|
|
| |
Naykon
|
Дата: Четверг, 01.03.2012, 17:37:22 | Сообщение # 7 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Code GetMenuItem(menu, param1, map, sizeof(map)); if (param1 == GetConVarInt(g_Cvar_Maps)) { decl Handle:h; if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(h, param1); BfWriteByte(h, true); decl String:xStR[128]; Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Текущая карта продлена!"); BfWriteString(h, xStR); EndMessage(); } LogMessage("[RTV] Rockthevote has ended, current map kept."); } else { decl Handle:h; if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(h, param1); BfWriteByte(h, true); decl String:xStR[128]; Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Карта измениться на %s", map); BfWriteString(h, xStR); EndMessage(); }
LogMessage("[RTV] Rockthevote has ended, changing to map %s.", map); go = 1; } g_RTVEnded = true; } }
public round_start(Handle:event, const String:name[], bool:dontBroadcast) { new String:map[65]; if (go == 1) { ServerCommand("changelevel \"%s\"", map); } }
Сделал так убрал dp и тп... эффект тот же ((
|
|
| |
_wS_
|
Дата: Четверг, 01.03.2012, 17:52:11 | Сообщение # 8 |
|
Хм.. Ты создал пустую строку в переменной 'map' и делаешь changelevel map, хотя где имя самой карты?
|
|
| |
Naykon
|
Дата: Пятница, 02.03.2012, 11:42:52 | Сообщение # 9 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
А для чего обычно нужно вот это?? Какую ф-ю выполянет?? ResetPack(dp); ReadPackString(dp, map, sizeof(map));Добавлено (02.03.2012, 11:42:52) --------------------------------------------- Почти удалось изменить карту в начале следующего раунда вот так... Code new String:map[64];
public Round_Start(Handle:event, const String:name[], bool:dontBroadcast) { ServerCommand("changelevel \"%s\"", map); } public Handler_MapVoteMenu(Handle:menu, MenuAction:action, param1, param2) { if (action == MenuAction_End) { CloseHandle(menu); menu = INVALID_HANDLE; } else if (action == MenuAction_Select) { new String:voter[64], String:choice[64]; GetClientName(param1, voter, sizeof(voter)); GetMenuItem(menu, param2, choice, sizeof(choice)); decl Handle:h; if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(h, param2); BfWriteByte(h, true); decl String:xStR[128]; Format(xStR, sizeof(xStR), "\x04[Карта]\x03 %s \x05проголосовал за \x03%s ", voter, choice); BfWriteString(h, xStR); EndMessage(); } PrintToChatAll("[RTV] %t", "Selected Map", voter, choice); } else if (action == MenuAction_VoteEnd) { new votes, totalVotes; GetMenuVoteInfo(param2, votes, totalVotes); if (totalVotes < 1) { decl Handle:h; if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(h, param2); BfWriteByte(h, true); decl String:xStR[128]; Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Никто не проголосовал"); BfWriteString(h, xStR); EndMessage(); } return; } GetMenuItem(menu, param1, map, sizeof(map)); if (param1 == GetConVarInt(g_Cvar_Maps)) { decl Handle:h; if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(h, param1); BfWriteByte(h, true); decl String:xStR[128]; Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Текущая карта продлена!"); BfWriteString(h, xStR); EndMessage(); } LogMessage("[RTV] Rockthevote has ended, current map kept."); } else { decl Handle:h; if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(h, param1); BfWriteByte(h, true); decl String:xStR[128]; Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Карта измениться на %s", map); BfWriteString(h, xStR); EndMessage(); }
LogMessage("[RTV] Rockthevote has ended, changing to map %s.", map); //ServerCommand("changelevel \"%s\"", map); new Handle:dp; //CreateDataTimer(5.0, Timer_ChangeMap, dp); WritePackString(dp, map); ResetPack(dp); ReadPackString(dp, map, sizeof(map)); CloseHandle(dp); } g_RTVEnded = true; } }
Но следующая карта грузится до 3 палок а на серверер циркулирет ошибка такого рода...
Code ---- Host_Changelevel ---- L 03/02/2012 - 10:29:24: -------- Mapchange to de_prodigy -------- Attempted to create unknown entity type info_ladder! Can't init info_ladder Attempted to create unknown entity type info_ladder! Can't init info_ladder Attempted to create unknown entity type info_ladder! Can't init info_ladder Attempted to create unknown entity type info_ladder! Can't init info_ladder Attempted to create unknown entity type info_ladder! Can't init info_ladder Attempted to create unknown entity type info_ladder! Can't init info_ladder L 03/02/2012 - 10:29:25: [rockthevote.smx] [RTV] Map Cycle Path: mapcycle.txt Unknown command "sm_jt" Unknown command "sm_jt_ratio" Unknown command "sm_jt_version" ---- Host_Changelevel ---- L 03/02/2012 - 10:29:26: -------- Mapchange to de_prodigy -------- Attempted to create unknown entity type info_ladder! Can't init info_ladder Attempted to create unknown entity type info_ladder! Can't init info_ladder Attempted to create unknown entity type info_ladder! Can't init info_ladder Attempted to create unknown entity type info_ladder! Can't init info_ladder Attempted to create unknown entity type info_ladder! Can't init info_ladder Attempted to create unknown entity type info_ladder! Can't init info_ladder L 03/02/2012 - 10:29:27: [rockthevote.smx] [RTV] Map Cycle Path: mapcycle.txt Unknown command "sm_jt" Unknown command "sm_jt_ratio" Unknown command "sm_jt_version" ---- Host_Changelevel ----
|
|
| |
_wS_
|
Дата: Пятница, 02.03.2012, 12:10:58 | Сообщение # 10 |
|
Quote (Naykon) А для чего обычно нужно вот это?? Какую ф-ю выполянет?? ResetPack(dp); ReadPackString(dp, map, sizeof(map)); Сколько еще раз мне давать ссылку на API?
В этом вообще смысла нет:
Quote new Handle:dp; WritePackString(dp, map); ResetPack(dp); ReadPackString(dp, map, sizeof(map)); CloseHandle(dp);
Ты сам пак не создал (CreateDataPack) и уже что-то в него записываешь. Да и зачем он вообще здесь нужен, если ты его сразу же извлекаешь и уничтожаешь? Тебе же уже известна переменная map, а ты создаешь пак, записываешь туда ее и сразу же извлекаешь, смысла ноль.
И ты после старта раунда делаешь changelevel. Чтобы это делать, надо быть уверенным, что в переменной map записана хоть какая-то карта, может там пустая строка или хз что. На счет ошибки info_ladder в консоле, она у всех, не обращай внимания. Обращать внимание надо на подобное:
Quote L 03/02/2012 - 10:29:27: [rockthevote.smx] [RTV] Map Cycle Path: mapcycle.txt
Где видно название плагина и ошибку в нем, да и часто показывает, на какой именно строке. И ты часто используешь StartMessageAll("SayText2"), было бы разумнее создать отдельную функцию для этого, чтобы не повторять 500 раз один и тот же код.
Code TeamColorMsg(client_author, const String:MsG[]) { decl Handle:h; if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(h, client_author); BfWriteByte(h, true); BfWriteString(h, MsG); EndMessage(); } else PrintToChatAll(MsG); }
|
|
| |
Naykon
|
Дата: Пятница, 02.03.2012, 12:29:34 | Сообщение # 11 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Code L 03/02/2012 - 10:29:24: -------- Mapchange to de_prodigy -------- Из этого видно что map видит de_prodigy за ее я голосовал в ртв Т.Е я был на д2 и голосовал за продиджи ... карта начала менять но позже стала циркулировать постоянно ошибка в консоле сервкра.. и карта не менялась (3 палки и зависло)Добавлено (02.03.2012, 12:29:34) --------------------------------------------- На счет АПИ Code Вызывается на клиентских соединений. Если вы вернетесь правда, клиенту будет разрешено на сервере. Если вы вернетесь ложное (или возвращение ничего), то клиент будет отклонена. Если клиент отвергает это вперед или любой другой, OnClientDisconnect не будет вызван. Примечание: Не пишите на rejectmsg, если вы планируете возвращаться правда. Если несколько плагинов запись в строке буфера, оно не определено, какая строка плагина будет показано клиенту, но это гарантирует, один из них.
Это перевод google для начинающий врядли он понятен))))
|
|
| |
_wS_
|
Дата: Пятница, 02.03.2012, 12:37:56 | Сообщение # 12 |
|
Хм, он всегда так переводит. Ты же видишь ключевые слова, и правильно сложить мысль не так и тяжело.
|
|
| |
Naykon
|
Дата: Пятница, 02.03.2012, 13:14:57 | Сообщение # 13 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Code public round_start(Handle:event, const String:name[], bool:dontBroadcast) { if (go == 1) { decl clients; decl Handle:h; if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(h, clients); BfWriteByte(h, true); decl String:xStR[128]; Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Карта измениться на %s сейчас", map); BfWriteString(h, xStR); EndMessage(); }
LogMessage("[RTV] Rockthevote has ended, changing to map %s.", map); new Handle:dp; CreateDataTimer(5.0, Timer_ChangeMap, dp); WritePackString(dp, map); } } public Action:Timer_ChangeMap(Handle:hTimer, Handle:dp) { new String:map[65]; ResetPack(dp); ReadPackString(dp, map, sizeof(map)); ServerCommand("changelevel \"%s\"", map); return Plugin_Stop; }
public Handler_MapVoteMenu(Handle:menu, MenuAction:action, param1, param2) { if (action == MenuAction_End) { CloseHandle(menu); menu = INVALID_HANDLE; } else if (action == MenuAction_Select) { new String:voter[64], String:choice[64]; GetClientName(param1, voter, sizeof(voter)); GetMenuItem(menu, param2, choice, sizeof(choice)); decl Handle:h; if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(h, param2); BfWriteByte(h, true); decl String:xStR[128]; Format(xStR, sizeof(xStR), "\x04[Карта]\x03 %s \x05проголосовал за \x03%s ", voter, choice); BfWriteString(h, xStR); EndMessage(); } PrintToChatAll("[RTV] %t", "Selected Map", voter, choice); } else if (action == MenuAction_VoteEnd) { new votes, totalVotes; GetMenuVoteInfo(param2, votes, totalVotes); if (totalVotes < 1) { decl Handle:h; if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(h, param2); BfWriteByte(h, true); decl String:xStR[128]; Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Никто не проголосовал"); BfWriteString(h, xStR); EndMessage(); } return; } GetMenuItem(menu, param1, map, sizeof(map)); if (param1 == GetConVarInt(g_Cvar_Maps)) { decl Handle:h; if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(h, param1); BfWriteByte(h, true); decl String:xStR[128]; Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Текущая карта продлена!"); BfWriteString(h, xStR); EndMessage(); } LogMessage("[RTV] Rockthevote has ended, current map kept."); } else go = 1; { decl Handle:h; if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(h, param1); BfWriteByte(h, true); decl String:xStR[128]; Format(xStR, sizeof(xStR), "\x01\x04[Карта]\x05 Карта измениться на\x03 %s \x05в начале раунда", map); BfWriteString(h, xStR); EndMessage(); } } g_RTVEnded = true; } }
Кое что получилось..... После голсования карта меняется как начинается новый раунд, но после смены карта сразу же меняется ... Т.е карта тупо меняется как только подключается первый пользователь как можно заблокировать смену карты?? В общем нужно чтоб плагин выключался после меня карты а не бакапорил и менял карту сразу же неуспев подключиться)))
|
|
| |
_wS_
|
Дата: Пятница, 02.03.2012, 15:47:35 | Сообщение # 14 |
|
Потому что происходит round_start и переменная go по прежнему равна 1..
|
|
| |
Naykon
|
Дата: Пятница, 02.03.2012, 16:32:05 | Сообщение # 15 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Точняк... добавил в раундстарт go = 0 и все ок.Добавлено (02.03.2012, 16:32:05) --------------------------------------------- А вот еще проблемка как можно записать если до окончания карты осталось 2 минуты то запустим голосование rtv.....?????
|
|
| |
|