Меню выбора игроков
| |
_wS_
|
Дата: Воскресенье, 19.02.2012, 22:19:06 | Сообщение # 16 |
|
Вот и ошибка:
Code new players = 0; for (new i = 1; i <= MaxClients; i++) { votes[i] = 0; if (i == players && IsClientInGame(i) && !IsFakeClient(i)) { //..
Переменная players = 0 и условие if (i == players) не проходит проверку конечно же.
|
|
| |
Naykon
|
Дата: Вторник, 21.02.2012, 14:55:47 | Сообщение # 17 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Блин вот что значит не внимательно........ спс
Пишет при нажатии 1 или 2 "Игрок не найден" нужно сделать чтоб просто ничего не происходило. И меню не пропадало... + пункт 1 и 2 сделать белого цвета на не желтого. + меню сильно быстро пропадает как исправить.. а и вот еще как тогда сделать чтоб игрока выбирало РАНДОМОМ (АВТОМАТИЧЕСКИ) ЕСЛИ НИКТО НЕ ПРОГОЛОСОВАЛ Code #include <sourcemod>
new Handle:h_Menu, Handle:h_Timer, kick_vots[MAXPLAYERS+1], timer_sec, all_votes;
public OnPluginStart() { HookEvent("round_start", Round_Start, EventHookMode_PostNoCopy); }
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, "1", "Подумай! Не клацай напрасно!", ITEMDRAW_DEFAULT); AddMenuItem(h_Menu, "2", "********************", ITEMDRAW_DEFAULT); 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++) { kick_vots[i] = 0; // очищаем кол-во голосов за кик игрока (i = его индекс) if (IsClientInGame(i) && GetClientTeam(i) == 3 && IsPlayerAlive(i)) { // получаем userid игрока и делаем его строкой, чтобы добавить в меню IntToString(GetClientUserId(i), StR_Id, sizeof(StR_Id)); GetClientName(i, StR_Name, sizeof(StR_Name)); AddMenuItem(h_Menu, StR_Id, StR_Name); players += 1; } } // если игроков на сервере > 0 if (players > 0) { // показываем игрокам созданное меню и запускаем таймер for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && GetClientTeam(i) == 2) DisplayMenu(h_Menu, i, 10); } 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) { 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) { all_votes += 1; kick_vots[target_index] += 1; PrintToChatAll("%N выбрал игрока %N", i, target_index); } 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) { return Plugin_Stop; } // Находим игрока, за которого больше всего проголосовали new vots = 0, target_index = 0; for (new i = 1; i <= MaxClients; i++) { if (kick_vots[i] > vots) { vots = kick_vots[i]; target_index = i; } } if (target_index > 0 && IsClientInGame(target_index)) { PrintToChatAll("Игрок %N кикнут", target_index); KickClient(target_index, "бб"); } else PrintToChatAll("Игрок не найден"); return Plugin_Stop; } Добавлено (21.02.2012, 14:55:47) ---------------------------------------------
Code HookEvent("player_death", playerDeath, EventHookMode_PostNoCopy);
Code public Select_Func(Handle:menu, MenuAction:action, i, option) { 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) { all_votes += 1; votes[target_index] += 1; PrintToChatAll("%N проголосовал за %N", i, target_index); } else PrintToChat(i, "Игрок не найден"); } }
public Action:playerDeath(Handle:event, const String:name[], bool:dontBroadcast) { new client = GetClientOfUserId(GetEventInt(event, "userid")); if (client == target_index) { PrintToChatAll("Fuck", client); }
}
public Action:playerDeath не видит что такое target_index хотя эта перменная задана выше... new target_index = GetClientOfUserId(StringToInt(StR_Id));
Однако Code 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) { return Plugin_Stop; } // Находим игрока, за которого больше всего проголосовали 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)) { PrintToChatAll("Игрок %N стал командиром!", target_index); SetEntityRenderColor(target_index, 0, 0, 255, 130); } else PrintToChatAll("Игрок не найден"); return Plugin_Stop; } Прекрастно видит что target_index это сущ. переменная.. В чем проблема?
Сообщение отредактировал Naykon - Вторник, 21.02.2012, 14:15:44 |
|
| |
_wS_
|
Дата: Вторник, 21.02.2012, 17:15:44 | Сообщение # 18 |
|
Quote (Naykon) Пишет при нажатии 1 или 2 "Игрок не найден" нужно сделать чтоб просто ничего не происходило. И меню не пропадало... + пункт 1 и 2 сделать белого цвета на не желтого Мы же сколько раз уже обсуждали ITEMDRAW_DISABLED и ты до сих пор это не понял.
Code // Вместо этого AddMenuItem(h_Menu, "1", "Подумай! Не клацай напрасно!", ITEMDRAW_DEFAULT);
// Надо это AddMenuItem(h_Menu, "", "Подумай! Не клацай напрасно!", ITEMDRAW_DISABLED);
Quote (Naykon) + меню сильно быстро пропадает как исправить.. DisplayMenu(h_Menu, i, 10); - 10 это количество секунд отображения меню, если 0, то всегда.
Quote (Naykon) а и вот еще как тогда сделать чтоб игрока выбирало РАНДОМОМ (АВТОМАТИЧЕСКИ) ЕСЛИ НИКТО НЕ ПРОГОЛОСОВАЛ Ответил в ЭТОЙ теме.
Quote (Naykon) public Action:playerDeath не видит что такое target_index хотя эта перменная задана выше... new target_index = GetClientOfUserId(StringToInt(StR_Id)); target_index - это локальная временная переменная, которая уничтожится после выполнения функции, в которой она используется. И она не может быть доступна/видима в других функциях. Только глобальные переменные можно так использовать.
Да и как ты собираешься получить какую-то переменную из события player_death, если ты сделал EventHookMode_PostNoCopy? Невнимательно читаешь уроки. Используй команды по порядку, пойми как они работают, а уже потом используй их вместе.
|
|
| |
Naykon
|
Дата: Вторник, 21.02.2012, 19:24:06 | Сообщение # 19 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Code #include <sourcemod>
new Handle:h_Menu, Handle:h_Timer, kick_vots[MAXPLAYERS+1], timer_sec, all_votes;
public OnPluginStart() { HookEvent("round_start", Round_Start, EventHookMode_PostNoCopy); }
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"); 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++) { kick_vots[i] = 0; // очищаем кол-во голосов за кик игрока (i = его индекс) if (IsClientInGame(i)) { // получаем userid игрока и делаем его строкой, чтобы добавить в меню IntToString(GetClientUserId(i), StR_Id, sizeof(StR_Id)); GetClientName(i, StR_Name, sizeof(StR_Name)); AddMenuItem(h_Menu, StR_Id, StR_Name); players += 1; } } // если игроков на сервере > 0 if (players > 0) { // показываем игрокам созданное меню и запускаем таймер for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i)) DisplayMenu(h_Menu, i, 10); } 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) { 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) { all_votes += 1; kick_vots[target_index] += 1; PrintToChatAll("%N выбрал игрока %N", i, target_index); } 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) { return Plugin_Stop; } // Находим игрока, за которого больше всего проголосовали new vots = 0, target_index = 0; for (new i = 1; i <= MaxClients; i++) { if (kick_vots[i] > vots) { vots = kick_vots[i]; target_index = i; } } if (target_index > 0 && IsClientInGame(target_index)) { PrintToChatAll("Игрок %N кикнут", target_index); KickClient(target_index, "бб"); } else PrintToChatAll("Игрок не найден"); return Plugin_Stop; }
Вот пример из урока покажите наглядно как в нем использовать РАНДОМ в случае 0 голосов
|
|
| |
_wS_
|
Дата: Среда, 22.02.2012, 05:45:38 | Сообщение # 20 |
|
В блоке public Action:Timer_Func(Handle:timer, any:x), в условии if (all_votes < 1)
Code if (all_votes < 1) { new random_client = GetRandomClient(); if (random_client > 0) { // случайный игрок выбран, что-то делаем } return Plugin_Stop; }
GetRandomClient() { new indexes[MaxClients+1], players = 0; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i)) indexes[players++] = i; } if (players > 0) return indexes[GetRandomInt(0, players-1)]; return 0; }
|
|
| |
Naykon
|
Дата: Среда, 22.02.2012, 17:49:00 | Сообщение # 21 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Нужно чтоб Рандомом выбирало ЖИВОГО СТ Вот пробывал так не получилось, итог - выбирает кого попало. Code if (all_votes < 1) { new random_client = GetRandomClient(); if (random_client > 0) { PrintToChatAll("Игрок %N Кикнут!", random_client); KickClient(random_client, "бб"); } return Plugin_Stop; }
GetRandomClient() { new indexes[MaxClients+1], players = 0; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && IsClientInGame(i) && GetClientTeam(i) == 3 && IsPlayerAlive(i)) indexes[players++] = i; } if (players > 0) return indexes[GetRandomInt(0, players-1)]; return 0; }
|
|
| |
_wS_
|
Дата: Среда, 22.02.2012, 18:31:21 | Сообщение # 22 |
|
Это должно работать
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; }
В твоем коде вроде все правильно, только зачем 2 раза делать IsClientInGame(i)
|
|
| |
Naykon
|
Дата: Среда, 22.02.2012, 21:35:16 | Сообщение # 23 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Заработало но почему то рандомом выбирает постоянно одного и того же но небеда)))
Теперь представьте что я заменил KickClient(random_client, "бб"); на SetEntityRenderColor(target_index, 0, 0, 255, 130); Теперь игроки становятся синими а не вылетают из игры.
Еще подскажите как сделать чтоб в случае смерти выбранного голосованием игрока , синим становился любой другой живой СТ... и в случае смерти этого "другого" становился синий следующий живой СТ...
Я понимаю нужно отловить момент player_death и в нем уже править... но для этого нужна внешняя переменная которая будет ссылаться на выбранного игрока путем голосования... а там уже условие if else и т п
Добавлено (22.02.2012, 21:35:16) --------------------------------------------- Я представляю решение вопроса примерно так Code public OnPluginStart() { HookEvent("round_start", Round_Start, EventHookMode_PostNoCopy); HookEvent("player_death", playerDeath); }
public Action:playerDeath(Handle:event, const String:name[], bool:dontBroadcast) { new userid = GetEventInt(event, "userid"); new client = GetClientOfUserId(userid); if (target_index = client) { PrintToChatAll("Игрок погиб", client) //Тут условие If, раз уж погиб тогда берем РАНДОМОМ любого другого из GetRandomClient() } }
target_index - результат голосования... но вот проблема как переменную которая содержит "синего игрока" playerDeath уже не видит т.е target_index локальная...
Идея такого вида прокати ДА, нет?
Сообщение отредактировал Naykon - Среда, 22.02.2012, 21:37:31 |
|
| |
_wS_
|
Дата: Четверг, 23.02.2012, 04:02:24 | Сообщение # 24 |
|
Хм, создай глобальную переменную, это делается в верхнем уровне.
Code // Это глобальная переменная new target_index = 0;
public OnPluginStart() { HookEvent("round_start", round_start, EventHookMode_PostNoCopy); HookEvent("player_death", player_death); }
public OnMapStart() { target_index = 0; }
|
|
| |
Naykon
|
Дата: Четверг, 23.02.2012, 18:06:59 | Сообщение # 25 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
В общем вот целый код... Цель - сделать так чтоб после смерти выбранного игрока ПУТЕМ ГОЛОСОВАНИЯ "выбранным" становился автоматически любой другой живой СТ
Code #include <sourcemod> #include <cstrike> #include <sdktools>
new Handle:h_Menu, Handle:h_Timer, votes[MAXPLAYERS+1], timer_sec, all_votes; new i = 0;
public OnPluginStart() { HookEvent("round_start", Round_Start, EventHookMode_PostNoCopy); HookEvent("player_death", playerDeath); }
public OnMapStart() { i = 0; }
public Action:playerDeath(Handle:event, const String:name[], bool:dontBroadcast) { new userid = GetEventInt(event, "userid"); new client = GetClientOfUserId(userid); if (i = client) { PrintToChatAll("Игрок погиб", client) } }
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; }
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) { 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) { all_votes += 1; votes[target_index] += 1; PrintToChatAll("%N проголосовал за %N", i, target_index); } 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) { PrintToChatAll("Игрок %N стал синим D", random_client); SetEntityRenderColor(random_client, 0, 0, 255, 130); } return Plugin_Stop; }
// Находим игрока, за которого больше всего проголосовали 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)) { PrintToChatAll("Игрок %N стал СИНИМ!", target_index); SetEntityRenderColor(target_index, 0, 0, 255, 130); } else PrintToChatAll("Игрок не найден"); return Plugin_Stop; }
Как??
Сообщение отредактировал Naykon - Четверг, 23.02.2012, 18:09:13 |
|
| |
_wS_
|
Дата: Четверг, 23.02.2012, 19:33:11 | Сообщение # 26 |
|
Я не хочу вникать в весь этот код и исправлять ошибки. Говори конкретно, что не получается, и будет разговор. Данный код не компилируется и в черном окне прекрасно видно из-за чего. Ты создал глобальную переменную i и создаешь такую же локальную, что нельзя делать (for new i = 1 и тд). Да и ты не использовал эту переменную, не сохранил в ней выбранного синего игрока. И перед тем, как ставить цвет, надо проверить жив ли игрок. И перед тем, как игрок голосует, надо проверить, может уже есть живой синий ct и тд.
Все детали надо учитывать. Ты используешь много кода, который не понимаешь, это глупо. Например, как мы получили случайного игрока? Ты видишь код, цикл, условия и тд, но понимаешь ли ты как оно работает? Если нет, то ты не можешь быть уверен в своем скрипте. И вот, например, ты пишешь: PrintToChatAll("Игрок погиб", client) - синтаксис неверный.
Если ты не уверен в какой-то строке и др, вставляй PrintToServer в нужные места, чтобы понять, например, какая часть кода была выполнена, а какая нет и тд.
|
|
| |
Naykon
|
Дата: Четверг, 23.02.2012, 20:34:29 | Сообщение # 27 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Как можно обозначить выбранного игрока, если переменная указывающая на этого игрока локальная переменная, следовательно я не могу отловить player_death т.е умершего синего игрока player_death не видит.
Как использовать локальную одной функции в другой функцие?
|
|
| |
_wS_
|
Дата: Пятница, 24.02.2012, 10:42:10 | Сообщение # 28 |
|
Я же сказал, глобальная переменная..
Code new ct_client = 0;
public Action:Timer_Func(Handle:timer, any:x) { // ...
// Находим игрока, за которого больше всего проголосовали 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) && IsPlayerAlive(i)) { ct_client = target_index; PrintToChatAll("Игрок %N стал СИНИМ!", ct_client); SetEntityRenderColor(ct_client, 0, 0, 255, 130); } else PrintToChatAll("Игрок не найден или мертв");
return Plugin_Stop; }
Переменная ct_client доступна во всех функциях.
|
|
| |
Naykon
|
Дата: Пятница, 24.02.2012, 14:51:12 | Сообщение # 29 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Нужно чтоб у игроков писало сообщением Когда за Т то Красное а за СТ - синее.. Из урока пробывал в таком виде.. в итоге сервер упал)))))) Code new Handle:h = StartMessageAll("SayText2"); if (h != INVALID_HANDLE) { BfWriteByte(h, ct_client); BfWriteByte(h, true); BfWriteString(h, "\x03Цветное %N\x04сообщение", ct_client); EndMessage(); }
|
|
| |
_wS_
|
Дата: Пятница, 24.02.2012, 15:58:43 | Сообщение # 30 |
|
Что тебе мешает зайти СЮДА и посмотреть синтаксис команды, которую ты используешь? Ошибка в BfWriteString.
Code BfWriteString(h, "так можно"); BfWriteString(h, "а так нельзя %N", ct_client);
Если есть: ', any:..' : PrintToChat(client, const String:format[], any:...);
Code PrintToChat(client, "значит это можно %N", ct_client);
Если 'any' нет, создай нужную строку с помощью Format.
|
|
| |
|