Lite Plugins

Статус
В этой теме нельзя размещать новые ответы.

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Решил сделать общую тему для всех наработок
Что это? Изначально для изменения сообщений подключения/отключения я использовал 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, &impulse, Float:vel[3], Float:angles[3], &weapon)
	if (IsPlayerAlive(client) && (buttons & IN_JUMP) && !(GetEntityFlags(client) & FL_ONGROUND) && !(GetEntityMoveType(client) & MOVETYPE_LADDER) && (GetEntProp(client, Prop_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
Никаких переменных, настроек и дополнительных функций.
 

Вложения

  • kdlp-adminsentinel.sp
    2.7 КБ · Просмотры: 519
  • kdlp-adminsentinel.smx
    3.6 КБ · Просмотры: 239
  • kdlp-rcon-lock.sp
    744 байт · Просмотры: 236
  • kdlp-rcon-lock.smx
    2.3 КБ · Просмотры: 127
  • kdlp-noblock.sp
    779 байт · Просмотры: 708
  • kdlp-noblock.smx
    2.5 КБ · Просмотры: 548
  • kdlp-gameevents.sp
    2.4 КБ · Просмотры: 2,350
  • kdlp-gameevents.smx
    4.3 КБ · Просмотры: 946
Последнее редактирование:

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Re: Simple game events messages

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

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

decl String:namebuf[30];
decl String:steambuf[30];
decl String:ipbup[30];
Нелогично. 000.000.000.000 - 15 байт + ноль-символ - нет смысла делать 30, можно обрезать и до 16, либо до 20 "на всякий случай". Аналогичнно и со стимайди, даже с учетом пиратских 10-значных, 21 байта хватит. Хотя я все же 24 поставил на случай каких-либо изменений эмулятора.
А вот с именем тут веселее - ведь не латинские символы будут занимать два байта, а с учетом любви ко всяким "рющечкам" у игроков, лучше все же побольше отводить.
 

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Re: Simple game events messages

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

Vit_ amin

Добрая душа
Сообщения
1,504
Реакции
660
Re: Simple game events messages

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

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Re: Simple game events messages

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

Игрок 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 или он назначается позже?
 

Vit_ amin

Добрая душа
Сообщения
1,504
Реакции
660
Re: Simple game events messages

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

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Re: Simple game events messages v1.1

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

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,376
Re: Simple game events messages v1.1

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

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Re: Simple game events messages v1.1

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

CTe6eJIeK_vRn

Участник
Сообщения
2,114
Реакции
1,867
Re: Simple game events messages v1.1

Ну вот и я добрался до тестов:
C-подобный:
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
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
Re: Simple game events messages v1.1

PHP:
// Найди
for (new i = 1; i < MAXPLAYERS; i++)

// Замени на
for (new i = 1; i <= MaxClients; i++)
Поможет, нет, посмотрим
 

CTe6eJIeK_vRn

Участник
Сообщения
2,114
Реакции
1,867
Re: Simple game events messages v1.1

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

Вложения

  • gameevents-1-1fix.smx
    4.6 КБ · Просмотры: 148
  • gameevents-1-1fix.sp
    3.2 КБ · Просмотры: 339

mr.Ak-47

Участник
Сообщения
7
Реакции
0
Re: Simple game events messages v1.1

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

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Re: Simple game events messages v1.1

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

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Re: Simple game events messages v1.1

Почему не хватает одной проверки? IsClientInGame(i)
http://hlmod.ru/forum/showpost.php?p=106125&postcount=14

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."
 

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Re: Simple game events messages v1.1

KorDen
0 - сервер/консоль сервера, для этого мы и делаем i = 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?
 

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Re: Simple game events messages v1.1

KorDen
=\
Допустим мы хотим убить игрока, который убил заложника
Зашел игрок, кинул гранату, вышел, убил заложника, индекс какой будет ?

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

Выложил 1.2, вроде не должно быть ошибок...
 

CTe6eJIeK_vRn

Участник
Сообщения
2,114
Реакции
1,867
Re: Simple game events messages v1.1

скомпилировал 1.2
C-подобный:
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

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Re: Simple game events messages v1.1

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