Голосование за игрока
| |
Naykon
|
Дата: Понедельник, 02.04.2012, 19:19:28 | Сообщение # 1 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Code // Находим игрока, за которого больше всего проголосовали new vots = 0, target_index = 0; for (new i = 1; i <= MaxClients; i++) { if (votes[i] > vots) { vots = votes[i]; target_index = i; } } if (target_index > 0 && IsClientInGame(target_index)) { лялялялля }
Вот часть кода отвечающая за игрока за которого больше всего проголосовали.... но она определяется неправильно. 5 игроков из 9 Голосующих проголосовали за X игрока но все равно был выбран Y игрок... Но когда 1 голос из 1 голосующего голосует за X то выбирается правильно. Сделал вывод что игрок определяется правильно только при 100% голосов (но не всегда) ППЦ какойто (((
|
|
| |
Scarface_slv
|
Дата: Понедельник, 02.04.2012, 21:57:19 | Сообщение # 2 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
тут же есть урок создание голосования за кик игрока в начале раундаДобавлено (02.04.2012, 21:57:19) --------------------------------------------- а понял) ты отуда и скопировал этот код=)
|
|
| |
_wS_
|
Дата: Вторник, 03.04.2012, 00:36:58 | Сообщение # 3 |
|
Naykon, да, это часть кода и ошибок в нем нет. Ты наверно перед запуском голосования не очистил votes для каждого игрока и в нем по прежнему остались прошлые голоса - надо сбросить на 0.
Code for (new i = 1; i <= MaxClients; i++) votes[i] = 0; // и только после этого запускать голосование
И если игрок вышел с сервера или вошел, то опять надо сбросить на 0 голоса за него. Хотя не всегда, смотря как ты делаешь, я не знаю, просто говорю что все это надо учитывать.
|
|
| |
Naykon
|
Дата: Вторник, 03.04.2012, 09:31:49 | Сообщение # 4 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Code SetMenuExitButton(h_Menu, false); decl String:StR_Id[15], String:StR_Name[MAX_NAME_LENGTH]; new players = 0; for (new i = 1; i <= MaxClients; i++) { votes[i] = 0; if (IsClientInGame(i) && GetClientTeam(i) == 3 && IsPlayerAlive(i)) { IntToString(GetClientUserId(i), StR_Id, sizeof(StR_Id)); GetClientName(i,StR_Name, sizeof(StR_Name)); AddMenuItem(h_Menu, StR_Id, StR_Name);
players += 1; } }
До добавления игрока в меню голоса за него сбрасывались... дело очевидно не в этом((((
|
|
| |
_wS_
|
Дата: Вторник, 03.04.2012, 10:10:12 | Сообщение # 5 |
|
Ну тот же скрипт, который я дал в уроке для примера, работает? Значит ты где-то промазал, и в этом коде, что ты дал сейчас, тоже нет ошибок. Когда игрок голосует, проверяй в той ли он команде, в которой был, когда ты ему меню отправлял. Может раунд новый начался, может он перешел - надо все мелочи учитывать.
|
|
| |
Naykon
|
Дата: Вторник, 03.04.2012, 16:44:23 | Сообщение # 6 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Code new vots = 0, target_index = 0; for (new i = 1; i <= MaxClients; i++) { if (votes[i] > vots) { vots = votes[i]; target_index = i; } } Если я не ошибаюсь то вот это - vots = votes[i]; и так приравнивает победителя (votes[i]) к 0 сразу после завершения голосования А уже target_index - передает что делать с победителем...
Выяснил точную суть ошибки. Если в 1 раунде был выбран игрок X то и в следующих этот игрок будет тоже выбраны независимо от результата (коррупция епт) а вот когда никто не голосует за игроков вообще тогда запускается Рандом: Code GetRandomClient() { new indexes[MaxClients+1], players = 0; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && GetClientTeam(i) == 3 && IsPlayerAlive(i)) { indexes[players++] = i; } } if (players > 0) return indexes[GetRandomInt(0, players-1)]; return 0; }
Лишь после рандома следующее голосование будет правильном((Добавлено (03.04.2012, 16:44:23) --------------------------------------------- Не могу разобраться укажи носом а ошибку пи*ц какой-то
Code #include <sourcemod> #include <cstrike> #include <sdktools> #include <sdktools_entoutput> #include <sdktools_functions>
new Handle:h_Menu, Handle:h_Timer, votes[MAXPLAYERS+1], timer_sec, all_votes; new ct_client; new ct; new Handle:pMenu;
public OnPluginStart() { HookEvent("round_start", Round_Start, EventHookMode_PostNoCopy); HookEvent("player_death", playerDeath); }
public Round_Start(Handle:event, const String:name[], bool:dontBroadcast) { if (h_Timer != INVALID_HANDLE) { KillTimer(h_Timer); h_Timer = INVALID_HANDLE; } if (h_Menu != INVALID_HANDLE) CloseHandle(h_Menu); h_Menu = CreateMenu(Select_Func); SetMenuTitle(h_Menu, "Выберите ...\n \n"); AddMenuItem(h_Menu, "", "Лучше подумай дважды!", ITEMDRAW_DISABLED); AddMenuItem(h_Menu, "", "Прежде !\n \n", ITEMDRAW_DISABLED); SetMenuExitButton(h_Menu, false); decl String:StR_Id[15], String:StR_Name[MAX_NAME_LENGTH]; new players = 0; for (new i = 1; i <= MaxClients; i++) { votes[i] = 0; if (IsClientInGame(i) && GetClientTeam(i) == 3 && IsPlayerAlive(i)) { IntToString(GetClientUserId(i), StR_Id, sizeof(StR_Id)); GetClientName(i,StR_Name, sizeof(StR_Name)); AddMenuItem(h_Menu, StR_Id, StR_Name);
players += 1; } } if (players > 0) { for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && GetClientTeam(i) == 2) DisplayMenu(h_Menu, i, 15); } all_votes = 0; // сколько всего было голосов timer_sec = 15; // время голосования в сек. h_Timer = CreateTimer(1.0, Timer_Func, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); } else { CloseHandle(h_Menu); h_Menu = INVALID_HANDLE; } }
public Select_Func(Handle:menu, MenuAction:action, i, option) { new client; if (action == MenuAction_Select) { decl String:StR_Id[15]; GetMenuItem(menu, option, StR_Id, sizeof(StR_Id)); new target_index = GetClientOfUserId(StringToInt(StR_Id)); if (target_index > 0) { decl Handle:h; if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(h, target_index); BfWriteByte(h, true); decl String:xStR[75]; Format(xStR, sizeof(xStR), "Игрок \x03%N", i, target_index); BfWriteString(h, xStR); EndMessage(); } } else PrintToChat(i, "Игрок не найден"); } }
public Action:Timer_Func(Handle:timer, any:x) { timer_sec -= 1; if (timer_sec > 0) { PrintHintTextToAll("Через:\n< %d сек >", timer_sec); return Plugin_Continue; } // Время истекло, голосование окончено h_Timer = INVALID_HANDLE; if (h_Menu != INVALID_HANDLE) { CloseHandle(h_Menu); h_Menu = INVALID_HANDLE; } PrintHintTextToAll("Голосование завершено (%d голосов)", all_votes); if (all_votes < 1) { new random_client = GetRandomClient(); if (random_client > 0) { decl Handle:j; if ((j = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(j, random_client); BfWriteByte(j, true); decl String:xStR[75]; Format(xStR, sizeof(xStR), "Игрок\x03 %N", random_client); BfWriteString(j, xStR); EndMessage(); } ct_client = random_client ИзменилЦвет(random_client, "255.252.52.52"); Com_Menu(ct_client) } return Plugin_Stop; } // Находим игрока, за которого больше всего проголосовали new vots = 0, target_index = 0; for (new i = 1; i <= MaxClients; i++) { if (votes[i] > vots) { votes[i] = 0; target_index = i; } } if (target_index > 0 && IsClientInGame(target_index)) { ct_client = target_index; decl Handle:k; if ((k = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(k, ct_client); BfWriteByte(k, true); decl String:xStR[75]; Format(xStR, sizeof(xStR), "Игрок\x03 %N", ct_client); BfWriteString(k, xStR); EndMessage(); } ИзменилЦвет(ct_client, "255.252.52.52"); Com_Menu(ct_client) } else { ct_client = GetRandomClient(); if (ct_client > 0) { target_index = ct_client decl Handle:n; if ((n = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(n, ct_client); BfWriteByte(n, true); decl String:xStR[75]; Format(xStR, sizeof(xStR), "\x03 %N \x04", ct_client); BfWriteString(n, xStR); EndMessage(); } ИзменилЦвет(ct_client, "255.252.52.52"); Com_Menu(ct_client) } } return Plugin_Stop; }
wS_GetLookPos(ct_client, Float:wS_Pos[3]) { decl Float:EyePosition[3], Float:EyeAngles[3], Handle:h_trace; GetClientEyePosition(ct_client, EyePosition); GetClientEyeAngles(ct_client, EyeAngles); h_trace = TR_TraceRayFilterEx(EyePosition, EyeAngles, MASK_SOLID, RayType_Infinite, wS_GetLookPos_Filter, ct_client); TR_GetEndPosition(wS_Pos, h_trace); CloseHandle(h_trace); }
public bool:wS_GetLookPos_Filter(ent, mask, any:i) { return i != ent; }
public Action:playerDeath(Handle:event, const String:name[], bool:dontBroadcast) { if (pMenu != INVALID_HANDLE) CloseHandle(pMenu); new userid = GetEventInt(event, "userid"); new client = GetClientOfUserId(userid); if(client == ct_client) { decl Handle:l; if ((l = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(l, ct_client); BfWriteByte(l, true); decl String:xStR[75]; Format(xStR, sizeof(xStR), "\x04***\x03X убит!\x04***"); BfWriteString(l, xStR); EndMessage(); } ct_client = GetRandomClient(); if (ct_client > 0) { client = ct_client decl Handle:n; if ((n = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(n, ct_client); BfWriteByte(n, true); decl String:xStR[75]; Format(xStR, sizeof(xStR), "Игрок\x03 %N ***", ct_client); BfWriteString(n, xStR); EndMessage(); } ИзменилЦвет(ct_client, "255.252.52.52"); Com_Menu(ct_client) } return Plugin_Stop; } }
public OnClientDisconnect(client) { for (new i = 1; i <= MaxClients; i++) votes[i] = 0; if (client == ct_client) { decl Handle:l; if ((l = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(l, ct_client); BfWriteByte(l, true); decl String:xStR[75]; Format(xStR, sizeof(xStR), "\x04отключился!"); BfWriteString(l, xStR); EndMessage(); } ct_client = GetRandomClient(); if (ct_client > 0) { client = ct_client decl Handle:n; if ((n = StartMessageAll("SayText2")) != INVALID_HANDLE) { BfWriteByte(n, ct_client); BfWriteByte(n, true); decl String:xStR[75]; Format(xStR, sizeof(xStR), "\x03Игрок\x03 %N", ct_client); BfWriteString(n, xStR); EndMessage(); } ИзменилЦвет(ct_client, "255.252.52.52"); Com_Menu(ct_client) } return Plugin_Stop; }
} GetRandomClient() { new indexes[MaxClients+1], players = 0; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && GetClientTeam(i) == 3 && IsPlayerAlive(i)) { indexes[players++] = i; } } if (players > 0) return indexes[GetRandomInt(0, players-1)]; return 0; }
|
|
| |
_wS_
|
Дата: Вторник, 03.04.2012, 18:16:09 | Сообщение # 7 |
|
1. На all_votes посмотри.. 2. Зачем в 'public Select_Func' new client; ? 3. Ты очищаешь ВСЕ голоса, если выходит 1 игрок.. Не знаешь как цикл for работает? 4. Это что? ИзменилЦвет(ct_client, "255.252.52.52"); 5. Переменные pMenu и ct вообще лишние 6. Сто раз 1 и тот же код повторяешь, урок про функции не читал или не понял
В следующий раз, если кода много, прикрепляй .sp файл, ибо неприятно исправлять неправильные отступы.
|
|
| |
Naykon
|
Дата: Вторник, 03.04.2012, 22:52:23 | Сообщение # 8 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Честно я собирал этот плагин опираясь на голосование за Кик поэтому это и происходит.. но я не представляю как можно это исправить т.е половину этого кода не понимаю... т.к 50% написал не я, обьясните мне: 1) Как раюотате цыкл for обясните на мини примере что вы имеете введу .. Code for (new i = 1; i <= MaxClients; i++) { votes[i] = 0; if (IsClientInGame(i) && GetClientTeam(i) == 3 && IsPlayerAlive(i)) { IntToString(GetClientUserId(i), StR_Id, sizeof(StR_Id)); GetClientName(i,StR_Name, sizeof(StR_Name)); AddMenuItem(h_Menu, StR_Id, StR_Name);
players += 1; } }
Я читаю это строка как: для (перемнная i; i <= количеству килентов; i=i+1 (т.е 2)); Если (Игрок в игре, он же игрет за СТ и он жив)......
В обще for (new i = 1; i <= MaxClients; i++) - для 1 любого игрока как я понимаю... 2) Функции на примерах из Википедии кое-что понял и может не совершено.. если в ваших силах то обьясните.
Лишние переменные не мешают они нужны были мне для еще одно дополнения - но я его вырезал чтоб не обнародовать плагин, с ИзменилЦвет - это роли на проблему не играет.... просто не стал копаться и искать в других скриптах как правильно написать функцию
3) Как заставить его работать нормально???Добавлено (03.04.2012, 22:52:23) --------------------------------------------- Обратите внимание на этот пост - http://world-source.ru/forum/102-2422-1
|
|
| |
_wS_
|
Дата: Среда, 04.04.2012, 04:59:38 | Сообщение # 9 |
|
Quote (Naykon) http://world-source.ru/forum/102-2422-1 Не буду обращать, надоело на твои глупые вопросы отвечать, ты не стараешься. Неужели тяжело в API посмотреть синтаксис команды и все остальное на счет нее? ... !
Code BanClient(client, time, flags, const String:reason[], const String:kick_message[]=""); Ты не указал кик-сообщение.. Ты указал причину (не помню для чего она). На счет цикла for. Запусти этот глупый скрипт и поймешь как оно работает.. :
Code for (new i = 1; i < 6; i++) PrintToServer("-> %d", i);
Я говорил уже, да и самому додуматься несложно (но ты видимо не можешь, я не представляю почему и как это возможно). Если не знаешь ты или не понимаешь какой-то кусок кода, вставь в то место PrintToServer чтобы увидеть чему равны непонятные тебе переменные и тд. У меня уже нет терпения на такие разговоры.
|
|
| |
Naykon
|
Дата: Суббота, 15.09.2012, 02:44:35 | Сообщение # 10 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Code new vots = 0; new Lider = 0; if (Player > 0) { VoterAll += 1; Voter[Player] += 1; for (new i = 1; i <= MaxClients; i++) { if (Voter[i] > vots) { vots = Voter[i]; Lider = i; } } decl String:format[300]; Format(format, sizeof(format), "%N", Lider); PrintHintTextToAll("Статистика: %s", format); }
Запись такого рода показывает лидера голосования, подскажите как написать в окне PrintHintTextToAll всех за кого голосуют и сколько голосов отданы за каждого номинанта. (В сообщении игроки меняются местами, тот за кого больше проголосовали тот вверху..) Ранее не сталкивался, поэтому прошу помочь. Зарание благодарю.
|
|
| |
Scarface_slv
|
Дата: Суббота, 15.09.2012, 12:17:03 | Сообщение # 11 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
в сам цикл засунуть не пробовал?
|
|
| |
Naykon
|
Дата: Суббота, 15.09.2012, 12:34:21 | Сообщение # 12 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
пробывал тоже самое.. я не пойму как составить строку чтоб писало внизу: 1.NAME (голоса) 2.NAME2 (голоса) 3.NAME3 (голоса) ...
(((( и если честно я с трудом понимаю эту запись: Code new vots = 0; for (new i = 1; i <= MaxClients; i++) { if (Voter[i] > vots) { vots = Voter[i]; Lider = i; } } этой частью кода пользовался с урока.
|
|
| |
|