[Любая игра] Lite Plugins

Тема в разделе "Утверждённые плагины", создана пользователем KorDen, 13 фев 2013.

  1. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Решил сделать общую тему для всех наработок
    Что это? Изначально для изменения сообщений подключения/отключения я использовал Connect Announce by Arg, было довольно удобно - обычным пользователям выводилось простое перекрашенное сообщение о подключении/отключении, админам - еще IP и ID. Однако, когда я начал смотреть исходники, я понял что вся та функциональность, которая есть в CA, мне не нужна. А там есть и GeoIP (регион мне не нужен, да и HLXCE выводит), и установка личных сообщений каждому игроку, и еще куча бреда. И так можно говорить про многие плагины.
    Когда сервер не слишком популярен, об оптимизации многие не слишком задумываются. Однако когда сервер на 64 слота, DeathMatch с приличным онлайном - тут уже и начнешь задумываться о любой оптимизации. Хотя конечно лучше бы такую оптимизацию делать везде, но многим удобна настраиваемость через конфиги, а некоторые даже не заморачиваются на этот счет.
    Собственно тогда и начал я делать свои облегченные версии используемых мною плагинов, некоторые из которых публикую здесь.

    Описание: Плагин позволяет отображать измененные сообщения о смене команды, подключении и отключении игроков, с выводом Steam ID и IP админам в последних двух. НАСТРОЕК (в виде переменных) НЕТ!
    FAQ:
    ГДЕ КОНФИГИ? Их нет. Нужны конфиги - используйте ConnectAnnounce, здесь все это убрано для оптимизации
    Где редактировать строчки? - Настройка сообщений производится редактированием исходника с последующей перекомпиляцией. Четыре вызова функции Fromat и массив teams вначале. Если же вы плохо понимаете построение форматных строк, то луче все же воспользоваться ConnectAnnounce, этот плагин для тех кто понимает хотя бы базово как редактировать плагины и где найти строки, которые нужно отредактировать.
    В %GAMENAME%!=css пишет про терористов и КТ, почему? - Имена команд из игры не запрашиваются - по умолчанию этот плагин под CSS, для других игр придется изменять в само начале в массиве teams названия команд. Там же можно указать и цвета. Почему? А какой смысл делать лишее при каждой смене карты, ведь гораздо лучше один раз изменить имена в исходнике и перекомпилировать.
    MoreColors? - Не упоминайте мне про него - цвета прекрасно указываются через \x07RRGGBB или даже через \x08RRGGBBAA - не вижу никакого смысла подключать целую библиотеку, тем более возникают проблемы, когда в никах у игроков есть фигурные скобки.
    Коды цветов команд: Цвет CT/BLU - \x0799CCFF Цвет T/RED - \x07FF4040 Цвет Spectators - \x07CCCCCC

    При изменении прошу обратить внимание на то, что при подключении нельзя узнать client через GetClientOfUserId(GetEventInt(event,"userid")), адрес же при подключении передается в событии (подробности тут - http://wiki.alliedmods.net/Generic_Source_Server_Events )
    Позволяет прослушивать голосовой чат другой команды, а так же включать режим, при котором админа слышат все.
    Так же админу виден чат чужой команды, наблюдателей и мертвых (не выключается)
    С последним у меня небольшой баг, в некоторых случаях сообщение отображается дважды (стандартное и дублируемое через плагин). До конца не уловил все случаи стандартной логики когда отображаться должно/не должно.
    Команды:
    sm_enemyvoice - включить прослушку чата чужой команды
    sm_talktoserver - включить режим вашей слышимости всему серверу
    Необходимый флаг - ADMFLAG_BAN (для простоты изменения вынесен в дефайн ADMIN_LEVEL в начале кода)

    Оригинальный плагин
    Недавно мне написал Konstantin о том, что у него не работает BunnyHop после обнов, от которого единственное необходимое ему действие - при зажатии пробела производить бесконеный прыжок, без ускорений, двойных прыжков и прочего. Проблему то решили, однако взглянув на код infinite-jumping, включающий еще и SMLib, я понял, что это идеальный пример как НЕ надо писать плагины, уж столько там лишнего было...

    А в итоге необходимый плагин для просто бесконечного прыжка получился смешным:
    PHP:
    public Action:OnPlayerRunCmd(client, &buttons, &impulseFloat:vel[3], Float:angles[3], &weapon)
        if (
    IsPlayerAlive(client) && (buttons IN_JUMP) && !(GetEntityFlags(client) & FL_ONGROUND) && !(GetEntityMoveType(client) & MOVETYPE_LADDER) && (GetEntProp(clientProp_Data"m_nWaterLevel") <= 1))
            
    buttons &= ~IN_JUMP;
    Это весь плагин, да-да. #include <sourcemod> ведь не обязателен, компилятор сам его подключает автоматически, а плагин получается в две-три строчки :lol: (Вместо кода на 35.5 килобайт + SMLib)
    Даже выкладывать скомпилированный как-то не катит :-D
    (Предположительно для CSS, поскольку в других OrangeBox играх для полного копирования необходимого кода smac_rcon возможно нужно добавить еще кое-что, что в случае с CSS не используется)
    Один из модулей SMAC - SMAC Rcon Locker кроме защиты RCON-пароля от смены позволяет, используя дополниельное расширение SM Rcon, создавать белый список адресов, с которых возможно подключение через RCON к серверу. Однако многие его не используют, а тем более когда вам нужна возможность подклчюения с люого места (например через 3G модем), функция получается не актуальной.
    Так же в коде есть еще дополнительные меры защиты некоторых переменных, однако идет проверка на версию движка, под которую CSS, и, возможно, другие OrangeBox-игры не попадают. Поэтому для CSS этот код можно полностью вырезать, в итоге оставив только защиту самого RCON-пароля от смены.
    Для облегчения в данном плагине так же идет запись предупреждения при попытке смены пароля в error-лог SM, а не в лог SMAC.
    Урезанный NoBlock - действует для всех игроков и для всех гранат.
    Можно немного подправить для совместимости с CSS Throwing Knives
    Никаких переменных, настроек и дополнительных функций.
     

    Вложения:

    Последнее редактирование: 29 май 2013
  2. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Re: Simple game events messages

    Можно конечно и так, я изначально тоже вынес в отдельную функцию получение IP/ID/ника (точнее это ввсе перенес в PrintFormattedMessage), но все же посчитал что лучше по отдельности - для кастомизации, например у меня (в том числе и в примере), при подключении ник игрока одним цветом, при отключении другим (это в rawadmmsg, для визуального определения подключающихся/отключающихся без вчитывания). А при октлючении ведь еще и причина нужна, и не всегда ее хочется в конец ставить, например если подменять "Disconnect by user" чтобы не было глупых фраз, например "игрок ** отключился (отчключился)", можно например убирать вообще скобки или дефис и так далее.
    В приницпе, идеи некотрые есть - сделать булевую переменную (0 - подключился, 1 - отключился), а потом уже в одной и той же функции условиями дополнять/изменять строчку.
    Плюс, если ты скажем хочешь при подключении выводить стим, а при отключении ничего лишнего не выводить, то можно вообще убрать ненужные строчки по запросу IP и его запоминанию.

    Можно пояснить или кинуться ссылкой на разницу new и decl?

    Нелогично. 000.000.000.000 - 15 байт + ноль-символ - нет смысла делать 30, можно обрезать и до 16, либо до 20 "на всякий случай". Аналогичнно и со стимайди, даже с учетом пиратских 10-значных, 21 байта хватит. Хотя я все же 24 поставил на случай каких-либо изменений эмулятора.
    А вот с именем тут веселее - ведь не латинские символы будут занимать два байта, а с учетом любви ко всяким "рющечкам" у игроков, лучше все же побольше отводить.
     
  3. ★$$StOk$$★

    ★$$StOk$$★

    Сообщения:
    647
    Симпатии:
    178
    Re: Simple game events messages

    Молодец!Хорошая работа
     
  4. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Re: Simple game events messages

    Блин.. Хотел сейчас вообще все завернуть в одну функцию, находу определяя имя события и в зависимотси от этого выводя нужное, но оказывается, что при player_connect по userid нельзя взять GetClientOfUserId, хотя в принципе он нужен только для вывода IP, а IP передается и так в событии... Вот и получается, что либо разбивать все на три функции, и убирать всю красивость решения из одной функции, либо выводить только известные данные в возможно кривом виде... Или может кто знает, есть ли способ получить client при player_connect (Или он еще при этом попросту не успел назначиться?)
     
  5. Vit_ amin

    Vit_ amin BotManager001

    Сообщения:
    1.065
    Симпатии:
    345
    Re: Simple game events messages

    А разве через userid нельзя ?
     
  6. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Re: Simple game events messages

    Игрок Retoucher вступает в игру
    ConTest: player_connect, UID: 22384, CLID: 0
    Retoucher - STEAM_0:1:57142280 - 109.184.244.246 подключился
    Специально делал отладку, UID Это GetEventInt(event,"userid") а CLID это GetClientOfUserId(GetEventInt(event,"userid"))

    Ловлю так - HookEvent("player_connect", event_PlayerConn, EventHookMode_Pre);
    Пробовал EventHookMode_Post поставить, все равно ClientID не дается, прикинул что больше ничего в принципе не надо и решил брать адрес и резать до двоеточия... Но все-таки, а можно ли как-то получить уже тут clientid или он назначается позже?
     
  7. Vit_ amin

    Vit_ amin BotManager001

    Сообщения:
    1.065
    Симпатии:
    345
    Re: Simple game events messages

    Я это сказал потому что на ES так бы сделал ^_^
    Так как там все через userid
     
  8. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Re: Simple game events messages v1.1

    Все, додумал и переделал все на данный момент окончательно, подключение/отключение теперь обрабатывается одной функцией.
     
  9. Серый™

    Серый™ CS:S Server

    Сообщения:
    2.570
    Симпатии:
    1.153
    Re: Simple game events messages v1.1

    Я чисто для себя взял функцию перехода в другу команду, просто заменил инглиш текст на русский с подсветкой.
    Спасибо KorDen за плаг.
     
  10. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Re: Simple game events messages v1.1

    Так я вначале вообще хотел сделать как наработки, то есть просто функции, без какой-то связи, потому что у меня много таких вот функций простых собрано в одном плагине. Однако все же решил выложить отдельны плагином, учитывая частое желание многих перекрасить эти сообщения или изменить
     
  11. CTe6eJIeK_vRn

    CTe6eJIeK_vRn Супер-модератор

    Сообщения:
    2.014
    Симпатии:
    1.798
    Re: Simple game events messages v1.1

    Ну вот и я добрался до тестов:
    Код:
    L 02/25/2013 - 15:32:54: SourceMod error session started
    L 02/25/2013 - 15:32:54: Info (map "2000") (file "errors_20130225.log")
    L 02/25/2013 - 15:32:54: [SM] Native "IsClientInGame" reported: Client index 22 is invalid
    L 02/25/2013 - 15:32:54: [SM] Displaying call stack trace for plugin "gameevents.smx":
    L 02/25/2013 - 15:32:54: [SM]   [0]  Line 72, gameevents.sp::event_PlayerConn()
    L 02/25/2013 - 15:33:07: [SM] Native "IsClientInGame" reported: Client index 22 is invalid
    L 02/25/2013 - 15:33:07: [SM] Displaying call stack trace for plugin "gameevents.smx":
    L 02/25/2013 - 15:33:07: [SM]   [0]  Line 72, gameevents.sp::event_PlayerConn()
    L 02/25/2013 - 15:33:16: [SM] Native "IsClientInGame" reported: Client index 22 is invalid
    L 02/25/2013 - 15:33:16: [SM] Displaying call stack trace for plugin "gameevents.smx":
    L 02/25/2013 - 15:33:16: [SM]   [0]  Line 72, gameevents.sp::event_PlayerConn()
    L 02/25/2013 - 15:33:34: [SM] Native "IsClientInGame" reported: Client index 22 is invalid
    L 02/25/2013 - 15:33:34: [SM] Displaying call stack trace for plugin "gameevents.smx":
    L 02/25/2013 - 15:33:34: [SM]   [0]  Line 72, gameevents.sp::event_PlayerConn()
    L 02/25/2013 - 15:34:04: [SM] Native "IsClientInGame" reported: Client index 22 is invalid
    L 02/25/2013 - 15:34:04: [SM] Displaying call stack trace for plugin "gameevents.smx":
    L 02/25/2013 - 15:34:04: [SM]   [0]  Line 72, gameevents.sp::event_PlayerConn()
    L 02/25/2013 - 15:38:49: [SM] Native "IsClientInGame" reported: Client index 22 is invalid
    L 02/25/2013 - 15:38:49: [SM] Displaying call stack trace for plugin "gameevents.smx":
    L 02/25/2013 - 15:38:49: [SM]   [0]  Line 72, gameevents.sp::event_PlayerConn()
    L 02/25/2013 - 15:38:50: [SM] Native "IsClientInGame" reported: Client index 22 is invalid
    L 02/25/2013 - 15:38:50: [SM] Displaying call stack trace for plugin "gameevents.smx":
    L 02/25/2013 - 15:38:50: [SM]   [0]  Line 72, gameevents.sp::event_PlayerConn()
    L 02/25/2013 - 15:48:13: [SM] Native "IsClientInGame" reported: Client index 22 is invalid
    L 02/25/2013 - 15:48:13: [SM] Displaying call stack trace for plugin "gameevents.smx":
    L 02/25/2013 - 15:48:13: [SM]   [0]  Line 72, gameevents.sp::event_PlayerConn()
    L 02/25/2013 - 15:48:13: [SM] Native "IsClientInGame" reported: Client index 22 is invalid
    L 02/25/2013 - 15:48:13: [SM] Displaying call stack trace for plugin "gameevents.smx":
    L 02/25/2013 - 15:48:13: [SM]   [0]  Line 72, gameevents.sp::event_PlayerConn()
    L 02/25/2013 - 15:48:13: [SM] Native "IsClientInGame" reported: Client index 22 is invalid
    L 02/25/2013 - 15:48:13: [SM] Displaying call stack trace for plugin "gameevents.smx":
    L 02/25/2013 - 15:48:13: [SM]   [0]  Line 72, gameevents.sp::event_PlayerConn()
    L 02/25/2013 - 15:48:13: [SM] Native "IsClientInGame" reported: Client index 22 is invalid
    L 02/25/2013 - 15:48:13: [SM] Displaying call stack trace for plugin "gameevents.smx":
    L 02/25/2013 - 15:48:13: [SM]   [0]  Line 72, gameevents.sp::event_PlayerConn()
    SM 1.5.0
     
  12. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    892
    Симпатии:
    659
    Re: Simple game events messages v1.1

    PHP:
    // Найди
    for (new 1MAXPLAYERSi++)

    // Замени на
    for (new 1<= MaxClientsi++)
    Поможет, нет, посмотрим
     
    KorDen и CTe6eJIeK_vRn нравится это.
  13. CTe6eJIeK_vRn

    CTe6eJIeK_vRn Супер-модератор

    Сообщения:
    2.014
    Симпатии:
    1.798
    Re: Simple game events messages v1.1

    Спасибо The End Is Near...
    Держи mr.Ak-47,
     

    Вложения:

  14. mr.Ak-47

    mr.Ak-47

    Сообщения:
    8
    Симпатии:
    0
    Re: Simple game events messages v1.1

    CTe6eJIeK_vRn, Спасибо. Буду пробовать сменить цвета
     
  15. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Re: Simple game events messages v1.1

    Ох, совсем забыл... В своем общем плагине поправил, а тут забыл.. Там надо if(IsClientConnected(i) && IsClientInGame(i)), я забыл проверку на подключение поставить...
    Сейчас заодно еще все-таки удалю оставшуюся переменную и сделаю уже пофксив все вроде как...
     
  16. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Re: Simple game events messages v1.1

    L 02/25/2013 - 15:32:54: [SM] Native "IsClientInGame" reported: Client index 22 is invalid
    L 02/25/2013 - 15:32:54: [SM] Displaying call stack trace for plugin "gameevents.smx":
    L 02/25/2013 - 15:32:54: [SM] [0] Line 72, gameevents.sp::event_PlayerConn()
    Для надежности лучше вместо ограничения до MaxClients делать перед IsClientInGame проверку на существование клиента, то есть IsClientConnected - http://docs.sourcemod.net/api/index.php?fastload=show&id=404& "Errors: Invalid client index."
     
  17. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Re: Simple game events messages v1.1

    L 02/25/2013 - 15:32:54: [SM] Native "IsClientInGame" reported: Client index 22 is invalid
    L 02/25/2013 - 15:32:54: [SM] Displaying call stack trace for plugin "gameevents.smx":
    L 02/25/2013 - 15:32:54: [SM] [0] Line 72, gameevents.sp::event_PlayerConn()

    Где тут 0?
     
  18. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Re: Simple game events messages v1.1

    В этом случае наверняка индекс будет даже не 0 а -1... Либо все же будет прошлый индекс, но он не будет ссылаться на игрока. Такое проще провернуть с бомбой, если при взрыве как в MVP писать кто ее заложил.
    0 это вроде как World, то есть падения / другие убивающие места.

    Выложил 1.2, вроде не должно быть ошибок...
     
    CTe6eJIeK_vRn нравится это.
  19. CTe6eJIeK_vRn

    CTe6eJIeK_vRn Супер-модератор

    Сообщения:
    2.014
    Симпатии:
    1.798
    Re: Simple game events messages v1.1

    скомпилировал 1.2
    Код:
    L 02/25/2013 - 18:47:25: SourceMod error session started
    L 02/25/2013 - 18:47:25: Info (map "de_dust2") (file "errors_20130225.log")
    L 02/25/2013 - 18:47:25: [SM] Native "IsClientConnected" reported: Client index 21 is invalid
    L 02/25/2013 - 18:47:25: [SM] Displaying call stack trace for plugin "gameevents.smx":
    L 02/25/2013 - 18:47:25: [SM]   [0]  Line 63, gameevents.sp::event_PlayerConn()
    L 02/25/2013 - 18:47:27: Error log file session closed.

    UPD
    если выгрузить плагин smac_autodemo, эта ошибка при старте сервера не возникает
     
    KorDen нравится это.
  20. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Re: Simple game events messages v1.1

    CTe6eJIeK_vRn, Хм, ругается на SourceTV чтоль.. Сервер на сколько слотов? 20? Надо бы мне протестировать на маленьком севрере с STV, а то я все на x64 тестирую, на котором ничего такого не стоит...