Данное ядро было написано для разрешения конфликтов плагинов, изменяющих одно и то же в разной степени
К примеру:
У вас есть 2 плагина, изменяющих скорость, и зомби сервер
Плагин1 устанавливает скорость на 1.5 для зомби через 1 секунду после спавна и сразу после заражения
Плагин2 увеличивает скорость игрока на 0.5 через 1 секунду после спавна
В таком случае у нас 2 исхода установки скорости после спавна:
Нам, как разработчикам, так и серверодержателям, такой расклад не по душе. Именно тут полезно данное ядро
Ввод местную терминологию и немного объяснений:
Во-первых, нужно реализовать хук на эффект (поглядывая в include-файл) и прописать логику:
Идеально: за каждое потерянное хп игрок получает +1% к наносимому урону. Теперь нужно установить хук
Хук можно установить когда и сколько угодно. Вызван при вычислении множителя он будет лишь 1 раз, даже если он будет несколько раз подряд установлен на один и тот же множитель.
Я советую устанавливать хук при OnLibraryAdded, если верить результатам моего теста, эта функция запускается в плагине под каждую библиотеку, зарегистрированную через SourceMod, даже если сам плагин был загружен гораздо позже. Как по мне, это идеальное место
Требования
SourceMod
Установка
Переместить plugins/effectcalc.smx в addons/sourcemod/plugins/
Переместить по желанию плагины из plugins/disabled/в addons/sourcemod/plugins
Ввести в консоль sm plugins refresh
К примеру:
У вас есть 2 плагина, изменяющих скорость, и зомби сервер
Плагин1 устанавливает скорость на 1.5 для зомби через 1 секунду после спавна и сразу после заражения
Плагин2 увеличивает скорость игрока на 0.5 через 1 секунду после спавна
В таком случае у нас 2 исхода установки скорости после спавна:
- Благоприятный исход. Плагин1 установит скорость раньше Плагина2, Плагин2 добавит к этой скорости свою
- Не благоприятный исход. Плагин2 увеличит скорость, а потом Плагин1 установит свою, нивелируя старания Плагина2
Нам, как разработчикам, так и серверодержателям, такой расклад не по душе. Именно тут полезно данное ядро
Ввод местную терминологию и немного объяснений:
- Эффект - это просчитываемый в реальном времени коэффициент (на него мы умножаем/делим что-либо), для применения его для чего-либо. Состоит из названия и массива множителей
- Множитель - один компонентов эффекта. Представляет собой название множителя и коэффициент, просчитываемый в реальном времени.
- Хук на эффект (хук на множитель) - Функция, вызываемая при просчете коэффициента множителя. Хук ставится на множитель, соответственно, при установке хука необходимо указать и эффект, и множитель.
- Вычисление множителя - выполнение всех его хуков с целью изменения заданного коэффициента (по умолчанию - 1.0)
- Вычисление эффекта - вычисление всех множителей и перемножение их коэффициентов (по умолчанию - 1.0)
- Попросить применить эффект - "попросить" модуль, реализующий эффект, заново вычислить эффект и применить изменения в соответствии с изменениями коэффициента эффекта
- Хук на применение эффекта - функция, вызываемая, когда модуль просит применить эффект
- Модуль-сервер - плагин, реализующий вычисление эффекта и применение изменений (К примеру, напрямую устанавливающий скорость), и отвечающий на просьбу применения эффекта
- Модуль-клиент - плагин, устанавливающий хук на эффект и, в некоторых случаях, просящий применить эффект.
Во-первых, нужно реализовать хук на эффект (поглядывая в include-файл) и прописать логику:
Идеально: за каждое потерянное хп игрок получает +1% к наносимому урону. Теперь нужно установить хук
Хук можно установить когда и сколько угодно. Вызван при вычислении множителя он будет лишь 1 раз, даже если он будет несколько раз подряд установлен на один и тот же множитель.
Я советую устанавливать хук при OnLibraryAdded, если верить результатам моего теста, эта функция запускается в плагине под каждую библиотеку, зарегистрированную через SourceMod, даже если сам плагин был загружен гораздо позже. Как по мне, это идеальное место
Требования
SourceMod
Установка
Переместить plugins/effectcalc.smx в addons/sourcemod/plugins/
Переместить по желанию плагины из plugins/disabled/в addons/sourcemod/plugins
Ввести в консоль sm plugins refresh