Пробемка с плагином
| |
www22
|
Дата: Суббота, 23.06.2018, 10:21:18 | Сообщение # 1 |
|
Сообщений: 84
Репутация: -1 [ +/- ]
|
|
1.Решил перевести и сделать мультиязычным плагин, и тут же столкнулся с проблемкой перевода . Код здесь : https://pastebin.com/rvC13cBZ 443 строчка - CreateInfoPanel() Что то никак не получается сделать правильно всё , уже перечситал и тему про мультиязычночть и про меню , и всё никак .. Перепробовал кучу васяких вариантов . То выводится только название строки , то вообще пусто всё . Помогите правильно расписать его . Весь текст разбил на 4 кусочка = 4 строчки перевода.
2. Почему то не хочет отрабатываться вот этот код 107 строчка - public OnClientDisconnect(iClient). Я что подумал , стал смотреть еще 1 файл , с Hooks , может быть нужен для это функции Hooks(HookEvens) , или без него должно всё работать ? И вот еще - поставил g_ConVar[MinPlayers] =2 .. По умолчанию в плагине- 6 , минимум-3.Не знаю может влиять на ошибку или нет. То есть при дисконекте игрока в особенности кто ищет и он последний, плагин продолжает раунд.
Сообщение отредактировал www22 - Суббота, 23.06.2018, 10:28:32 |
|
| |
_R1KO_
|
Дата: Суббота, 23.06.2018, 14:33:18 | Сообщение # 2 |
|
Сообщений: 200
Репутация: 30 [ +/- ]
|
|
www22, 1. Проблема в том что вы создаете 1 панель для всех игроков. У вас 2 способа решения:
- Создавать не панель, а меню. Ловить MenuAction_Display и MenuAction_DisplayItem и форматировать вывод под конкретного игрока
- Создавать панель для каждого персонально только при необходимости его отображения.
Я рекомендую 2-й вариант
2.
Код if (g_hInfoPanelTimer[iClient] != INVALID_HANDLE) { KillTimer(g_hInfoPanelTimer[iClient]); } нужно сделать так:
Код if (g_hInfoPanelTimer[iClient] != INVALID_HANDLE) { KillTimer(g_hInfoPanelTimer[iClient]); g_hInfoPanelTimer[iClient] = INVALID_HANDLE); } А то будет ошибка в лог.
А насчет вашей проблемы - добавьте отладку. Выводите все значения в чат/лог и увидите в чем проблема
|
|
| |
www22
|
Дата: Суббота, 23.06.2018, 15:56:01 | Сообщение # 3 |
|
Сообщений: 84
Репутация: -1 [ +/- ]
|
|
_R1KO_, да в том то и дело , что в оригинале , там выводится именно панель , эта панель как бы информация об игре . Вот и хотел просто добавить файл перевода . Чтобы через если вдруг допустил ошибки было проще редактировать , а не полностью менять и заново компилировать. Вот и думал что проще и легче будет , а тут вон как оказалось.. А по поводу меню , попробую.. но боюсь натворю дел с этим меню :)) Кстати а сама Панель , я так понимаю менее динамична по функционалу , чем меню ?
По поводу 2-го вопроса , тот код выше это к 2ому вопросу ? , а то подумал , что к менюшке !? Да я тут на всяк случай думал , сделать дополнительный плагин для такой балансировки , вот код :
Код #include <sourcemod> #include <sdktools>
public void OnPluginStart() { HookEvent("player_disconnect", Event_Disconnect, EventHookMode_Post); } public Action Event_Disconnect(Event hEvent, const char[] sName, bool bDontBroadcast) { if (GetTeamClientCount(3) == 0 &&GetTeamClientCount(2) >1) { for (int i = 1; i <= MaxClients; i++) { int iClient = GetRandomInt(1, i); if (GetClientTeam(iClient) == 2 ) ChangeClientTeam(iClient, 3); } }
return Plugin_Continue; } То есть , когда посл. игрок отключился из команды искателей "3" , то если больше 2х игроков во "2" команде то тогда перекидывало 1 игрока рнадомно . Он правильно расписан, при компиляции ошибок нет ?
Сообщение отредактировал www22 - Суббота, 23.06.2018, 23:10:29 |
|
| |
_R1KO_
|
Дата: Воскресенье, 24.06.2018, 23:30:27 | Сообщение # 4 |
|
Сообщений: 200
Репутация: 30 [ +/- ]
|
|
Цитата www22 ( ) Кстати а сама Панель , я так понимаю менее динамична по функционалу , чем меню ? угу. лучше создавать панель при её отображении.
Цитата www22 ( ) тот код выше это к 2ому вопросу ? это просто между прочим
Цитата www22 ( ) То есть , когда посл. игрок отключился из команды искателей "3" , то если больше 2х игроков во "2" команде то тогда перекидывало 1 игрока рнадомно . Он правильно расписан, при компиляции ошибок нет ? нет
Код public void Event_Disconnect(Event hEvent, const char[] sName, bool bDontBroadcast) { if (GetTeamClientCount(3) == 0 &&GetTeamClientCount(2) >1) { int[] iClients = new int[MaxClients]; int iPlayers = 0; for (int i = 1; i <= MaxClients; i++) { if(IsClientInGame(i) && GetClientTeam(i) == 2) iClients[iPlayers++] = i; } ChangeClientTeam(iClients[GetRandomInt(0, iPlayers-1)], 3); } }
|
|
| |
www22
|
Дата: Воскресенье, 24.06.2018, 23:44:34 | Сообщение # 5 |
|
Сообщений: 84
Репутация: -1 [ +/- ]
|
|
Цитата _R1KO_ ( ) угу. лучше создавать панель при её отображении. Что то не понял .. Эта панель создается 1 раз в начале загрузки карты и больше мы её не видим .. там в коде 60 строчка (https://pastebin.com/rvC13cBZ). Вроде так это работает . _R1KO_, Ясно , все таки неправильно с кодом .. Спасибо..
И можно ли в одной плагине поймать Собитие(event) из другого ?
Сообщение отредактировал www22 - Понедельник, 25.06.2018, 11:18:22 |
|
| |
_R1KO_
|
Дата: Понедельник, 25.06.2018, 11:30:14 | Сообщение # 6 |
|
Сообщений: 200
Репутация: 30 [ +/- ]
|
|
Цитата www22 ( ) И можно ли в одной плагине поймать Собитие(event) из другого ? смотря какое.
Цитата www22 ( ) Что то не понял .. Эта панель создается 1 раз в начале загрузки карты и больше мы её не видим .. там в коде 60 строчка (https://pastebin.com/rvC13cBZ). Вроде так это работает . немного не так. Она создается 1 раз, а потом просто отображается когда. Но проблема в том что тебе требуется мультиязычность, поэтому лучше было бы создавать перед отображением, форматируя под конкретного игрока, а после отображения - убивать панель.
|
|
| |
www22
|
Дата: Понедельник, 25.06.2018, 12:29:20 | Сообщение # 7 |
|
Сообщений: 84
Репутация: -1 [ +/- ]
|
|
Цитата _R1KO_ ( ) в том что тебе требуется мультиязычность не я уже отказался от неё , просто внутри файла все переводил .. А то как раз на этой панели и застрял , а там еще и меню есть , думаю так же встряну и с ней . А то есть еще кое какие моменты с переменными запутался. К примеру с переменной %N, что ставить уже в sp-файл %t или %s. Какие в плагин, какие в файл перевода . Плюс с этим format, тоже некоторые моменты не могу понять.
В итоге решил - просто русифицировать плагин.Тем более как бы есть уже по отдельности и английская французская версии . А мультиязычность , сначала оказалось проще чем то ,но вот потом, уже пошли сюрпризы из за незнания , а так написал выше. В итоге проще оказалось сделать всё так, может парочку строчек изменить. Плюс добавить хочу кое что .. Вот к примеру это :
Код RemoveWeapons(iClient); ..................... new iWeapon = GivePlayerItem(iClient, "weapon_amerknife"); - это я правильно понимаю, дает определенное оружие игроку SetEntData(iWeapon, g_iOffset_Effects, EF_NODRAW); - а здесь его в игре чтобы видно было или нет или наверное прорисовка его ?!
Просто хочу по квару g_ConVar[Random], чтобы это оружие давать (1), не давать(0) или рандом (2) был. У меня как бы вопрос , достаточно 1 строчку в условие закинуть или же лучше 2 .. Типа так, написал на коленке :
Код ................... if (GetConVarInt(g_ConVar[Random])>0) { new randomweapon=GetRandomInt(0, 1) ; if (randomweapon==1||GetConVarInt(g_ConVar[Random])==1) { ///Вот здесь не намудрил ? new iWeapon = GivePlayerItem(iClient, "weapon_amerknife"); // 1 SetEntData(iWeapon, g_iOffset_Effects, EF_NODRAW); // 2 } } ............. То есть просто заменить строчки 1 и 2 , на это код .. Кстати правильно ??? Проверил у себя , где то не так сделал. Здесь полностью код https://pastebin.com/HXjH5D4Q .. И Кстати Спасибо за помощь ..
Сообщение отредактировал www22 - Вторник, 26.06.2018, 16:58:55 |
|
| |
|