Skip to content

Latest commit

 

History

History
2926 lines (2493 loc) · 146 KB

README_RU.md

File metadata and controls

2926 lines (2493 loc) · 146 KB

Танки-мутанты

PayPal

Пожертвовать для мотивации

Языки

Английский

Лицензия

Следующая лицензия помещается в исходный код каждого плагина и включаемого файла.

Нажмите, чтобы расширить!

Танки-мутанты: SourceMod плагин L4D/L4D2 Все права защищены (C) 2017-2025 Альфред "Psyk0tik" Лагас (Alfred "Psyk0tik" Llagas)

Эта программа является бесплатным программным обеспечением: вы можете распространять и/или изменять её в соответствии с условиями Стандартной общественной лицензии GNU, опубликованной Free Software Foundation, либо версии 3 Лицензии, либо (по вашему выбору) любой более поздней версии.

Эта программа распространяется в надежде, что она будет полезна, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемых гарантий ТОВАРНОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. Подробнее см. Стандартную общественную лицензию GNU.

Вы должны были получить копию Стандартной общественной лицензии GNU вместе с этой программой. Если нет, см. http://www.gnu.org/licenses/.

Описание

Первоначально был расширенной версией плагина супертанков (Super Tanks). Танки-мутанты сочетает в себе особенности из плагинов последнего босса (Last Boss), Расширенную версию последнего босса (Last Boss Extended) и супертанков (Super Tanks), чтобы предоставить танкам уникальные силы и способности, которые улучшают игровой опыт.

Требования

Нажмите, чтобы расширить!
  1. SourceMod 1.12.0.6985 или выше
  2. Рекомендуется (Необязательно):
  1. Знания по установке SourceMod плагинов.

Примечание

Нажмите, чтобы расширить!
  1. Я не предоставляю поддержку для выделенного/локальных серверов, но плагин и его модули должны работать на них должным образом.
  2. Я не буду помогать вам с установкой или устранением неполадок с вашей стороны.
  3. Если вы получаете ошибки от самого SourceMod, это ваша проблема, а не моя.
  4. УБЕДИТЕСЬ, ЧТО ВЫ СОБЛЮДАЕТЕ ВСЕ ТРЕБОВАНИЯ И ПРАВИЛЬНО СЛЕДУЕТЕ РУКОВОДСТВУ ПО УСТАНОВКЕ.

Особенности

Нажмите, чтобы расширить!
  1. Полностью совместим со всеми режимами игры.
  2. Полностью настраиваемые Танки-мутанты.
  3. Гибкий конфигурационный файл.
  4. Автоматическая перезагрузка файл конфигурации при внесении изменений во время игры.
  5. Поддерживает пользовательские конфигурации для различных сценариев/настроек.
  6. Можно создать до 500 типов Танков-мутантов.
  7. Система администрирования, разработанная для доступа и иммунитету к танкам-мутантам.
  8. Пользовательские целевые фильтры для выживших, особых заражённых и танков-мутантов.
  9. Более 3,000 дополнительных настроек для настройки.
  10. Более 30 уникальных способностей на выбор.
  11. Выбор способностей для установки.
  12. Добавляйте собственные способности и функции с помощью forwards и natives.
  13. Создавайте всевозможные комбинации способностей.
  14. Поддерживает несколько языков.
  15. Цветовые теги чата для файлов перевода.
  16. Обнаруживает неработающие или неисправные Танки.
  17. Переключение увеличения/уменьшения урона в зависимости от сложности.
  18. Полностью настраиваемая система наград.
  19. Полностью настраиваемая система наказаний.
  20. Полностью настраиваемая система пассивная.
  21. Полностью настраиваемая защита от появления.
  22. Множество других функций!

Команды

Нажмите, чтобы расширить!
// Доступно администраторам только с флагом "z" (Root).
sm_mt_admin - Панель администратора Танков-мутантов.
sm_mt_config - Просмотр раздела файла конфигурации.
sm_mt_edit - Редактировать настройку в файле конфигурации.
sm_mt_list - Просмотр списка установленных способностей.
sm_mt_reload - Перезагрузка файла конфигурации.
sm_tank - Создать танка-мутанта.
sm_mt_tank - Создать танка-мутанта.
sm_smoker - Создать курильщика-мутанта.
sm_mt_smoker - Создать курильщика-мутанта.
sm_boomer - Создать толстяка-мутанта.
sm_mt_boomer - Создать толстяка-мутанта.
sm_hunter - Создать охотника-мутанта.
sm_mt_hunter - Создать охотника-мутанта.
sm_spitter - Создать плевальщицы-мутанта.
sm_mt_spitter - Создать плевальщицы-мутанта.
sm_jockey - Создать жокея-мутанта.
sm_mt_jockey - Создать жокея-мутанта.
sm_charger - Создать громилы-мутанта.
sm_mt_charger - Создать громилы-мутанта.
sm_mt_version - Узнать текущую версию плагина.

// Доступно только разработчику.
sm_mt_dev - Используется только разработчиком и для него.

// Доступны всем игрокам.
sm_mutanttank - Выбрать танка-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.)
sm_mtank - Выбрать танка-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.)
sm_mutantsmoker - Выбрать курильщика-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.)
sm_msmoker - Выбрать курильщика-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.)
sm_mutantboomer - Выбрать толстяка-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.)
sm_mboomer - Выбрать толстяка-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.)
sm_mutanthunter - Выбрать охотника-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.)
sm_mhunter - Выбрать охотника-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.)
sm_mutantspitter - Выбрать плевальщицы-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.)
sm_mspitter - Выбрать плевальщицы-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.)
sm_mutantjockey - Выбрать жокея-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.)
sm_mjockey - Выбрать жокея-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.)
sm_mutantcharger - Выбрать громилы-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.)
sm_mcharger - Выбрать громилы-мутанта. (Эта команда работает только в том случае, если параметр "Spawn Mode" в разделе "Plugin Settings/Human Support" установлен на 0.)
sm_mt_info - Просмотр информации о танках-мутантах.
sm_mt_prefs - Установить свои настройки плагина танков-мутантов.

// Комбинированный
sm_mt_ability - Просмотр информации каждой способности (A-J).
sm_mt_ability2 - Просмотр информации каждой способности (L-Z).

// Отдельный
sm_mt_absorb - Просмотр информации о способности поглощения.
sm_mt_acid - Просмотр информации о кислотной способности.
sm_mt_aimless - Просмотр информации о способности бесприцельности.
sm_mt_ammo - Просмотр информации о способности боеприпасов.
sm_mt_bomb - Просмотр информации о способности бомбы.
sm_mt_bury - Просмотр информации о способности закапывания.
sm_mt_car - Просмотр информации о способности машины.
sm_mt_choke - Просмотр информации о способности удушения.
sm_mt_clone - Просмотр информации о способности клонирования.
sm_mt_cloud - Просмотр информации о дымовой способности.
sm_mt_drop - Просмотр информации о способности выпадения оружия.
sm_mt_drug - Просмотр информации о способности одурманивающего эффекта.
sm_mt_drunk - Просмотр информации о способности опьянения.
sm_mt_electric - Просмотр информации о электрической способности.
sm_mt_enforce - Просмотр информации о способности принуждения.
sm_mt_fast - Просмотр информации о способности скорости.
sm_mt_fire - Просмотр информации о способности огня.
sm_mt_fling - Просмотр информации о способности броска.
sm_mt_fly - Просмотр информации о способности летать.
sm_mt_fragile - Просмотр информации о способности уязвимости.
sm_mt_ghost - Просмотр информации о способности призрака.
sm_mt_god - Просмотр информации о способности бога.
sm_mt_gravity - Просмотр информации о способности гравитации.
sm_mt_gunner - Просмотр информации о способности стрелка.
sm_mt_heal - Просмотр информации о способности лечения.
sm_mt_hurt - Просмотр информации о способности боли.
sm_mt_hypno - Просмотр информации о гипноспособности.
sm_mt_ice - Просмотр информации о способности льда.
sm_mt_idle - Просмотр информации о способности бездействия.
sm_mt_invert - Просмотр информации о способности инвертирования.
sm_mt_jump - Просмотр информации о способности прыжка.
sm_mt_lag - Просмотр информации о способности задержки.
sm_mt_laser - Просмотр информации о лазерной способности.
sm_mt_lightning - Просмотр информации о способности грозового шторма.
sm_mt_medic - Просмотр информации о способности медика.
sm_mt_meteor - Просмотр информации о способности метеоритного дождя.
sm_mt_minion - Просмотр информации о способности приспешников.
sm_mt_nullify - Просмотр информации о способности обнуления.
sm_mt_omni - Просмотр информации о омниспособности.
sm_mt_panic - Просмотр информации о способности орды.
sm_mt_puke - Просмотр информации о способности рвоты.
sm_mt_pyro - Просмотр информации о способности поджигателя.
sm_mt_quiet - Просмотр информации о способности скрытности.
sm_mt_recall - Просмотр информации о способности телепортации.
sm_mt_recoil - Просмотр информации о способности отдачи.
sm_mt_regen - Просмотр информации о способности регенерации.
sm_mt_respawn - Просмотр информации о способности возрождения.
sm_mt_restart - Просмотр информации о способности перезапуска.
sm_mt_rock - Просмотр информации о способности камнепада.
sm_mt_shield - Просмотр информации о способности щит.
sm_mt_shove - Просмотр информации о способности толчка.
sm_mt_slow - Просмотр информации о способности замедления.
sm_mt_smash - Просмотр информации о способности сокрушения.
sm_mt_throw - Просмотр информации о способности метания.
sm_mt_track - Просмотр информации о способности самонаведения.
sm_mt_ultimate - Просмотр информации о способности «Ультимэйт».
sm_mt_undead - Просмотр информации о способности нежити.
sm_mt_vision - Просмотр информации о способности видимости.
sm_mt_warp - Просмотр информации о способности искривления.
sm_mt_whirl - Просмотр информации о способности вихря.
sm_mt_witch - Просмотр информации о способности ведьмы.
sm_mt_yell - Просмотр информации о способности крика.

Настройка переменных

Нажмите, чтобы расширить!
// Автоматически обновлять Танки-мутанты.
// Требуется "Updater": https://github.com/Teamkiller324/Updater
// 0: ВЫКЛЮЧЕНЫ
// 1: ВКЛЮЧЕНЫ
// -
// По умолчанию: "1"
// Минимум: "0.000000"
// Максимум: "1.000000"
mt_autoupdate "0"

// Имя файла конфигурации, из которого плагин считывает настройки.
// Пусто: нет
// Не пусто: Имя файла пользовательской конфигурации для использования.
// -
// По умолчанию: "mutant_tanks.cfg"
mt_configfile "mutant_tanks.cfg"

// Отключить Танков-мутантов в этих режимах игры.
// Через запятую.
// Пусто: Нет
// Не пусто: Отключено только в этих режимах игры.
// -
// По умолчанию: ""
mt_disabledgamemodes ""

// Включить Танков-мутантов в этих режимах игры.
// Через запятую.
// Пусто: Все
// Не пусто: Включить только в этих режимах игры.
// -
// По умолчанию: ""
mt_enabledgamemodes ""

// Включить Танков-мутантов в этих типах режима игры.
// 0 ИЛИ 15: Все типы игровых режимов.
// 1: Только в режиме совместной игры.
// 2: Только в режиме сражения.
// 4: Только в режиме выживания.
// 8: Только в режиме сбор. (Доступно только в Left 4 Dead 2.)
// -
// По умолчанию: "0"
// Минимум: "0.000000"
// Максимум: "15.000000"
mt_gamemodetypes "0"

// Устанавливает уровень графики плагина для повышения производительности сервера.
// 0: ВЫКЛЮЧЕНЫ
// 1: Низкий
// 2: Середина
// 3: Высокий
// -
// По умолчанию: "3"
// Минимум: "0.000000"
// Максимум: "3.000000"
mt_graphicslevel "3"

// Включить Танков-мутантов на локальных серверах.
// 0: ВЫКЛЮЧЕНЫ
// 1: ВКЛЮЧЕНЫ
// -
// По умолчанию: "0"
// Минимум: "0.000000"
// Максимум: "1.000000"
mt_listensupport "0"

// Включить Танки-мутанты.
// 0: ВЫКЛЮЧЕНЫ
// 1: ВКЛЮЧЕНЫ
// -
// По умолчанию: "1"
// Минимум: "0.000000"
// Максимум: "1.000000"
mt_pluginenabled "1"

Настройки KeyValues

Просмотрите файл INFORMATION.md для получения информации о каждой доступной настройке. (Более 1,500 вариантов для настройки!)

Установка

Нажмите, чтобы расширить!
  1. Удалите файлы из старых версий плагина.
  2. Распакуйте папку внутри файла mutant_tanks.zip.
  3. Поместите всё содержимое в соответствующие папки.
  4. Если будет предложено заменить или объединить что-либо, нажмите Да.
  5. Загрузите плагин, перезапустив сервер.
  6. Настройте плагин в addons/sourcemod/data/mutant_tanks/mutant_tanks.cfg

Компилирование

Нажмите, чтобы расширить!
  1. Убедитесь, что все исходные файлы плагина способностей находятся в соответствующих папках.
  • scripting/mutant_tanks/abilities
  • scripting/mutant_tanks/abilities2
  1. Чтобы отключить/исключить одну или несколько способностей, переместите файл(-ы) в одну из соответствующих папок:
  • scripting/mutant_tanks/abilities/disabled
  • scripting/mutant_tanks/abilities2/disabled
  1. Переместите следующие файлы из папки scripting/mutant_tanks в папку scripting:
  • mutant_tanks.sp
  • mt_abilities.sp
  • mt_abilities2.sp
  1. Перетащите файлы в compile.exe (все сразу) или spcomp.exe (один за другим).
  • Если compile.exe используется, плагины будут созданы внутри папки scripting/compiled.
  • Если spcomp.exe используется, плагины будут созданы внутри папки scripting.
  1. Переместите плагины в папку plugins/mutant_tanks.
  • Если папки mutant_tanks нет в папке plugins, создавать один.

Удаление/обновление до более новых версий

Нажмите, чтобы расширить!
  1. Удалите папку mutant_tanks из папки:
  • addons/sourcemod/plugins (mutant_tanks.smx и все его модули)
  • addons/sourcemod/scripting (mutant_tanks.sp и все его модули)
  1. Удалите mutant_tanks.txt из папки addons/sourcemod/gamedata.
  2. Удалите mutant_tanks.inc и mt_clone.inc из папки addons/sourcemod/scripting/include.
  3. Удалите mutant_tanks.phrases.txt из:
  • папки addons/sourcemod/translations
  • папки addons/sourcemod/translations/chi
  • папки addons/sourcemod/translations/hu
  • папки addons/sourcemod/translations/ru
  1. Создайте копию mutant_tanks.cfg в addons/sourcemod/data/mutant_tanks.
  2. Удалите mutant_tanks_detours.cfg из папки addons/sourcemod/data/mutant_tanks.
  3. Удалите mutant_tanks_patches.cfg из папки addons/sourcemod/data/mutant_tanks.
  4. Удалите mutant_tanks_signatures.cfg из папки addons/sourcemod/data/mutant_tanks.
  5. Удалите mutant_tanks_updater.txt из папки addons/sourcemod.
  6. Следуйте руководству по установке выше. (Только для обновление до более новых версий.)

Отключение

Нажмите, чтобы расширить!
  1. Переместите папку mutant_tanks (mutant_tanks.smx и все его модули) в папку plugins/disabled.
  2. Отключите плагин, перезапустив сервер. (Используя sm plugins unload займёт слишком много времени.)

Пользовательские файлы конфигурации

Танки-мутанты имеет функции, позволяющие создавать и выполнять собственные файлы конфигурации.

Нажмите, чтобы расширить!

По умолчанию Танки-мутанты может создавать и выполнять следующие типы конфигураций:

  1. Сложность - файлы создаются/выполняются в зависимости от текущей сложности игры. (Пример: если для текущего параметра z_difficulty установлено значение Impossible (экспертный режим), то выполняется Impossible.cfg (или создаётся, если он ещё не существует).
  2. Карта - файлы создаются/выполняются на основе текущей карты. (Пример: если текущая карта - c1m1_hotel, то выполняется c1m1_hotel.cfg (или создёется, если он ещё не существует).
  3. Игровой режим - файлы создаются/запускаются на основе текущего игрового режима. (Пример: если текущий режим игры - Versus (сражение), то выполняется versus.cfg (или создаётся, если он ещё не существует).
  4. Ежедневно - файлы создаются/выполняются в зависимости от текущего дня. (Пример: если текущий день пятница, то выполняется friday.cfg (или создаётся, если он ещё не существует).
  5. Количество игроков (выживших/заражённых/всех) - файлы создаются/выполняются на основе текущего количества игроков. (Пример: если текущее число 8, то выполняется 8.cfg (или создаётся, если он ещё не существует).
  6. Финальные этапы - файлы создаются/исполняются на основе финальных этапов, называемых игрой(спасение и т.п.). (Пример: если начинается финальный этап, то выполняется finale_start.cfg (или создаётся, если он ещё не существует)).

Особенности

Нажмите, чтобы расширить!
  1. Создавайте собственные файлы конфигурации (могут зависеть от сложности, карты, игрового режима, дня, количества игроков (выживших/заражённых/всех) или финальной стадии).
  2. Выполнение пользовательских файлов конфигурации (может зависеть от сложности, карты, режима игры, дня, количества игроков (выживших/заражённых/всех) или финальной стадии).
  3. Автоматическая генерация файла конфигурации для 66 игроков, все сложности, указанные в z_difficulty, карты, установленные на сервере, режимы игры, указанные в параметрах sv_gametypes и mp_gamemode, week и все возможные finale stages.

Вопросы, которые могут возникнуть

Если у вас есть какие-либо вопросы, которые не рассмотрены ниже, не стесняйтесь писать мне или оставлять сообщения в этом обсуждении. Прочтите файл INFORMATION.md, чтобы узнать обо всех доступных настройках/функциях. Посетите вики для получения дополнительной информации, включая примеры и руководство.

Основные особенности

Нажмите, чтобы расширить!
Вопрос 1
  1. Как создать собственного танка-мутанта?
  • Создайте запись.
Примеры
Этот будет работать
"Mutant Tanks"
{
	"Tank #25"
	{
		"General"
		{
			"Tank Name"				"Тестовый танк" // Имя танка.
			"Tank Enabled"				"1" // Танк включен.
			"Tank Chance"				"100.0" // Танк имеет 100% шанс появления.
			"Spawn Enabled"				"1" // Танк может возродиться.
			"Menu Enabled"				"1" // Танка можно создать с помощью команды "sm_tank".
			"Skin Color"				"255,0,0,255" // У танка красный облик.
			"Glow Color"				"255,255,0" // Танк имеет жёлтый светящийся контур.
		}
	}
}
Этот не будет работать
"Mutant Tanks"
{
	"Tank #25"
	{
		"General"
		{
			// "Tank Enabled" отсутствует, поэтому эта запись отключена.
			"Tank Name"				"Тестовый танк" // Имя танка.
			"Tank Chance"				"47.0" // Танк имеет 47% шанс появления.
			"Spawn Enabled"				"1" // Танк может возродиться.
			"Menu Enabled"				"1" // Танка можно создать с помощью команды "sm_tank".
			"Skin Color"				"255,0,0,255" // У танка красный облик.
			"Glow Color"				"255,255,0" // Танк имеет жёлтый светящийся контур.
		}
	}
}
Этот будет работать
"Mutant Tanks"
{
	"Tank #25"
	{
		"General"
		{
			// Поскольку "Tank Name" отсутствует, по умолчанию для этой записи будет использоваться имя "Танк".
			"Tank Enabled"				"1" // Танк включен.
			"Tank Chance"				"12.3" // Танк имеет 12.3% шанс появления.
			"Spawn Enabled"				"1" // Танк может возродиться.
			"Menu Enabled"				"1" // Танка можно создать с помощью команды "sm_tank".
			"Skin Color"				"255,0,0,255" // У танка красный облик.
			"Glow Color"				"255,255,0" // Танк имеет жёлтый светящийся контур.
		}
	}
}
Этот не будет работать
"Mutant Tanks"
{
	"Tank #25"
	{
		"General"
		{
			"Tank Name"				"Тестовый танк" // Имя танка.
			"Tank Enabled"				"1" // Танк включен.
			"Tank Chance"				"59.0" // Танк имеет 59% шанс появления.
			"Spawn Enabled"				"1" // Танк может возродиться.
			"Menu Enabled"				"1" // Танка можно создать с помощью команды "sm_tank".
			"Skin Color"				"255 0 0 255" // Значения следует разделять запятыми, а не пробелами.
			"Glow Color"				"255 255 0" // Значения следует разделять запятыми, а не пробелами.
		}
	}
}
- Добавление записи в реестр.

Вот наша последняя запись:

Нажмите, чтобы расширить!
"Mutant Tanks"
{
	"Tank #25"
	{
		"General"
		{
			"Tank Name"				"Тестовый танк" // Назван "Тестовый танк".
			"Tank Enabled"				"1" // Запись разрешена.
			"Tank Chance"				"9.5" // Танк имеет 9.5% шанс появления.
			"Spawn Enabled"				"1" // Танк может возродиться.
			"Menu Enabled"				"1" // Танка можно создать с помощью команды "sm_tank".
			"Skin Color"				"255,0,0,255" // У танка красный облик.
			"Glow Color"				"255,255,0" // Танк имеет жёлтый светящийся контур.
		}
		"Immunities"
		{
			"Fire Immunity"				"1" // Невосприимчив к огню.
		}
	}
}

Чтобы убедиться, что эта запись может быть выбрана, мы должны изменить значение в настройке Type Range.

Нажмите, чтобы расширить!
"Mutant Tanks"
{
	"Plugin Settings"
	{
		"General"
		{
			"Type Range"				"1-14" // Определяет, с какой записи начинать и останавливаться при чтении всего файла конфигурации.
		}
	}
}

Теперь, предполагая, что Tank #15 - наша самая конечная запись, мы просто увеличиваем максимальное значение Type Range на 1, так что мы получаем 15 записей на выбор. Как только плагин начнет читать файл конфигурации, когда он дойдет до Tank #15, он перестанет читать остальные.

Расширенные примеры записи
"Mutant Tanks"
{
	"Plugin Settings"
	{
		"General"
		{
			"Type Range"				"1-10" // От "Tank #1" до "Tank #10"
		}
	}
	"Tank #10" // Проверено плагином.
	{
		"General"
		{
			"Tank Name"				"Прыгающий танк"
			"Tank Enabled"				"1"
			"Tank Chance"				"75.2"
			"Spawn Enabled"				"1"
			"Menu Enabled"				"1"
			"Skin Color"				"255,255,0,255"
			"Glow Color"				"255,255,0"
		}
		"Enhancements"
		{
			"Extra Health"				"50" // Базовое здоровье танка + 50
		}
		"Jump Ability"
		{
			"Ability Enabled"			"2" // Танк периодически прыгает.
			"Ability Message"			"3" // Уведомлять игроков, когда танк периодически прыгает.
			"Jump Height"				"300.0" // Насколько высоко от земли может прыгнуть танк.
			"Jump Interval"				"1.0" // Как часто танк прыгает.
			"Jump Mode"				"0" // Метод прыжков танка.
		}
	}
}
"Mutant Tanks"
{
	"Plugin Settings"
	{
		"General"
		{
			"Type Range"				"1-11" // Проверяnm только первые 11 типов Танков. ("Tank #1" до "Tank #11")
		}
	}
	"Tank #13" // Этот не будет проверяться плагином.
	{
		"General"
		{
			"Tank Name"				"Невидимый танк"
			"Tank Enabled"				"1"
			"Tank Chance"				"38.2"
			"Spawn Enabled"				"1"
			"Menu Enabled"				"1"
			"Skin Color"				"255,255,255,255"
			"Glow Color"				"255,255,255"
			"Glow Enabled"				"0" // Нет светящегося контура.
		}
		"Immunities"
		{
			"Fire Immunity"				"1" // Невосприимчив к огню.
		}
		"Ghost Ability"
		{
			"Ability Enabled"			"2"
			"Ghost Fade Alpha"			"2"
			"Ghost Fade Delay"			"5.0"
			"Ghost Fade Limit"			"0"
			"Ghost Fade Rate"			"0.1"
		}
	}
	"Tank #10" // Проверено плагином.
	{
		"General"
		{
			"Tank Enabled"				"1"
		}
		"Enhancements"
		{
			"Run Speed"				"1.5" // Как быстро движется танк.
		}
	}
}
Вопрос 2
  1. Можете ли вы добавить больше способностей или функций?
  • Танки-мутанты уже использует много файлов, так что нет места для новых способностей или функций в версии v8.80.
Вопрос 3
  1. Как включить/отключить плагин в определённых режимах игры?

У вас есть 2 варианта:

  • Включение/отключение в определённых типах игровых режимов. (Вы должны сложить числа в Game Mode Types.)
  • Включение/отключение в определённых игровых режимах. (Вы должны указать режимы игры в Enabled Game Modes и Disabled Game Modes.)

Вот несколько сценариев и их результаты:

Сценарий 1
"Game Mode Types" "0" // Плагин включен во всех типах игровых режимов.
"Enabled Game Modes" "" // Плагин включен во всех режимах игры.
"Disabled Game Modes" "coop" // Плагин отключен в режиме "совместной игры".

Результат: Плагин работает во всех режимах игры, кроме режима "совместной игры".
Сценарий 2
"Game Mode Types" "1" // Плагин доступен во всех режимах игры на основе кампании.
"Enabled Game Modes" "coop" // Плагин работает только в режиме "совместной игры".
"Disabled Game Modes" "" // Плагин не отключается ни в одном игровом режиме.

Результат: Плагин работает только в режиме "совместной игры".
Сценарий 3
"Game Mode Types" "5" // Плагин доступен во всех режимах игры на основе кампании и выживания.
"Enabled Game Modes" "coop,versus" // Плагин работает только в режиме "совместной игры" и "сражение".
"Disabled Game Modes" "coop" // Плагин отключен в режиме "совместной игры".

Результат: Плагин работает только в режиме "совместной игры".
Вопрос 4
  1. Почему некоторые Танки-мутанты не появляются?

Это может быть связано с одной или несколькими из следующих причин:

  • Параметр Tank Enabled для этого танка-мутанта установлен на 0 или вообще не существует, по умолчанию 0.
  • Параметр Spawn Enabled для этого танка-мутанта установлен на 0.
  • Вы создали нового танка-мутанта и не повысили максимальное значение параметра Type Range.
  • Вы неправильно написали одну из настроек.
  • Вы всё ещё используете настройку Tank Character, которая больше не используется с версии v8.16.
  • Вы неправильно настроили плагин.
  • Вам не хватает кавычек.
  • Вам не хватает фигурных скобок.
  • В вашем файле конфигурации более 500 Танков-мутантов.
  • Вы неправильно отформатировали файл конфигурации.
  • Танки-мутанты требуют X выживших, контролируемых людьми, и их нет.
  • Танк-мутант должен находиться на открытой местности, чтобы появиться, и в настоящее время он находится в узком месте.
  • Количество живых Танков-мутантов того же типа достигло или превысило лимит, установленный параметром Type Limit.
  • Танк-мутант может появиться только на обычных картах.
  • Танк-мутант может появиться только на финальных картах.
Вопрос 5
  1. Как убить Танков в зависимости от того, какими способностями они обладают?

Следующие способности требуют разных стратегий:

  • Поглощающая способность: Танк-мутант получает намного меньше урона. Сохраняйте боеприпасы и сохраняйте дистанцию между вами и танком-мутантом.
  • Способность бога: Танк-мутант временно будет иметь режим бога и не получит никакого урона, пока эффект не закончится. Сохраняйте дистанцию между вами и танком-мутантом.
  • Иммунитет к пулям: Забудьте о своём огнестрельном оружии. Просто спамьте по нему из гранатомета, порежьте его топором или ломом или сожгите до смерти.
  • Иммунитет к взрывам: Забудьте о взрывчатке и просто сосредоточьтесь на стрельбе, холодном оружии и молотовых/газовых канистрах.
  • Иммунитет к огню: Больше никаких танков, приготовленных на гриле. Просто продолжай стрелять
  • Иммунитет к урону в ближнем бою: Больше никаких игроков-Гордонов Фрименов (иммунитет к холодному оружию, включая лом).
  • Аннулированное попадание: Танк-мутант может отмечать игроков в качестве бесполезных, что означает, что пока этот игрок аннулирован, он не будет наносить никакого урона.
  • Способность щит: Если установлена слабость к взрывчатке, дождитесь, пока танк бросит в вас баллоны с пропаном, а затем бросьте его обратно в танка. Затем выстрелите в баллон с пропаном, чтобы отключить щит танка. Если установлена слабость к огню, дождитесь, пока танк бросит в вас канистры с бензином, а затем бросьте его обратно в танка. Затем выстрелите в канистру, чтобы отключить щит танка. Если установлена слабость к пулям, просто продолжайте стрелять по танку. Если установлена слабость к ударам в ближнем бою, просто продолжайте рубить танка.

Посетите вики для получения дополнительной информации о сильных и слабых сторонах каждой способности.

Вопрос 6
  1. Как я могу изменить количество Танков, которые появляются на каждой финальной волне?

Вот пример:

"Finale Waves" "1,2,3,4,5,6,7,8,9,10" // Создать 2 танка на 1 волне, 3 танка на 2 волне, 4 танка на 3 волне и т.д.
Вопрос 7
  1. Как я могу изменить количество Танков, которые могут появляться на финальных картах?

Установите значение в Finale Amount.

Вопрос 8
  1. Как я могу решить, нужно ли отображать здоровье каждого танка?

Установите значение в Display Health.

Вопрос 9
  1. Почему у некоторых Танков появляются разные объекты?

У каждого объекта есть X шанс из 100.0% появиться на танках-мутантах при их появлении. Настройте шансы для каждого объекта в настройке Props Chance.

Вопрос 10
  1. Почему появляются Танки с большим запасом здоровья, чем положено им?

Начиная с версии v8.10, дополнительное здоровье, данное Танкам, теперь умножается на количество живых, не бездействующих выживших людей, присутствующих при появлении танка.

Вопрос 11
  1. Как добавить больше Танков-мутантов?
  • Добавьте новую запись в файл конфигурации.
  • Увеличьте максимальное значение параметра Type Range.
Пример
"Mutant Tanks"
{
	"Plugin Settings"
	{
		"General"
		{
			"Type Range"				"1-2" // Плагин проверит 2 записей при загрузке файла конфигурации.
		}
	}
	"Tank #2"
	{
		"General"
		{
			"Tank Enabled"				"1" // Tank #2 включен и может быть выбран.
		}
	}
}
Вопрос 12
  1. Как мне отфильтровать определённых Танков-мутантов, которые я сделал, не удаляя их?

Включите/отключите их с помощью настройки Tank Enabled.

Пример
"Mutant Tanks"
{
	"Tank #1"
	{
		"General"
		{
			"Tank Enabled"				"1" // Tank #1 можно выбрать.
			"Tank Chance"				"100.0" // Tank #1 имеет шанс появиться.
		}
	}
	"Tank #2"
	{
		"General"
		{
			"Tank Enabled"				"0" // Tank #2 нельзя выбрать.
			"Tank Chance"				"0.0" // Tank #2 не имеет шанса появиться, но всё ещё может быть вызван через меню.
		}
	}
	"Tank #3"
	{
		"General"
		{
			"Tank Enabled"				"0" // Tank #3 нельзя выбрать.
			"Tank Chance"				"0.0" // Tank #3 не имеет шанса появиться, но всё ещё может быть вызван через меню.
		}
	}
	"Tank #4"
	{
		"General"
		{
			"Tank Enabled"				"1" // Tank #4 можно выбрать.
			"Tank Chance"				"100.0" // Tank #4 имеет шанс появиться.
		}
	}
}
Вопрос 13
  1. Могу ли я создавать временных Танков, не удаляя и не заменяя их?

Да, вы можете сделать это с помощью пользовательских конфигураций.

Пример
// Настройки для addons/sourcemod/data/mutant_tanks/mutant_tanks.cfg
"Mutant Tanks"
{
	"Plugin Settings"
	{
		"Custom"
		{
			"Enable Custom Configs"			"1" // Включить пользовательские конфигурации
			"Execute Config Types"			"1" // 1: Конфигурация сложности (легко, нормально, сложно, невозможно)
		}
	}
	"Tank #1"
	{
		"General"
		{
			"Tank Name"				"Танк «Psyk0tik»"
			"Tank Enabled"				"1"
			"Tank Chance"				"2.53"
			"Spawn Enabled"				"1"
			"Menu Enabled"				"1"
			"Skin Color"				"0,170,255,255"
			"Glow Color"				"0,170,255"
		}
		"Enhancements"
		{
			"Extra Health"				"250"
		}
		"Immunities"
		{
			"Fire Immunity"				"1"
		}
	}
}

// Настройки для addons/sourcemod/data/mutant_tanks/difficulty_configs/Impossible.cfg
"Mutant Tanks"
{
	"Tank #1"
	{
		"General"
		{
			"Tank Name"				"Танк-идиот"
			"Tank Enabled"				"1"
			"Tank Chance"				"1.0"
			"Spawn Enabled"				"1"
			"Menu Enabled"				"1"
			"Skin Color"				"1,1,1,255"
			"Glow Color"				"1,1,1"
		}
		"Enhancements"
		{
			"Extra Health"				"1"
		}
		"Immunities"
		{
			"Fire Immunity"				"0"
		}
	}
}

Результат: Когда текущая сложность - экспертный режим (невозможно), танк-идиот будет появляться вместо "Танка «Psyk0tik»", пока используются эта пользовательская конфигурация.

В основном это временные танки, которые вы можете создать для определённых ситуаций, например, если на сервере 5 игроков, карта - c1m1_hotel, или даже если день недели четверг и т.д.
Вопрос 14
  1. Как мне переместить категорию Танков-мутантов в меню администратора?
  • Вы должны открыть addons/sourcemod/configs/adminmenu_sorting.txt и добавить категорию MutantTanks.
  • Это также позволит вам сортировать каждый элемент в категории.
Пример
"Menu"
{
	"PlayerCommands"
	{
		"item"		"sm_slay"
		"item"		"sm_slap"
		"item"		"sm_kick"
		"item"		"sm_ban"
		"item"		"sm_gag"
		"item"		"sm_burn"
		"item"		"sm_beacon"
		"item"		"sm_freeze"
		"item"		"sm_timebomb"
		"item"		"sm_firebomb"
		"item"		"sm_freezebomb"
	}

	"ServerCommands"
	{
		"item"		"sm_map"
		"item"		"sm_execcfg"
		"item"		"sm_reloadadmins"
	}

	"VotingCommands"
	{
		"item"		"sm_cancelvote"
		"item"		"sm_votemap"
		"item"		"sm_votekick"
		"item"		"sm_voteban"
	}

	"MutantTanks"
	{
		"item"		"sm_mt_tank"
		"item"		"sm_mt_smoker"
		"item"		"sm_mt_boomer"
		"item"		"sm_mt_hunter"
		"item"		"sm_mt_spitter"
		"item"		"sm_mt_jockey"
		"item"		"sm_mt_charger"
		"item"		"sm_mt_config"
		"item"		"sm_mt_info"
		"item"		"sm_mt_list"
		"item"		"sm_mt_reload"
		"item"		"sm_mt_version"
	}
}
Вопрос 15
  1. Как я могу отключить категорию MutantTanks для некоторых админов?

Вы можете использовать переопределение mt_adminmenu, чтобы ограничить категорию определёнными флагами/группами администратора.

Вопрос 16
  1. Доступны ли в плагине какие-либо функции разработчика/тестировщика?

Да, есть forward'ы, native'ы, stock'и, целевые фильтры для каждого особого заражённого и команда администратора, которая позволяет разработчикам/тестерам создавать и тестировать каждого танка-мутанта.

Forward'ы
/**
 * Вызывается каждую секунду для активации способности танка-мутанта.
 * Используйте этот forward для любых пассивных способностей.
 *
 * @param tank			Клиентский индекс танка.
 **/
forward void MT_OnAbilityActivated(int tank);

/**
 * Вызывается перед чтением файла конфигурации.
 * Используйте этот forward для хранения различных форматов имени раздела способности.
 *
 * @param list			Список для хранения первого формата.
 * @param list2			Список для хранения второго формата.
 * @param list3			Список для хранения третьего формата.
 * @param list4			Список для хранения четвёртого формата.
 **/
forward void MT_OnAbilityCheck(ArrayList list, ArrayList list2, ArrayList list3, ArrayList list4);

/**
 * Вызывается, когда управляемый игроком танк-мутант нажимает кнопку.
 * Используйте этот forward, чтобы активировать способности вручную.
 *
 * @param tank			Клиентский индекс танка.
 * @param button		Нажатая кнопка.
 **/
forward void MT_OnButtonPressed(int tank, int button);

/**
 * Вызывается, когда управляемый игроком танк-мутант отпускает кнопку.
 * Используйте этот forward, чтобы активировать способности вручную.
 *
 * @param tank			Клиентский индекс танка.
 * @param button		Отпущенная кнопка.
 **/
forward void MT_OnButtonReleased(int tank, int button);

/**
 * Вызывается, когда танк-мутант меняет свой тип.
 * Используйте этот forward, чтобы активировать любые функции/способности/настройки, когда танк-мутант меняет свой тип.
 *
 * @param tank			Клиентский индекс танка.
 * @param oldType		Предыдущий тип танка-мутанта.
 * @param newType		Следующий тип танка-мутанта.
 * @param revert		True при возврате к обычному танку, в противном случае - false.
 **/
forward void MT_OnChangeType(int tank, int oldType, int newType, bool revert);

/**
 * Вызывается при объединении способностей танка-мутанта.
 * Используйте этот forward, чтобы вызвать любые комбинации.
 *
 * @param tank			Клиентский индекс танка.
 * @param type			0 = Основные/дальнобойные способности, 1 = Способности удара, 2 = Способности броска камня, 3 = Способности разбивания камня,
 * 					4 = Способности после возрождения, 5 = Способности после смерти, 6 = Способности после выхода из строя
 * @param random		Случайное значение для проверки на шанс срабатывания комбинации.
 * @param combo			Строка, содержащая список способностей для объединения.
 * @param survivor		Клиентский индекс выжившего, если таковой имеется.
 * @param weapon		Индекс энтити оружия, если таковой имеется.
 * @param classname		Строка, содержащая имя класса оружия, если есть.
 **/
forward void MT_OnCombineAbilities(int tank, int type, const float random, const char[] combo, int survivor, int weapon, const char[] classname);

/**
 * Вызывается, когда файл конфигурации загружается.
 * Используйте этот forward, чтобы установить значения по умолчанию для настроек плагина.
 *
 * @param mode			1 = Загрузить общие настройки, 2 = 1 + настройки типа нагрузки, 3 = Загрузить настройки администратора
 **/
forward void MT_OnConfigsLoad(int mode);

/**
 * Вызывается при загрузке файла конфигурации.
 * Используйте этот forward для загрузки настроек плагина.
 *
 * @param subsection		Подраздел, в котором работает анализатор конфигурации.
 * @param key			Ключ, на котором в настоящее время работает анализатор конфигурации.
 * @param value			Значение, которое анализатор конфигурации использует в настоящее время.
 * @param type			Тип танка-мутанта, на котором сейчас работает анализатор конфигурации. (Используется для специфических настроек Танков-мутантов.)
 * @param admin			Клиентский индекс админа. (Используется для настроек, специфичных для администратора.)
 * @param mode			1 = Загрузить общие настройки, 2 = 1 + настройки типа нагрузки, 3 = Загрузить настройки администратора
 * @param special		True при чтении настройки особого заражённого, иначе - false.
 * @param specsection		Специальный раздел, на котором в данный момент находится анализатор конфигурации.
 * @param specType		Тип особого заражённого.
 **/
forward void MT_OnConfigsLoaded(const char[] subsection, const char[] key, const char[] value, int type, int admin, int mode, bool special, const char[] specsection, int specType);

/**
 * Вызывается, когда танк передаётся другому игроку или боту.
 * Используйте этот forward, чтобы скопировать любую статистику нового владельца танка.
 *
 * @param oldTank		Клиентский индекс предыдущего владельца.
 * @param newTank		Клиентский индекс нового владельца.
 **/
forward void MT_OnCopyStats(int oldTank, int newTank);

/**
 * Вызывается, когда игрок использует команду "sm_st_info".
 * Используйте этот forward, чтобы добавить пункты меню.
 *
 * @param menu			Добавить в меню.
 **/
forward void MT_OnDisplayMenu(Menu menu);

/**
 * Вызывается при срабатывании события, перехваченного основным плагином.
 * Используйте этот forward, чтобы вызвать что-то при любом из этих событий.
 *
 * @param event			Добавить в событие.
 * @param name			Строка, содержащая название события.
 * @param dontBroadcast		True, если событие не транслировалось клиентам, иначе - false.
 **/
forward void MT_OnEventFired(Event event, const char[] name, bool dontBroadcast);

/**
 * Вызывается, когда выживший падает в смертельной зоне.
 * Используйте этот forward, чтобы проверить, есть ли на текущей карте камеры смертельного падения (выведения из строя).
 *
 * @param survivor		Клиентский индекс выжившего.
 *
 * @return			Plugin_Handled, чтобы предотвратить срабатывание камеры смертельного падения, Plugin_Continue, чтобы разрешить.
 **/
forward Action MT_OnFatalFalling(int survivor);

/**
 * Вызывается, когда основной плагин подключает/отключает события.
 * Используйте этот forward, чтобы перехватить/отцепить события
 *
 * @param hooked		True, если событие было перехвачено, иначе - false.
 **/
forward void MT_OnHookEvent(bool hooked);

/**
 * Вызывается, когда сообщение будет записано в журнал.
 * Используйте этот forward, чтобы перехватить сообщение.
 *
 * @param type			Тип регистрируемого сообщения.
 * @param message		Буфер, содержащий сообщение.
 *
 * @return			Plugin_Handled, чтобы сообщение не регистрировалось, Plugin_Continue, чтобы разрешить.
 **/
forward Action MT_OnLogMessage(int type, const char[] message);

/**
 * Вызывается, когда отображается элемент из меню "Mutant Tanks Information".
 * Используйте этот forward, чтобы перевести элемент. Обратный вызов меню перерисовывает элемент после вызова этого forward'а, если буфер не пуст.
 *
 * @param client		Клиентский индекс игрока, которому отображается элемент.
 * @param info			Строка, содержащая имя элемента.
 * @param buffer		Строка для хранения переведённого элемента.
 * @param size			Размер буфера.
 **/
forward void MT_OnMenuItemDisplayed(int client, const char[] info, char[] buffer, int size);

/**
 * Вызывается, когда игрок выбирает элемент в меню "Mutant Tanks Information".
 * Используйте этот forward, чтобы делать что-либо, когда элемент выбран.
 *
 * @param client		Клиентский индекс игрока, выбирающего элемент.
 * @param info			Строка, содержащая имя элемента.
 **/
forward void MT_OnMenuItemSelected(int client, const char[] info);

/**
 * Вызывается прямо перед смертью игрока.
 * Используйте это forward, чтобы сделать что-нибудь, прежде чем игрок умрёт.
 *
 * @param victim		Клиентский индекс умирающего игрока.
 * @param attacker		Клиентский индекс убийцы.
 **/
forward void MT_OnPlayerEventKilled(int victim, int attacker);

/**
 * Вызывается непосредственно перед попаданием в игрока желчной бомбы (баночки с рвотой).
 * Используйте это forward, чтобы сделать что-нибудь, прежде чем в игрока попадёт эта банка.
 *
 * @param player		Клиентский индекс поражённого игрока.
 * @param thrower		Клиентский индекс выжившего, который бросил желчную бомбу (банку с рвотой).
 *
 * @return			Plugin_Handled, чтобы предотвратить попадание в игрока, Plugin_Continue, чтобы разрешить.
 **/
forward Action MT_OnPlayerHitByVomitJar(int player, int thrower);

/**
 * Вызывается прямо перед тем, как выживший толкнёт игрока.
 * Используйте этот forward, чтобы сделать что-нибудь до того, как игрока толкнёт.
 * Примечание: L4D2 вызывает это только для особых заражённых.
 *
 * @param player		Клиентский индекс игрока.
 * @param survivor		Клиентский индекс выжившего.
 * @param direction		Направление толчка.
 *
 * @return			Plugin_Handled, чтобы игрока не толкало, Plugin_Continue, чтобы разрешить.
 **/
forward Action MT_OnPlayerShovedBySurvivor(int player, int survivor, const float direction[3]);

/**
 * Вызывается перед чтением файла конфигурации.
 * Используйте этот forward, чтобы официально зарегистрировать плагин способности.
 *
 * @param list			Список для хранения названий.
 **/
forward void MT_OnPluginCheck(ArrayList list);

/**
 * Вызывается при выгрузке основного плагина.
 * Используйте этот forward, чтобы удалить любых модификаций танков или выживших.
 **/
forward void MT_OnPluginEnd();

/**
 * Вызывается при обновлен основного плагина.
 * Используйте этот forward, чтобы перезагрузка способностей.
 * Требуется "Updater": https://github.com/Teamkiller324/Updater
 **/
forward void MT_OnPluginUpdate();

/**
 * Вызывается после появления танка-мутанта.
 * Используйте этот forward для любых действий после появления.
 * Если вы планируете использовать это для активации способности, используйте вместо этого MT_OnAbilityActivated().
 *
 * @param tank			Клиентский индекс танка.
 **/
forward void MT_OnPostTankSpawn(int tank);

/**
 * Вызывается при сбросе таймера.
 * Используйте этот forward для сброса повторяющихся таймеров, которые используют интервалы, установленные в файлах конфигурации.
 *
 * @param mode			0 = Индекс клиента не требуется, 1 = Требуется индекс клиента
 * @param tank			Клиентский индекс танка.
 **/
forward void MT_OnResetTimers(int mode, int tank);

/**
 * Вызывается, когда выживший получает награду или его награда заканчивается.
 * Используйте этот forward, чтобы дать награду выжившим или сбросить их награды.
 *
 * @param survivor		Клиентский индекс выжившего.
 * @param tank			Клиентский индекс танка.
 * @param type			1 = Здоровье, 2 = Усилитель урона, 4 = Скорость, 8 = Боеприпасы, 16 = Предмет, 32 = Режим бога, 64 = Пополнение здоровья и боеприпасов, 128 = Возрождение,
 * 					255 = Все восемь награды, 256-2147483647 = Зарезервировано для сторонних плагинов
 * @param priority		0 = Убийца, 1 = Помощник в убийстве, который причинил наибольший ущерб, 2 = Товарищ по команде, который помог, 3 = Убийца, который причинил наибольший ущерб
 * @param duration		Срок действия награды.
 * @param apply			True, если награда дана, в противном случае - false.
 *
 * @return			Plugin_Handled, чтобы предотвратить выдачу или прекращение вознаграждения, Plugin_Continue, чтобы разрешить.
 **/
forward Action MT_OnRewardSurvivor(int survivor, int tank, int &type, int priority, float &duration, bool apply);

/**
 * Вызывается, когда камень танка-мутанта ломается.
 * Используйте этот forward для любых последствий.
 *
 * @param tank			Клиентский индекс танка.
 * @param rock			Индекс энтити камня.
 **/
forward void MT_OnRockBreak(int tank, int rock);

/**
 * Вызывается, когда танк-мутант бросает камень.
 * Используйте этот forward для любых метательных способностей.
 *
 * @param tank			Клиентский индекс танка.
 * @param rock			Индекс энтити камня.
 **/
forward void MT_OnRockThrow(int tank, int rock);

/**
 * Вызывается, когда все настройки в кэше.
 * Используйте этот forward, чтобы кэшировать настройки для каждого игрока.
 *
 * @param tank			Клиентский индекс танка.
 * @param apply			True, если игрок является Танком и имеет доступ к типу танка-мутанта и требует применения настроек, иначе - false.
 * @param type			Тип танка-мутанта, иначе 0.
 **/
forward void MT_OnSettingsCached(int tank, bool apply, int type);

/**
 * Вызывается, когда выжившему дается или отнимается пассивный навык.
 * Используйте этот форвард, чтобы давать или убирать пассивы.
 *
 * @param survivor		Клиентский индекс выжившего.
 * @param type			1 = Здоровье, 2 = Усиление урона, 4 = Ускорение, 8 = Боеприпасы, 16 = Предмет, 32 = Режим бога, 64 = Здоровье и пополнение боеприпасов,
 * 					128 = Возрождение, 255 = Все восемь пассивов, 256-2147483647 = Зарезервировано для сторонних плагинов
 * @param apply			True, если пассив дана, в противном случае - false.
 * @param weaponOnly		True, если пассив дана только оружию, в противном случае - false.
 * @param weaponIndex		Индекс типа оружия.
 *
 * @return			Plugin_Handled, чтобы предотвратить выдачу или прекращение пассивов, Plugin_Continue, чтобы разрешить.
 **/
forward Action MT_OnToggleSurvivorPassive(int survivor, int &type, bool apply, bool weaponOnly, int weaponIndex);

/**
 * Вызывается при выборе типа танка-мутанта.
 * Используйте этот forward, чтобы проверить или изменить выбранный тип.
 *
 * @param type			Выбранный тип.
 * @param tank			Клиентский индекс танка, если выбранный тип применяется напрямую, в противном случае - 0.
 *
 * @return			Plugin_Handled, чтобы выбрать другой тип, Plugin_Stop, чтобы предотвратить мутацию танка,
 * 					Plugin_Changed, чтобы изменить выбранный тип, Plugin_Continue, чтобы разрешить.
 */
forward Action MT_OnTypeChosen(int &type, int tank);
Native'ы
Основной плагин
/**
 * Возвращается, если может появиться определённый тип танка-мутанта.
 *
 * @param type			Тип танка-мутанта.
 * @param specType		Тип особого заражённого.
 *
 * @return			True, если тип может появляться, иначе - false.
 * @error			Тип 0 или меньше.
 **/
native bool MT_CanTypeSpawn(int type, int specType);

/**
 * Оглушает игрока.
 *
 * @param player		Клиентский индекс игрока.
 *
 * @error			Неверный индекс клиента, клиент не в игре, или клиент мёртв.
 **/
native void MT_DeafenPlayer(int player);

/**
 * Взрывает камень танка на следующем кадре.
 *
 * @param rock			Индекс энтити камня.
 *
 * @error			Недействительный индекс энтити.
 **/
native void MT_DetonateTankRock(int rock);

/**
 * Возвращается, если у определённого выжившего активен тип пассивы.
 *
 * @param survivor		Клиентский индекс выжившего.
 * @param type			1 = Здоровье, 2 = Усиление урона, 4 = Ускорение, 8 = Боеприпасы, 16 = Предмет, 32 = Режим бога, 64 = Здоровье и пополнение боеприпасов,
 * 					128 = Возрождение, 255 = Все восемь пассивы, 256-2147483647 = Зарезервировано для сторонних плагинов
 *
 * @return			True, если у выжившего активен тип пассивы, в противном случае - false.
 * @error			Неверный индекс клиента, клиента нет в игре или тип равен 0 или меньше.
 **/
native bool MT_DoesSurvivorHavePassiveType(int survivor, int type);

/**
 * Возвращается, если у определённого выжившего активен тип награды.
 *
 * @param survivor		Клиентский индекс выжившего.
 * @param type			1 = Здоровье, 2 = Усиление урона, 4 = Ускорение, 8 = Боеприпасы, 16 = Предмет, 32 = Режим бога, 64 = Здоровье и пополнение боеприпасов,
 * 					128 = Возрождение, 255 = Все восемь награды, 256-2147483647 = Зарезервировано для сторонних плагинов
 *
 * @return			True, если у выжившего активен тип награды, в противном случае - false.
 * @error			Неверный индекс клиента, клиента нет в игре или тип равен 0 или меньше.
 **/
native bool MT_DoesSurvivorHaveRewardType(int survivor, int type);

/**
 * Возвращается, если для эффективности определённого типа танка-мутанта требуется присутствие выживших, контролируемых игроком.
 *
 * @param type			Тип танка-мутанта.
 * @param tank			Клиентский индекс танка, если выбранный тип применяется напрямую, в противном случае - 0.
 *
 * @return			True, если тип требует присутствия выживших, контролируемых игроком, в противном случае - false.
 * @error			Тип 0 или меньше.
 **/
native bool MT_DoesTypeRequireHumans(int type, int tank);

/**
 * Возвращает текущие флаги доступа, установленные основным плагином.
 *
 * @param mode			1 = Глобальные флаги, 2 = Типовые флаги, 3 = Флаги глобального администратора, 4 = Флаги администратора для конкретных типов
 * @param type			Тип танка-мутанта. (Необязательно)
 * @param admin			Клиентский индекс админа. (Необязательно)
 *
 * @return			Текущие флаги доступа.
 * @error			Неверный индекс клиента, клиент не в игре, клиент - бот или тип 0 или меньше.
 **/
native int MT_GetAccessFlags(int mode, int type = 0, int admin = -1);

/**
 * Возвращает значение настройки комбинации на основе позиции.
 *
 * @param tank			Клиентский индекс танка.
 * @param type			1 = Шанс, 2 = Перезарядка, 3 = Урон, 4 = Задержка, 5 = Продолжительность, 6 = Интервал, 7 = Мин. радиус, 8 = Макс. радиус, 9 = Радиус, 10 = Шанс радиуса,
 * 					11 = Радиус перезарядки, 12 = Радиус смерти, 13 = Шанс радиуса смерти, 14 = Шанс камня, 15 = Перезарядка камня, 16 = Скорость
 * @param pos			Позиция в массиве параметров, из которой нужно получить значение. (0-9)
 *
 * @return			Значение, сохранённое в настройке.
 * @error			Неверный индекс клиента или клиента нет в игре.
 **/
native float MT_GetCombinationSetting(int tank, int type, int pos);

/**
 * Возвращает цвета, установленные в конфигурационном файле.
 *
 * @param buffer		Буфер для хранения цветов.
 * @param size			Размер буфера.
 * @param value			Значение, установленное в конфигурационном файле.
 *
 * @error			Пустое значение или буфер слишком мал.
 **/
native void MT_GetConfigColors(char[] buffer, int size, const char[] value);

/**
 * Возвращает текущую финальную волну.
 *
 * @return			Текущая финальная волна.
 **/
native int MT_GetCurrentFinaleWave();

/**
 * Возвращает диапазон светящегося контура танка-мутанта.
 *
 * @param tank			Клиентский индекс танка.
 * @param mode			True, если ищется максимальный диапазон, в противном случае - false.
 *
 * @return			Диапазон светящегося контура танка.
 * @error			Неверный индекс клиента или клиента нет в игре.
 **/
native int MT_GetGlowRange(int tank, bool mode);

/**
 * Возвращает тип светящегося контура танка-мутанта.
 *
 * @param tank			Клиентский индекс танка.
 *
 * @return			Тип светящегося контура танка.
 * @error			Неверный индекс клиента или клиента нет в игре.
 **/
native int MT_GetGlowType(int tank);

/**
 * Возвращает текущий уровень графики.
 *
 * @return			Текущий уровень графики.
 **/
native int MT_GetGraphicsLevel();

/**
 * Возвращает текущие флаги иммунитета, установленные основным плагином.
 *
 * @param mode			1 = Глобальные флаги, 2 = Типовые флаги, 3 = Флаги глобального администратора, 4 = Флаги администратора для конкретных типов
 * @param type			Тип танка-мутанта. (Необязательно)
 * @param admin			Клиентский индекс админа. (Необязательно)
 *
 * @return			Текущие флаги иммунитета.
 * @error			Неверный индекс клиента, клиент не в игре, клиент - бот или тип 0 или меньше.
 **/
native int MT_GetImmunityFlags(int mode, int type = 0, int admin = -1);

/**
 * Возвращает максимальное значение параметра "Type Range".
 *
 * @return			Максимальное значение параметра "Type Range".
 **/
native int MT_GetMaxType();

/**
 * Возвращает минимальное значение параметра "Type Range".
 *
 * @return			Минимальное значение параметра "Type Range".
 **/
native int MT_GetMinType();

/**
 * Возвращает RGBA цвет, присвоенный объектам танка-мутанта.
 *
 * @param tank			Клиентский индекс танка.
 * @param type			1 = Светлый цвет, 2 = Цвет кислородного баллона, 3 = Цвет пламени кислородного баллона, 4 = Цвет камня,
 * 					5 = Цвет шин, 6 = Цвет баллона с пропаном, 7 = Цвет фонарика, 8 = Цвет короны
 * @param red			Отсылка красного цвета.
 * @param green			Отсылка зелёного цвета.
 * @param blue			Отсылка синего цвета.
 * @param alpha			Отсылка альфа-цвета.
 *
 * @error			Неверный индекс клиента, клиент не в игре, или тип меньше 1 или больше 8.
 **/
native void MT_GetPropColors(int tank, int type, int &red, int &green, int &blue, int &alpha);

/**
 * Возвращает записанный тип танка-мутанта.
 *
 * @param tank			Клиентский индекс танка.
 * @param type			Тип танка-мутанта. (Необязательно)
 *
 * @return			Записанный тип танка-мутанта.
 * @error			Неверный индекс клиента или клиента нет в игре.
 **/
native int MT_GetRecordedTankType(int tank, int type = 0);

/**
 * Возвращает скорость бега танка-мутанта.
 *
 * @param tank			Клиентский индекс танка.
 *
 * @return			Скорость бега танка.
 * @error			Неверный индекс клиента или клиента нет в игре.
 **/
native float MT_GetRunSpeed(int tank);

/**
 * Возвращает увеличиваемый урон в зависимости от сложности.
 *
 * @param damage		Базовый увеличиваемый урон.
 *
 * @return			Увеличиваемый урон в зависимости от сложности.
 **/
native float MT_GetScaledDamage(float damage);

/**
 * Возвращает тип возрождения танка-мутанта.
 *
 * @param tank			Клиентский индекс танка.
 * @param type			Тип танка-мутанта.
 * @param specType		Тип особого заражённого.
 *
 * @return			Тип возрождения танка.
 * 					0 = Обычный, 1 = Босс, 2 = Случайно, 3 = Трансформация, 4 = Комбинированные способности
 * @error			Неверный индекс клиента, клиент не в игре или клиент - игрок.
 **/
native int MT_GetSpawnType(int tank, int type = 0, int specType = 0);

/**
 * Возвращает RGB цвет, данные танку-мутанту.
 *
 * @param tank			Клиентский индекс танка.
 * @param type			1 = Цвет кожи, 2 = Цвет светящегося контура
 * @param red			Отсылка красного цвета.
 * @param green			Отсылка зелёного цвета.
 * @param blue			Отсылка синего цвета.
 * @param alpha			Отсылка альфа-цвета.
 *
 * @error			Неверный индекс клиента, клиент не в игре или тип меньше 1 или больше 2.
 **/
native void MT_GetTankColors(int tank, int type, int &red, int &green, int &blue, int &alpha);

/**
 * Возвращает индивидуальное имя, данное танку-мутанту.
 *
 * @param tank			Клиентский индекс танка.
 * @param buffer		Буфер для хранения пользовательского имени.
 *
 * @error			Неверный индекс клиента или клиента нет в игре.
 **/
native void MT_GetTankName(int tank, char[] buffer);

/**
 * Возвращает тип танка-мутанта.
 *
 * @param tank			Клиентский индекс танка.
 * @param type			Записанный тип танка-мутанта. (Необязательно)
 *
 * @return			Тип танка-мутанта.
 * @error			Неверный индекс клиента или клиента нет в игре.
 **/
native int MT_GetTankType(int tank, int type = 0);

/**
 * Возвращает, если игрок-выживший имеет доступ к типу танка-мутанта.
 *
 * @param admin			Клиентский индекс админа.
 *
 * @return			True, если доступ есть у игрока-выжившего, в противном случае - false.
 * @error			Неверный индекс клиента, клиент не в игре или клиент является ботом.
 **/
native bool MT_HasAdminAccess(int admin);

/**
 * Возвращает, если у определённого типа танка-мутанта есть шанс на появление.
 *
 * @param type			Тип танка-мутанта.
 * @param tank			Клиентский индекс танка.
 *
 * @return			True, если у типа есть шанс появления, в противном случае - false.
 * @error			Тип 0 или меньше.
 **/
native bool MT_HasChanceToSpawn(int type, int tank);

/**
 * Перехватывает/отключает любую энтити от обратного вызова SetTransmit основного плагина.
 *
 * @param entity		Индекс энтити.
 * @param mode			True, если подключаемая энтити, иначе false.
 *
 * @error			Недействительный индекс энтити.
 **/
native void MT_HideEntity(int entity, bool mode);

/**
 * Возвращает, если игрок-выживший невосприимчив к атакам танка-мутанта.
 *
 * @param survivor		Клиентский индекс выжившего.
 * @param tank			Клиентский индекс танка.
 *
 * @return			True, если игрок-выживший имеет иммунитет, в противном случае - false.
 * @error			Неверный индекс выжившего, выживший не в игре, выживший мёртв, выживший - бот, выживший бездействует,
 * 					недействительный индекс танка или танк не в игре.
 **/
native bool MT_IsAdminImmune(int survivor, int tank);

/**
 * Возвращает, если основной плагин включен.
 *
 * @return			True, если основной плагин включен, иначе - false.
 **/
native bool MT_IsCorePluginEnabled();

/**
 * Возвращает, если пользовательскому танку разрешено быть танком-мутантом.
 *
 * @param tank			Клиентский индекс танка.
 *
 * @return			True, если пользовательскому танку разрешено быть танком-мутантом, иначе - false.
 * @error			Неверный индекс клиента, клиент не в игре, или клиент мёртв.
 **/
native bool MT_IsCustomTankSupported(int tank);

/**
 * Возвращается, если определённый тип танка-мутанта доступен только на финальных картах.
 *
 * @param type			Тип танка-мутанта.
 * @param tank			Клиентский индекс танка.
 *
 * @return			True, если тип доступен, в противном случае - false.
 * @error			Тип 0 или меньше.
 **/
native bool MT_IsFinaleType(int type, int tank);

/**
 * Возвращается, если у танка-мутанта есть светящийся контур.
 *
 * @param tank			Клиентский индекс танка.
 *
 * @return			True, если танк имеет светящийся контур, иначе - false.
 * @error			Неверный индекс клиента или клиента нет в игре.
 **/
native bool MT_IsGlowEnabled(int tank);

/**
 * Возвращается, если мигает светящийся контур танка-мутанта.
 *
 * @param tank			Клиентский индекс танка.
 *
 * @return			True, если светящийся контур танка мигает, иначе - false.
 * @error			Неверный индекс клиента или клиента нет в игре.
 **/
native bool MT_IsGlowFlashing(int tank);

/**
 * Возвращается, если определённый тип танка-мутанта доступен только на нефинальных картах.
 *
 * @param type			Тип танка-мутанта.
 * @param tank			Клиентский индекс танка.
 *
 * @return			True, если тип доступен, в противном случае - false.
 * @error			Тип 0 или меньше.
 **/
native bool MT_IsNonFinaleType(int type, int tank);

/**
 * Возвращается, если танк бездействует.
 *
 * @param tank			Клиентский индекс танка.
 * @param type			Режим бездействия танка. 0 = Оба, 1 = Бездействие (ожидание выживших), 2 = Ошибка (сломался, застрял и т.п.) (нет поведения)
 *
 * @return			True, если танк простаивает, иначе - false.
 * @error			Неверный индекс клиента, клиент не в игре, клиент мёртв или тип меньше 0 или больше 2.
 **/
native bool MT_IsTankIdle(int tank, int type = 0);

/**
 * Возвращается, если танку разрешено быть танком-мутантом.
 *
 * @param tank			Клиентский индекс танка.
 * @param flags			Проверяет на запуск.
 * 					MT_CHECK_INDEX = Индекс клиента, MT_CHECK_CONNECTED = Соединение, MT_CHECK_INGAME = Статус в игре,
 * 					MT_CHECK_ALIVE = Состояние здоровья, MT_CHECK_INKICKQUEUE = Статус исключения из игры, MT_CHECK_FAKECLIENT = проверка бота
 * 					По умолчанию: MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE
 *
 * @return			True, если танку разрешено быть Танком-мутантом, в противном случае - false.
 * @error			Неверный индекс клиента, клиента нет в игре или он мёртв.
 **/
native bool MT_IsTankSupported(int tank, int flags = MT_CHECK_INDEX|MT_CHECK_INGAME|MT_CHECK_ALIVE);

/**
 * Возвращается, если включен определённый тип танка-мутанта.
 *
 * @param type			Тип танка-мутанта.
 * @param tank			Клиентский индекс танка.
 *
 * @return			True, если тип включен, иначе - false.
 * @error			Тип 0 или меньше.
 **/
native bool MT_IsTypeEnabled(int type, int tank);

/**
 * Записывает сообщение.
 *
 * @param type			Тип сообщения, которое нужно зарегистрировать.
 * @param message		Буфер, содержащий сообщение.
 * @param ...			Переменное количество параметров формата.
 **/
native void MT_LogMessage(int type = MT_LOG_CUSTOM, const char[] message, any ...);

/**
 * Возрождает выжившего.
 *
 * @param survivor		Клиентский индекс выжившего.
 *
 * @error			Неверный индекс клиента, клиент не в игре, или клиент мёртв.
 **/
native void MT_RespawnSurvivor(int survivor);

/**
 * Устанавливает танк Тип танка-мутанта.
 *
 * @param tank			Клиентский индекс танка.
 * @param type			Тип танка-мутанта.
 * @param mode			True, если танк должен физически трансформироваться в новый тип танка-мутанта, в противном случае - false.
 *
 * @error			Неверный индекс клиента, клиент не в игре, клиент мёртв или тип 0 или меньше.
 **/
native void MT_SetTankType(int tank, int type, bool mode);

/**
 * Толкает игрока в определенном направлении.
 *
 * @param player		Клиентский индекс игрока.
 * @param survivor		Клиентский индекс выжившего.
 * @param direction		Направление толчка.
 *
 * @error			Неверный индекс клиента, клиент не в игре, или клиент мёртв.
 **/
native void MT_ShoveBySurvivor(int player, int survivor, float direction[3]);

/**
 * Создаёт танка с указанным типом танка-мутанта.
 *
 * @param tank			Клиентский индекс танка.
 * @param type			Тип танка-мутанта.
 * @param specType		Тип особого заражённого.
 *
 * @error			Неверный индекс клиента, клиент не в игре, или тип 0 или меньше.
 **/
native void MT_SpawnTank(int tank, int type, int specType = 0);

/**
 * Ошеломляет игрока с определённого направления.
 *
 * @param player		Клиентский индекс игрока.
 * @param pusher		Клиентский индекс толкателя.
 * @param direction		Направление ошеломления.
 *
 * @error			Неверный индекс клиента, клиент не в игре, или клиент мёртв.
 **/
native void MT_StaggerPlayer(int player, int pusher, float direction[3]);

/**
 * Получает или устанавливает максимальное здоровье танка.
 *
 * @param tank			Клиентский индекс танка.
 * @param mode			1 = Получить максимальное здоровье танка, 2 = Получить максимальное сохранённое здоровье танка,
 * 					3 = Установить максимальное здоровье танка, не сохраняя его, 4 = Установить максимальное здоровье танка и сохранить его
 * @param newHealth		Новое максимальное здоровье танка.
 **/
native int MT_TankMaxHealth(int tank, int mode, int newHealth = 0);

/**
 * Снимает эффект рвоты на игрока.
 *
 * @param player		Клиентский индекс игрока.
 *
 * @error			Неверный индекс клиента, клиент не в игре, или клиент мёртв.
 **/
native void MT_UnvomitPlayer(int player);

/**
 * Устанавливает эффект рвоты на игрока.
 *
 * @param player		Клиентский индекс игрока.
 * @param boomer		Клиентский индекс Толстяка.
 *
 * @error			Неверный индекс клиента, клиент не в игре, или клиент мёртв.
 **/
native void MT_VomitPlayer(int player);
Способность клонирования
/**
 * Возвращается, если клон может использовать способности.
 *
 * @param tank			Клиентский индекс танка.
 *
 * @return			True, если клон может использовать способности, иначе - false.
 * @error			Неверный индекс клиента.
 **/
native bool MT_IsCloneSupported(int tank);

/**
 * Возвращается, если танк является клоном.
 *
 * @param tank			Клиентский индекс танка.
 *
 * @return			True, если танк является клоном, иначе - false.
 * @error			Неверный индекс клиента.
 **/
native bool MT_IsTankClone(int tank);
Stock'и
stock void MT_LoadPlugin(Handle plugin = null)
{
	char sFilename[64];
	GetPluginFilename(plugin, sFilename, sizeof sFilename);
	ServerCommand("sm plugins load %s", sFilename);
}

stock void MT_PrintToChat(int client, const char[] message, any ...)
{
	if (!bIsValidClient(client, MT_CHECK_INDEX))
	{
		ThrowError("Invalid client index %i", client);
	}

	if (!bIsValidClient(client, MT_CHECK_INGAME))
	{
		ThrowError("Client %i is not in game", client);
	}

	char sBuffer[1024], sMessage[1024];
	SetGlobalTransTarget(client);
	FormatEx(sMessage, sizeof sMessage, "\x01%s", message);
	VFormat(sBuffer, sizeof sBuffer, sMessage, 3);
	MT_ReplaceChatPlaceholders(sBuffer, sizeof sBuffer, false);
	PrintToChat(client, sBuffer);
}

stock void MT_PrintToChatAll(const char[] message, any ...)
{
	char sBuffer[1024];
	for (int iPlayer = 1; iPlayer <= MaxClients; iPlayer++)
	{
		if (bIsValidClient(iPlayer, MT_CHECK_INGAME|MT_CHECK_FAKECLIENT))
		{
			SetGlobalTransTarget(iPlayer);
			VFormat(sBuffer, sizeof sBuffer, message, 2);
			MT_PrintToChat(iPlayer, sBuffer);
		}
	}
}

stock void MT_PrintToConsole(int client, const char[] message, any ...)
{
	char sBuffer[1024];
	SetGlobalTransTarget(client);
	VFormat(sBuffer, sizeof sBuffer, message, 3);
	MT_ReplaceChatPlaceholders(sBuffer, sizeof sBuffer, true);
	PrintToConsole(client, sBuffer);
}

stock void MT_PrintToServer(const char[] message, any ...)
{
	char sBuffer[1024];
	SetGlobalTransTarget(LANG_SERVER);
	VFormat(sBuffer, sizeof sBuffer, message, 2);
	MT_ReplaceChatPlaceholders(sBuffer, sizeof sBuffer, true);
	PrintToServer(sBuffer);
}

stock void MT_ReplaceChatPlaceholders(char[] buffer, int size, bool empty)
{
	ReplaceString(buffer, size, "{default}", (empty ? "" : "\x01"));
	ReplaceString(buffer, size, "{mint}", (empty ? "" : "\x03"));
	ReplaceString(buffer, size, "{yellow}", (empty ? "" : "\x04"));
	ReplaceString(buffer, size, "{olive}", (empty ? "" : "\x05"));
	ReplaceString(buffer, size, "{percent}", "%%");

	if (empty)
	{
		ReplaceString(buffer, size, "\x01", "");
		ReplaceString(buffer, size, "\x03", "");
		ReplaceString(buffer, size, "\x04", "");
		ReplaceString(buffer, size, "\x05", "");
	}
}

stock void MT_ReloadPlugin(Handle plugin = null)
{
	char sFilename[64];
	GetPluginFilename(plugin, sFilename, sizeof sFilename);
	ServerCommand("sm plugins reload %s", sFilename);
}

stock void MT_ReplyToCommand(int client, const char[] message, any ...)
{
	char sBuffer[1024];
	SetGlobalTransTarget(client);
	VFormat(sBuffer, sizeof sBuffer, message, 3);

	if (GetCmdReplySource() == SM_REPLY_TO_CONSOLE)
	{
		MT_ReplaceChatPlaceholders(sBuffer, sizeof sBuffer, true);

		switch (client == 0)
		{
			case true: PrintToServer(sBuffer);
			case false: PrintToConsole(client, sBuffer);
		}
	}
	else
	{
		MT_PrintToChat(client, sBuffer);
	}
}

stock void MT_TE_SetupParticleAttachment(int particle, int attachment, int entity, bool follow = false)
{
	static bool bSecondGame = false;
	static EngineVersion evEngine = Engine_Unknown;
	if (evEngine == Engine_Unknown)
	{
		evEngine = GetEngineVersion();
		bSecondGame = (evEngine == Engine_Left4Dead2);
	}

	TE_Start("EffectDispatch");

	static float flDummy[3] = {0.0, 0.0, 0.0};
	TE_WriteFloat((bSecondGame ? "m_vOrigin.x" : "m_vOrigin[0]"), flDummy[0]);
	TE_WriteFloat((bSecondGame ? "m_vOrigin.y" : "m_vOrigin[1]"), flDummy[1]);
	TE_WriteFloat((bSecondGame ? "m_vOrigin.z" : "m_vOrigin[2]"), flDummy[2]);
	TE_WriteFloat((bSecondGame ? "m_vStart.x" : "m_vStart[0]"), flDummy[0]);
	TE_WriteFloat((bSecondGame ? "m_vStart.y" : "m_vStart[1]"), flDummy[1]);
	TE_WriteFloat((bSecondGame ? "m_vStart.z" : "m_vStart[2]"), flDummy[2]);

	static int iEffect = INVALID_STRING_INDEX;
	if (iEffect < 0)
	{
		iEffect = MT_FindStringIndex(FindStringTable("EffectDispatch"), "ParticleEffect");
		if (iEffect == INVALID_STRING_INDEX)
		{
			return;
		}
	}

	TE_WriteNum("m_iEffectName", iEffect);
	TE_WriteNum("m_nHitBox", particle);
	TE_WriteNum("entindex", entity);
	TE_WriteNum("m_nAttachmentIndex", attachment);
	TE_WriteNum("m_fFlags", 1);
	TE_WriteVector("m_vAngles", flDummy);
	TE_WriteFloat("m_flMagnitude", 0.0);
	TE_WriteFloat("m_flScale", 1.0);
	TE_WriteFloat("m_flRadius", 0.0);

	switch (bSecondGame)
	{
		case true: TE_WriteNum("m_nDamageType", (follow ? 5 : 4));
		case false: TE_WriteNum("m_nDamageType", (follow ? 4 : 3));
	}
}

stock void MT_TE_SetupStopAllParticles(int entity)
{
	static bool bSecondGame = false;
	static EngineVersion evEngine = Engine_Unknown;
	if (evEngine == Engine_Unknown)
	{
		evEngine = GetEngineVersion();
		bSecondGame = (evEngine == Engine_Left4Dead2);
	}

	TE_Start("EffectDispatch");

	static float flDummy[3] = {0.0, 0.0, 0.0};
	TE_WriteFloat((bSecondGame ? "m_vOrigin.x" : "m_vOrigin[0]"), flDummy[0]);
	TE_WriteFloat((bSecondGame ? "m_vOrigin.y" : "m_vOrigin[1]"), flDummy[1]);
	TE_WriteFloat((bSecondGame ? "m_vOrigin.z" : "m_vOrigin[2]"), flDummy[2]);
	TE_WriteFloat((bSecondGame ? "m_vStart.x" : "m_vStart[0]"), flDummy[0]);
	TE_WriteFloat((bSecondGame ? "m_vStart.y" : "m_vStart[1]"), flDummy[1]);
	TE_WriteFloat((bSecondGame ? "m_vStart.z" : "m_vStart[2]"), flDummy[2]);

	static int iEffect = INVALID_STRING_INDEX;
	if (iEffect < 0)
	{
		iEffect = MT_FindStringIndex(FindStringTable("EffectDispatch"), "ParticleEffectStop");
		if (iEffect == INVALID_STRING_INDEX)
		{
			return;
		}
	}

	TE_WriteNum("m_iEffectName", iEffect);
	TE_WriteNum("m_nHitBox", 0);
	TE_WriteNum("entindex", entity);
	TE_WriteNum("m_nAttachmentIndex", 0);
	TE_WriteNum("m_fFlags", 1);
	TE_WriteVector("m_vAngles", flDummy);
	TE_WriteFloat("m_flMagnitude", 0.0);
	TE_WriteFloat("m_flScale", 0.0);
	TE_WriteFloat("m_flRadius", 0.0);
	TE_WriteNum("m_nDamageType", 0);
}

stock void MT_TeleportPlayerAhead(int player, const float origin[3], const float angles[3], const float velocity[3], const float direction[3], const float distance)
{
	float flPos[3];
	flPos[0] = origin[0] + (direction[0] * distance);
	flPos[1] = origin[1] + (direction[1] * distance);
	flPos[2] = origin[2];

	TeleportEntity(player, flPos, angles, velocity);
	vFixPlayerPosition(player, false);
}

stock void MT_UnloadPlugin(Handle plugin = null)
{
	char sFilename[64];
	GetPluginFilename(plugin, sFilename, sizeof sFilename);
	ServerCommand("sm plugins unload %s", sFilename);
}

stock bool MT_FileExists(const char[] folder, const char[] filename, const char[] path, char[] output, int size, bool use_valve_fs = false, const char[] valve_path_id = "GAME")
{
	if (FileExists(path, use_valve_fs, valve_path_id))
	{
		char sDirectory[PLATFORM_MAX_PATH], sOutput[PLATFORM_MAX_PATH];
		BuildPath(Path_SM, sDirectory, sizeof sDirectory, folder);
		vGetMatchingFilename(sDirectory, filename, sOutput, sizeof sOutput);
		if (!StrEqual(filename, sOutput))
		{
			char sTemp[PLATFORM_MAX_PATH];
			FormatEx(sTemp, sizeof sTemp, "%s%s", sDirectory, sOutput);
			strcopy(output, size, sTemp);
		}

		return true;
	}

	return false;
}

stock bool MT_TE_CreateParticle(float startPos[3] = {0.0, 0.0, 0.0}, float endPos[3] = {0.0, 0.0, 0.0}, int particle = -1, int entity = 0, float delay = 0.0, bool all = true, char name[64] = "", int attachment = 0, float angles[3] = {0.0, 0.0, 0.0}, int flags = 0, int damageType = 0, float magnitude = 0.0, float scale = 1.0, float radius = 0.0)
{
	static bool bSecondGame = false;
	static EngineVersion evEngine = Engine_Unknown;
	if (evEngine == Engine_Unknown)
	{
		evEngine = GetEngineVersion();
		bSecondGame = (evEngine == Engine_Left4Dead2);
	}

	TE_Start("EffectDispatch");

	TE_WriteFloat((bSecondGame ? "m_vOrigin.x" : "m_vOrigin[0]"), startPos[0]);
	TE_WriteFloat((bSecondGame ? "m_vOrigin.y" : "m_vOrigin[1]"), startPos[1]);
	TE_WriteFloat((bSecondGame ? "m_vOrigin.z" : "m_vOrigin[2]"), startPos[2]);
	TE_WriteFloat((bSecondGame ? "m_vStart.x" : "m_vStart[0]"), endPos[0]);
	TE_WriteFloat((bSecondGame ? "m_vStart.y" : "m_vStart[1]"), endPos[1]);
	TE_WriteFloat((bSecondGame ? "m_vStart.z" : "m_vStart[2]"), endPos[2]);

	static int iEffect = INVALID_STRING_INDEX;
	if (iEffect < 0)
	{
		iEffect = MT_FindStringIndex(FindStringTable("EffectDispatch"), "ParticleEffect");
		if (iEffect == INVALID_STRING_INDEX)
		{
			return false;
		}
	}

	TE_WriteNum("m_iEffectName", iEffect);

	if (particle < 0)
	{
		static int iParticleString = INVALID_STRING_INDEX;
		iParticleString = MT_FindStringIndex(iEffect, name);
		if (iParticleString == INVALID_STRING_INDEX)
		{
			return false;
		}

		TE_WriteNum("m_nHitBox", iParticleString);
	}
	else
	{
		TE_WriteNum("m_nHitBox", particle);
	}

	TE_WriteNum("entindex", entity);
	TE_WriteNum("m_nAttachmentIndex", attachment);
	TE_WriteVector("m_vAngles", angles);
	TE_WriteNum("m_fFlags", flags);
	TE_WriteFloat("m_flMagnitude", magnitude);
	TE_WriteFloat("m_flScale", scale);
	TE_WriteFloat("m_flRadius", radius);
	TE_WriteNum("m_nDamageType", damageType);

	if (all)
	{
		TE_SendToAll(delay);
	}

	return true;
}

stock float MT_GetRandomFloat(float min, float max)
{
	return (GetURandomFloat() * (max - min)) + min;
}

stock int MT_AddCommasToFloat(float number, char[] output, int size)
{
	int iPos = 0, iPos2 = 0, iSize = 0;
	if (number < 0.0)
	{
		output[iPos++] = '-';
		number = -number;
	}

	char sTemp[18], sSet[2][18];
	FormatEx(sTemp, sizeof sTemp, "%.2f", number);
	ExplodeString(sTemp, ".", sSet, sizeof sSet, sizeof sSet[]);

	iSize = strlen(sSet[0]);
	if (iSize <= 3)
	{
		iPos += strcopy(output[iPos], size, sTemp);
	}
	else
	{
		while (iPos2 < iSize && iPos < size)
		{
			output[iPos++] = sSet[0][iPos2++];

			if ((iSize - iPos2) && !((iSize - iPos2) % 3))
			{
				output[iPos++] = ',';
			}
		}

		output[iPos] = '\0';
		Format(output, size, "%s.%s", output, sSet[1]);
	}

	return iPos;
}

stock int MT_AddCommasToInt(int number, char[] output, int size)
{
	int iPos = 0, iPos2 = 0, iSize = 0;
	if (number < 0)
	{
		output[iPos++] = '-';
		number = (number ^ (number >> 31)) - (number >> 31);
	}

	char sTemp[15];
	iSize = IntToString(number, sTemp, sizeof sTemp);
	if (iSize <= 3)
	{
		iPos += strcopy(output[iPos], size, sTemp);
	}
	else
	{
		while (iPos2 < iSize && iPos < size)
		{
			output[iPos++] = sTemp[iPos2++];

			if ((iSize - iPos2) && !((iSize - iPos2) % 3))
			{
				output[iPos++] = ',';
			}
		}

		output[iPos] = '\0';
	}

	return iPos;
}

stock int MT_FindStringIndex(int index, const char[] search)
{
	char sBuffer[1024];
	int iStrings = GetStringTableNumStrings(index);
	for (int iPos = 0; iPos < iStrings; iPos++)
	{
		ReadStringTable(index, iPos, sBuffer, sizeof sBuffer);

		if (StrEqual(sBuffer, search))
		{
			return iPos;
		}
	}

	return INVALID_STRING_INDEX;
}

stock int MT_GetParticleIndex(const char[] particlename)
{
	static int iTable = INVALID_STRING_TABLE;
	if (iTable == INVALID_STRING_TABLE)
	{
		iTable = FindStringTable("ParticleEffectNames");
		if (iTable == INVALID_STRING_TABLE)
		{
			return INVALID_STRING_TABLE;
		}
	}

	int iParticleString = MT_FindStringIndex(iTable, particlename);
	if (iParticleString == INVALID_STRING_INDEX)
	{
		iParticleString = iPrecacheParticle(particlename);
	}

	return iParticleString;
}

stock int MT_GetRandomInt(int min, int max)
{
	return RoundToNearest(GetURandomFloat() * float(max - min)) + min;
}
Фильтры цели
@smokers
@boomers
@hunters
@spitters
@jockeys
@chargers
@tanks
@special
@infected
@mutants
@mtanks
@psytanks
@msmokers
@psysmokers
@mboomers
@psyboomers
@mhunters
@psyhunters
@mspitters
@psyspitters
@mjockeys
@psyjockeys
@mchargers
@psychargers
Команды
// Требуется флаг "z" (Root).
sm_tank - Создать танка-мутанта.
sm_mt_tank - Создать танка-мутанта.

Допустимые входы:

1. sm_tank <напишите 1*-500*> <количество: 1-32> <0: создать на прицеле|1: создать автоматически> <0: не слеплён|1: ослепил> *Минимальные и максимальные значения определяются "Type Range". (Минимальное значение, которое вы можете установить, - "1", а максимальное значение, которое вы можете установить, - это "500".)
2. sm_tank <напишите название*> <количество: 1-32> <0: создать на прицеле|1: создать автоматически> <0: не слеплён|1: ослепил> *Плагин попытается сопоставить имя с любым из имён типов Танков-мутантов. (Допускаются частичные имена. Если найдено более одного совпадения, выбирается случайное совпадение. Если найдено 0 совпадений, команда отменяет запрос.)

У команды 4 функции.

Если ты не танк:

1. При столкновении с энтити, не являющейся танком, появляется танк-мутант выбранного типа.
2. Когда вы столкнётесь с Танком, он переключится на выбранный тип.

Если вы танк:

1. Если удерживать нажатой кнопку +speed (по умолчанию: ЛЕВЫЙ SHIFT), танк-мутант появится в выбранном типе.
2. Если не удерживать кнопку +speed (по умолчанию: ЛЕВЫЙ SHIFT), вы превратитесь в выбранный тип.

Форматирование конфигурации

Нажмите, чтобы расширить!
Вопрос 1
  1. Сколько существует форматов конфигурации?

На данный момент существует 4 разных формата.

Вопрос 2
  1. Нужно ли мне редактировать текущий файл конфигурации, начиная с версии v8.57 и ниже?
Вопрос 3

Нет, все плагины по-прежнему правильно читают исходный формат.

  1. Какой формат конфигурации я должен использовать?

Какой хотите. Вы также можете комбинировать их все, это не имеет значения. Для согласованности и во избежание путаницы этот файл и любой другой файл с примерами конфигурации будут использовать исходный формат.

Пример
// Исходный формат
"Mutant Tanks"
{
	"Plugin Settings"
	{
		"Game Modes"
		{
			"Game Mode Types"			"0"
		}
	}
}

// Пользовательский формат
mutant_tanks // 3-й формат
{
	Settings // 4-й формат
	{
		GameModes // 2-й формат
		{
			"Game Mode Types"			0 // исходный формат
		}
	}
}
Вопрос 4
  1. Можно ли настроить более одного типа в одном разделе?

Да, вы можете применить глобальные настройки для всех типов или указать определённые типы для их использования.

Пример
"Mutant Tanks"
{
	// Применимо ко всем типам.
	"All"
	{
		"Health"
		{
			"Extra Health"				"1000"
		}
	}
	// Применяется к типам 1 и 10.
	"1,10"
	{
		"Health"
		{
			"Extra Health"				"1000"
		}
	}
	// Применяется к типам с 11 по 20.
	"11-20"
	{
		"Health"
		{
			"Extra Health"				"1000"
		}
	}
	// Применяется к типам с 21 по 30 и с 31 по 40.
	"21-30,31-40"
	{
		"Health"
		{
			"Extra Health"				"1000"
		}
	}
}
Вопрос 5
  1. Можно ли настроить более одной способности в одном разделе?

Да, вы можете применить глобальные настройки для всех способностей или указать определённые способности для их использования.

Пример
"Mutant Tanks"
{
	"Tank #1"
	{
		// Применяется ко всем способностям.
		"All"
		{
			"Ability Enabled"			"1"
		}
		// Применяется к способностям поглощения и кислотной.
		"Absorb,Acid"
		{
			"Ability Enabled"			"1"
		}
	}
}

Система администрирования

Нажмите, чтобы расширить!
Вопрос 1
  1. Как работает эта система?

Система администрирования предназначена для использования и эффективности каждого типа танка-мутанта. По сути, она контролирует и определяет, какие Танки-мутанты могут использовать игроки или которых нельзя использовать.

Вопрос 2
  1. Зачем создавать совершенно новую систему администрирования вместо использования собственной системы SourceMod?

Сначала целью было использование собственной системы SM, но эта система имеет определённые ограничения, от которых я хотел избавиться в этом проекте. Например, в системе SM присвоение нескольких флагов команде переопределения требует, чтобы администраторы имели все эти флаги. В этой системе администраторам нужен только один из этих флагов, что делает систему гибкой для фильтрации нескольких флагов администратора.

Пример
// Система SM
"sm_tank"			"abc" // Администраторам нужны все три флага для использования команды.

// Система МТ
"Access Flags"			"abc" // Администраторам нужен только один из этих флагов для доступа к типу танка-мутанта.
Вопрос 3
  1. Для чего используются флаги администратора?

Флаги используются для двух целей:

  • Доступность - К каким типам Танков-мутантов имеют доступ администраторы.
  • Иммунитет - К каким типам Танков-мутантов администраторы имеют иммунитет.
Вопрос 4
  1. Какие ещё функции есть в системе?

В настоящее время система позволяет администраторам иметь свой избранный/настраиваемый/персонализированный тип танка-мутанта.

Каждый пользовательский параметр администратора будет иметь приоритет над соответствующими настройками для конкретного типа танка-мутанта или общими настройками. Это мощная функция, потому что каждый администратор может иметь свой собственный тип танка-мутанта, не изменяя настройки типа танка-мутанта или общие настройки.

Пример
"Mutant Tanks"
{
	"STEAM_0:1:23456789"
	{
		"General"
		{
			"Tank Name"				"Отличный игрок" // Это имя будет иметь Танки под управлением админа.
		}
	}
	"Tank #1"
	{
		"General"
		{
			"Tank Name"				"Потрясающий ИИ" // Танки-боты будут иметь это имя.
		}
	}
}
Вопрос 5
  1. Как работает функция переопределения?

Это будет звучать сложно, но вот самый простой способ объяснить это:

Переопределения способностей
Если у флагов способностей игрока есть один из флагов доступа, необходимых для способности, или наоборот, у игрока будет доступ к способности.
Если флаги способностей игрока имеют один из флагов иммунитета, необходимых для способности, или наоборот, игрок будет иметь иммунитет от способности.

ИЛИ

Если флаги типа игрока имеют один из флагов доступа, необходимых для способности, или наоборот, игрок будет иметь доступ к этой способности.
Если флаги типа игрока имеют один из флагов иммунитета, требуемых для способности, или наоборот, у игрока будет иммунитет от способности.

ИЛИ

Если общие флаги МТ игрока имеют один из флагов доступа, необходимых для способности, или наоборот, у игрока будет доступ к этой способности.
Если общие флаги МТ игрока имеют один из флагов иммунитета, необходимых для способности, или наоборот, у игрока будет иммунитет от способности.

ИЛИ

Если флаги SM игрока имеют один из флагов доступа, необходимых для способности, или наоборот, игрок получит доступ к этой способности.
Если флаги SM игрока имеют один из флагов иммунитета, необходимых для способности, или наоборот, игрок будет иметь иммунитет от способности.

Примечание: Если все 4 из них вернут своё значание на false, у игрока не будет доступа к этой способности или иммунитета от неё.
Переопределения типа
Если флаги способностей игрока имеют один из флагов доступа, необходимых для определённого типа, или наоборот, игрок будет иметь доступ к способности этого типа.
Если на флагах способностей игрока есть один из флагов иммунитета, необходимых для определённого типа, или наоборот, игрок будет иметь иммунитет от способности этого типа.

ИЛИ

Если флаги типа игрока имеют один из флагов доступа, необходимых для типа, или наоборот, игрок будет иметь доступ к типу.
Если флаги типа игрока имеют один из флагов иммунитета, требуемых для определённого типа, или наоборот, игрок будет иметь иммунитет от этого типа.

ИЛИ

Если общие флаги МТ игрока имеют один из флагов доступа, необходимых для типа, или наоборот, игрок будет иметь доступ к типу.
Если общие флаги МТ игрока имеют один из флагов иммунитета, требуемых для определённого типа, или наоборот, игрок будет иметь иммунитет от этого типа.

ИЛИ

Если флаги SM игрока имеют один из флагов доступа, требуемых для типа, или наоборот, игрок будет иметь доступ к типу.
Если флаги SM игрока имеют один из флагов иммунитета, необходимых для определённого типа, или наоборот, игрок будет иметь иммунитет от этого типа.

Примечание: Если все 4 из них вернут своё значание на false, у игрока не будет доступа к этому типу или иммунитета от него.
Глобальные переопределения
Если флаги способностей игрока имеют один из флагов доступа, требуемых глобально, или наоборот, игрок будет иметь доступ ко всем способностям, для которых требуются эти флаги.
Если флаги способностей игрока имеют один из флагов иммунитета, требуемых глобально, или наоборот, игрок будет иметь иммунитет ко всем способностям, требующим этих флагов.

ИЛИ

Если флаги типа игрока имеют один из флагов доступа, требуемых глобально, или наоборот, игрок будет иметь доступ ко всем типам, которым требуются эти флаги.
Если флаги типа игрока имеют один из флагов иммунитета, требуемых глобально, или наоборот, игрок будет иметь иммунитет от всех типов, которым требуются эти флаги.

ИЛИ

Если общие флаги МТ игрока имеют один из флагов доступа, требуемых глобально, или наоборот, игрок будет иметь доступ ко всем типам и способностям, для которых требуются эти флаги.
Если общие флаги МТ игрока имеют один из флагов иммунитета, требуемых глобально, или наоборот, игрок будет иметь иммунитет ко всем типам и способностям, которые требуют этих флагов.

ИЛИ

Если флаги SM игрока имеют один из флагов доступа, требуемых глобально, или наоборот, игрок будет иметь доступ ко всем типам и способностям, для которых требуются эти флаги.
Если флаги SM игрока имеют один из флагов иммунитета, требуемых глобально, или наоборот, игрок будет иметь иммунитет ко всем типам и способностям, которые требуют этих флагов.

Примечание: Если все 4 из них вернут своё значание на false, у игрока не будет доступа или иммунитета от чего-либо.
Вопрос 6
  1. Для чего нужна команда sm_mt_dev?

Эта команда позволяет разработчику (Psyk0tik) получить доступ к определённым функциям проекта на вашем сервере. Эти функции включают:

  • Доступ ко всем танкам-мутантам. (Позволяет разработчику видеть, какие Танки-мутанты есть в вашей конфигурации.)
  • Иммунитет от всех Танков-мутантов. (Позволяет разработчику тестировать каждого танка-мутанта, не разбираясь с эффектами каждой способности.)
  • Возможность создавать Танков-мутантов. (Позволяет разработчику создавать танка-мутанта для тестирования.)
  • Проверить, какие способности установлены. (Позволяет разработчику проверить, какие способности можно протестировать.)

Короче говоря, этот команду не даёт разработчику доступа к другим функциям или плагинам, что позволяет избежать потенциальных проблем на вашем сервере. Отключите эту команду, если вы не уверены, что доверяете разработчику. Эта команда была добавлена, чтобы помочь владельцам серверов предоставить разработчику временный доступ на случай, если разработчику потребуется помочь владельцам серверов наладить проблемы.

Поддержка игрока за танка-мутанта

Нажмите, чтобы расширить!
Вопрос 1
  1. Как включить управление за игрока?

Установите Human Support на 1 или 2.

Вопрос 2
  1. Могут ли игроки использовать способности автоматически/вручную?

Да, просто установите Human Ability на 1 или 2 для КАЖДОЙ способности.

Пример
"Mutant Tanks"
{
	"Tank #1"
	{
		"Fast Ability"
		{
			"Human Ability"				"1"
		}
	}
}
Вопрос 3
  1. Как игроки могут использовать способности вручную?

Есть 4 кнопки, которые игроки могут использовать, когда появляются в качестве Танков-мутантов.

+use (по умолчанию: E) - Основная способность
+reload (по умолчанию: R) - Дальнобойная способность
+zoom (по умолчанию: Mouse3/Колесо мыши) - Особая способность
+duck (по умолчанию: CTRL) - Способность после смерти

Что бы ни активировала каждая кнопка, это полностью зависит от настроек пользователя.

Вопрос 4
  1. Как мне изменить кнопки или добавить дополнительные кнопки?

Отредактируйте 107-110 строки файла mutant_tanks.inc и перекомпилируйте каждый плагин способности.

Вопрос 5
  1. Что произойдёт, если у танка-мутанта есть несколько способностей, которые активируются одной и той же кнопкой?

Все соответствующие способности могут активироваться или не активироваться одновременно, в зависимости от настроек. Рекомендуется не ставить многие способности на одного танка, который управляется игроком.

Вопрос 6
  1. Как мне ограничить использование способностей для каждого игрока?

Установите параметр Human Ammo для каждой способности на любое желаемое значение.

Пример
"Mutant Tanks"
{
	"Tank #1"
	{
		"Fast Ability"
		{
			"Human Ammo"				"5"
		}
	}
}
Вопрос 7
  1. Могу ли я добавить время восстановления способностей для каждого игрока?

Да, просто установите параметр Human Cooldown для каждой способности на любое желаемое значение.

Пример
"Mutant Tanks"
{
	"Tank #1"
	{
		"Fast Ability"
		{
			"Human Cooldown"			"30"
		}
	}
}
Вопрос 8
  1. Что означает настройка Human Duration в некоторых способностях?

Этот параметр является особой продолжительностью для игроков, но он применяется только в том случае, если параметр Human Mode установлен на 0.

Кроме того, есть некоторые настройки продолжительности способностей, которые также влияют на игроков. Прочтите файл INFORMATION.md для получения более подробной информации.

Вопрос 9
  1. Для чего нужен параметр Human Mode в некоторых способностях?

Этот параметр представляет собой специальный параметр режима для игроков, который может определять, как активируются некоторые способности. Прочтите файл INFORMATION.md для получения более подробной информации.

Вопрос 10
  1. Есть ли способ просмотреть информацию об этой функции в игре?

Да, используйте sm_mt_ability команда.

Каждая команда предоставляет меню, которое игроки могут использовать для отображения определённой информации в чате.

Информация, отображаемая в чате, будет более подробной и точной, когда игрок играет за танка-мутанта.

Вопрос 11
  1. Есть ли способ изменить свой текущий тип танка-мутанта прямо посреди боя?

Да, игроки могут использовать команду sm_mutanttank, если параметр Spawn Mode в секции Human Support в разделе Plugin Settings установлен на 0. Однако будет время восстановления, чтобы предотвратить злоупотребления.

Вопрос 12
  1. Есть ли способ освободить админов от перезарядки способности, упомянутой в вопросе #11?

Да, назначьте администраторам переопределение mt_adminversus.

Пример
Overrides
{
	"mt_adminversus"		"z" // Все админы с флагом "z" (Root) освобождаются от перезарядки.
}

Конфигурация

Нажмите, чтобы расширить!
Вопрос 1
  1. Как включить функции пользовательской конфигурации?

Установите для параметра Enable Custom Configs значение 1.

Вопрос 2
  1. Как сообщить плагину, что нужно создавать только определённые настраиваемые файлы конфигурации?

Установите значения в Create Config Types.

Примеры
"Create Config Types" "7" // Создаёт папки и файлы конфигурации для каждой сложности, карты и режима игры.
"Create Config Types" "8" // Создаёт папку и файлы конфигурации на каждый день.
"Create Config Types" "31" // Создаёт папки и файлы конфигурации для каждой сложности, карты, режима игры, дня и количества игроков.
"Create Config Types" "255" // Создаёт папки и файлы конфигурации для каждой сложности, карты, режима игры, дня, количества игроков (выживших/заражённых/всех) и финальной стадии.
Вопрос 3
  1. Как сообщить плагину, чтобы он выполнял только определённые настраиваемые файлы конфигурации?

Установите значения в Execute Config Types.

Примеры
"Execute Config Types" "7" // Выполняет файл конфигурации для текущей сложности, карты и игрового режима.
"Execute Config Types" "8" // Выполняет файл конфигурации на текущий день.
"Execute Config Types" "31" // Выполняет файл конфигурации для текущей сложности, карты, режима игры, дня и количества игроков.
"Execute Config Types" "255" // Выполняет конфигурационный файл для текущей сложности, карты, режима игры, дня, количества игроков (выживших/заражённых/всех) и финальной стадии.

Благодарности

Нажмите, чтобы расширить!

Machine - За плагин [L4D2] Super Tanks.

NgBUCKWANGS - За код mapname.cfg в его плагине [L4D2] ABM.

Spirit_12 - За подписи L4D для файла gamedata.

honorcode23 - За плагин [L4D & L4D2] New Custom Commands.

panxiaohai - За плагины [L4D & L4D2] We Can Not Survive Alone, [L4D & L4D2] Melee Weapon Tank, [L4D & L4D2] Tank's Power, [L4D & L4D2] Automatic Robot, и [L4D2] Variable Size Of Infected and Witch.

strontiumdog - За плагины [ANY] Evil Admin: Mirror Damage, [ANY] Evil Admin: Pimp Slap, [ANY] Evil Admin: Rocket, и Evil Admin: Vision.

Hipster - За плагин [ANY] Admin Smite.

Marcus101RR - За код, который позволяет установить боеприпасы оружия игрока.

AtomicStryker - За плагины [L4D & L4D2] SM Respawn Command и [L4D & L4D2] Boomer Splash Damage.

ivailosp and V10 - За плагины [L4D] Away и [L4D2] Away.

mi123645 - За плагин [L4D(2)] 4+ Survivor AFK Fix.

Chanz - За плагин [ANY] Infinite-Jumping.

Farbror Godis - За плагин [ANY] Curse.

GoD-Tony - За плагин Toggle Weapon Sounds и Updater.

Teamkiller324 - За плагин Updater.

Phil25 - За плагин [TF2] Roll the Dice Revamped (RTD).

Chaosxk - За плагин [ANY] Spin my screen.

ztar - За плагин [L4D2] LAST BOSS.

IxAvnoMonvAxI - За плагин [L4D2] Last Boss Extended.

Uncle Jessie - За танк-тремор в его Last Boss Extended revision.

Drixevel - За плагин [ANY] Force Active Weapon.

pRED - За плагин [ANY] SM Super Commands.

sheo - За плагин [L4D2] Fix Frozen Tanks.

nico-op - За плагин [L4D/L4D2] Infected Health Gauge (Tank & Witch & Special).

Ernecio - За плагин [L4D1 AND L4D2] Tank's Laser Attack и [L4D1 & L4D2] Improved Flying Tank.

Luckylock - За плагин [L4D & L4D2] Tank Rock Lag Compensation.

raoulduke - За плагин [L4D] Survival Event Timer.

Pelipoika - За плагин [TF2] Rainbow Glow.

cravenge - За плагин [L4D/L4D2] Vigilant Tank Behavior и [L4D/L4D2] MultiTanks - Improved.

NoroHime - За плагин [L4D2] Additional Death Messages on HUD.

Erreur 500 - За плагин [ANY] Stuck.

Xutax_Kamay - За плагин [ANY] Hit Registration Fix Plugin (bullet displacement by 1 tick).

Carl Sagan - За плагин [L4D2] Tank Rush 2.

Silvers (Silvershot) - За его плагины в которых хорошие отсылки, помощь с подписями игровых данных и помощь оптимизировать/исправить различные части кода.

epz/epzminion - За помощь с подписями, смещениями, адресами игровых данных и бесценным вводом.

Lux/LuxLuma - За помощь в оптимизации/исправлении различных частей кода, кода для определения вида от третьего лица и за плагины Left4Fix и [L4D/L4D2]WeaponHandling_API.

Forgetest - За помощь с смещениями.

sorallll - За плагин [L4D2]Skip Tank Taunt.

Milo| - За плагины Extended Map Configs и Dailyconfig.

exvel - За include Colors.

Impact - За include AutoExecConfig.

hmmmmm (SlidyBat) - За демонстрации того, как выбрать случайный символ из динамической строки.

KasperH/Ladis - За перевод на венгерский, сообщения о проблемах, предложения идей и общую поддержку.

Blueberry/Kleiner - За перевод на русский и предложение идей.

yuzumi - За перевод на упрощённый китайский, сообщения о проблемах и предложения идей.

Mi.Cura, 3aljiyavslgazana - За сообщения о проблемах, предложения идей, тестирование и общую поддержку.

emsit - За сообщения о проблемах, помощи с частями кода и предложения идей.

ReCreator, SilentBr, Neptunia, Zytheus, huwong, Tank Rush, Tonblader, TheStarRocker, Maku, Shadowart, moschinovac, saberQAQ, Shao, xcd222, PVNDV, SpannerV2 - За сообщения о проблемах и предложения идей.

Princess LadyRain, Nekrob, fig101, BloodyBlade, user2000, MedicDTI, ben12398, AK978, ricksfishin, Voevoda, ur5efj, What, moekai, weffer, AlexAlcala, ddd123, GL_INS, Slaven555, Neki93, kot4404, KadabraZz, Krufftys Killers, thewintersoldier97, Balloons, George Rex, swofleswof, bedildewo, Dudus1st - За сообщения о проблемах.

Electr000999, foquaxticity, foxhound27, sxslmk, FatalOE71, zaviier, RDiver, BHaType, HarryPotter, jeremyvillanueva, DonProof, XXrevoltadoXX, XYZC, JustMadMan, DARG367, zonbarbar, Unfellowed, maclarens - За предложения идей.

Marttt - За помощь во многих вещах и pull request'ы.

Dragokas - За сообщения о проблемах, предложения идей и предоставления исправлений.

login101 - За предоставление некоторого исходного кода для способности грозовой шторм.

Angelace113 - За цвета по умолчанию (до версии v8.12), тестирование каждого типа танка, предложение идей, помощь в преобразовании плагинов для использования структур перечисления (v8.66), помощь в настройке страниц вики и общую поддержку.

Sipow - За цвета по умолчанию (до версии v8.12), предложение идей и общую поддержку.

Oliver, FusionFlarez - За помощь в тестировании системы наград, функции комбинации и общую поддержку.

Команда SourceMod - За постоянное обновление/улучшение SourceMod.

Уведомление о сторонних изменениях

Если вы хотите поделиться своими собственными версиями этого плагина, переименуйте файлы, чтобы не было путаницы для пользователей.

Заключительные слова

Наслаждайтесь всей моей тяжёлой работой и получайте от неё удовольствие!