MAC's NPCs v1.2 Documentation (RUS)

image5.png

Основные настройки

1. Чтобы установить это дополнение на свой сервер, просто разархивируйте его в папку garrysmod/addons вашего сервера

2. В папке “MC Simple NPCs/lua/mcs_npcs” откройте sh_config.lua для настройки дополнения  

Конфиг:

MCS.Config.UseDelay = 2			// Задержка между нажатиями кнопки "Использовать" на NPC
MCS.Config.TextSpeed = 3			// Скорость анимации набора текста (1 - самая быстрая, 10 - самая медленная)
MCS.Config.DebugMode = false             // DebugMode включает кнопки закрытия меню диалога в правом верхнем углу
MCS.Config.NPCTextColor = Color(255,255,255)		// Цвет текста NPC's
MCS.Config.TextColor = Color(255,255,255)		// Цвет текста ответа и кнопки пропуска
MCS.Config.HighlightColor = Color(217,170,0)		// Цвет текста ответа при выборе
MCS.Config.LinesColor = Color(155,155,155)		// Цвет контура интерфейса
MCS.Config.HLLinesColor = Color(255,255,255)		// Цвет углов интерфейса
MCS.Config.EnableBlur = true				// Эффект размытия интерфейса		
		
MCS.Config.SkipButton = "Press LMB to skip"	// Текст кнопки пропуска
MCS.Config.AnswersFont = "MCS_Arial32"		// Шрифт строк ответа
MCS.Config.NPCFont = "MCS_Arial24"		// Шрифт строк NPC
MCS.Config.AnswersAlign = TEXT_ALIGN_LEFT	// Направление текста ответа - TEXT_ALIGN_LEFT TEXT_ALIGN_RIGHT TEXT_ALIGN_CENTER

3. Чтобы начать настройку NPC, войдите на сервер. Откройте консоль разработчика и введите команду mcs_setup чтобы открыть меню настройки.

Примечание: Вам необходимо иметь права суперадминистратора на вашем сервере чтобы открыть меню настройки.

Данное меню имеет такие функции, как автосохранение при закрытии и автосохранение последнего настраиваемого NPC, строку меню с опцией загрузки и сохранения текущего NPC как шаблона.

image12.png

Также Вы можете начать новый проект, выбрав опцию New

image13.png

Настройка NPC

Уникальный ID

image9.png

В данном текстовом поле Вы должны ввести уникальное название для NPC. Каждое название должно быть уникальным для данного сервера. Они также будут использоваться в файле сохранения.

Имя NPC

image2.png

Имя NPC будет отображаться над его головой и в окне диалога. Пример:

image17.png

Расположение имени NPC

image18.png

Вышеуказанный ползунок регулирует высоту имени NPC у него над головой. Полезна при использовании моделей нестандартного роста. Больше информации в разделе расширенная настройка

Ограничение использования

image6.png

Поставив флажок, только один игрок одновременно может использовать NPC. Эта опция необходима, если Вы хотите использовать анимацию в диалоге. Больше информации в разделе Настройка диалога

Тема диалога

image19.png

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

Примечание: Поддерживаемые темы на данный момент - Default, Retro, Hollow Knight

Установка модели и анимации

Чтобы выбрать модель для NPC, скопируйте и вставьте путь до модели в поле. 

image8.png

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

image3.png

To make your NPC animated, enter the animation name inside the “Animation” text box.

image21.png

Чтобы добавить анимацию, введите название анимации в поле “Animation”. Нажав кнопку Get Anim. Вы увидите список всех анимаций для модели, которую Вы используете. По нажатию на одну из них вы сможете её посмотреть и она будет автоматически выбрана.

image7.png

Больше информации про анимации Вы можете найти здесь: old documentation (3.5 Animations).

Позиция спавна

Чтобы добавить позицию спавна для каждой карты, нажмите Add Map

image1.png

Позиция спавна будет для текущей карты будет добавлена автоматически, если ранее её не существовало.

В текстовом поле Вы можете ввести или изменить название карты. Чтобы установить спавн для карт, которых нет в списке, нажмите “all” вместо названия карты.

Чтобы изменить место спавна, нажмите кнопку Edit:

В открывшемся меню Вы можете настроить вектор и угол спавна, нажать Player Pos чтобы скопировать свою позицию, или Ent Pos чтобы скопировать позицию предмета, на который Вы смотрите. Для более точной настройки смотрите Расширенная настройка

image15.png

Настройка диалога

Для добавления строки диалога нажмите “Add Line”.Это добавит новую панель к списку ниже. 

image4.png

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

В первое текстовое поле вписывается реплика NPC, которая поддерживает оператора новой строки ( \n )

В поле “Sound:” по желанию укажите путь к звуку, который будет проигрываться при начатии диалога. Пример в этом видео

Для добавления дополнительных ответов, нажмите “Add Answer”. Для удаления - кнопку “Del”. В случае отсутствия вариантов ответов для диалога, ответ “...” с последующим закрытие разговора будет добавлен автоматически.

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

Если Ваш сервер использует аддоны, поддерживающие “Simple NPCs”, то Вы увидите их в списке. Выбрав аддон из списка, ответ на реплику откроет меню выбранного аддона..

Чтобы добавить анимацию, когда Вы выбираете ответ (как на этом видео) введите название анимации в текстовое поле после кнопки Del. Для быстрого просмотра всех анимаций для модели нажмите кнопку Get. Anim., которая открывает список анимаций. Примечание: Флажок ограничения использования должен быть активирован (смотрите пункт 4.4 ).

Совет: Для длинных и сложных диалогов мы советую создать doc файл со структурой диалога перед началом настройки NPC’ов

Вы можете протестировать диалог, нажав кнопку “Test the dialogs”. Полезно для сложных диалогов.

Сохранение NPC

Для сохранение NPC нажмите “Copy to Clipboard and Close” внизу 

image10.png

или выберите опцию “Copy lua code” в меню Edit на строке меню.

image20.png

Затем откройте sh_npcspawn.lua внутри “MC Simple NPCs/lua/mcs_npcs” и вставьте скопированный текст в конец документа

Для замены или удаления уже существующего NPC просто выделите таблицу этого NPC и удалите её.

NPC’ы автоматически появятся при запуске сервера, Или Вы можете заспавнить их вручную, написав mcs_npcrespawn в консоли разработчика.

Расширенная настройка

Заметка. В расширенной настройке мы будем работать с существующей таблицей NPC, и вам понадобятся знания lua, чтобы сделать это правильно

Структура таблицы NPC:
MCS.Spawns["uid"] = { // uid - уникальный идентификатор для NPC
    name = "Name",  // Имя NPC будет показано игрокам над NPC и через диалог
    model = "models/path/npc.mdl", // Путь к модели
    uselimit = false, // Позволяет только одному игроку использовать NPC в данный момент
    theme = "Theme Name",  // Тема диалога. Поддерживаемые темы на данный момент - Default, Retro, Hollow Knight
    pos = {
         ["map_name"] = {Vector(0,0,0), Angle(0,0,0)}, // фильтр позиции спавна по картам
         ["all"] = {Vector(0,0,0), Angle(0,0,0)}, // Используйте 'all' для спавна npc, даже если в этой таблице нет карты
    },
    bgr = {
        [1] = 2,
        [2] = 0,
    }, // Таблица бодигрупп [ID бодигрупп . Начинается с 0] = Значение бодигруппы. Начинается с 0
    skin = 1, // Устанавливает скин для NPC
    namepos = 30, // Используйте это поле, чтобы установить высоту положения имени NPC над его головой
    sequence = "name of the animation", // id анимации, используйте таблицу (прм.: {"id1", "id2"}) для воспроизведения случайной анимации
    random_dialog = {dialogue id, dialogue id}, // Используйте эту таблицу чтобы начать диалог со случайного, из списка (прм: {1, 3} начнет диалог случайно либо с 1, либо с 3 диалога)
    dialogs = {
        [id диалога, начинается с 1] = {
        ["Line"] = "Текст, который NPC говорит игроку",
        ["Sound"] = "Путь к звуку. Оставьте его пустым, если Вы не хотите использовать звук",
        ["Answers"] = {
                {"Текст ответа", id для следующей строки, "close" чтобы закрыть диалог или таблицу { id, id } для случайного диалога, функция возврата function , функция проверки function },
            },
        }
    }
}

Настройка позиции NPC

Чтобы создать своего NPC на нескольких картах в разных местах, Вы должны добавить новое значение для каждой карты в таблице pos. Ключом к значению является имя карты, само значение - это таблица с позицией и углом NPC. Если Вы хотите создать NPC на картах, которых нет в списке, используйте “all” вместо имени карты.

Заметка. Если Вы создадите две или более разных позиций появления для одной карты, будет работать только одна. Вы не сможете создать одного и того же NPC в нескольких местах на одной карте.

Пример:

pos = {
   ["gm_atomic"] = {Vector(570.41230,760.10539,-3123), Angle(0,90,0)}, // создает NPC на карте gm_atomic
   ["rp_evocity2_v2p"] = {Vector(4213,5345,621), Angle(0,180,0)}, // создает NPC на карте rp_evocity2_v2p
   ["all"] = {Vector(0,0,0), Angle(0,0,0)}, // создает NPC на всех остальных картах
},

Настройка скина и “бодигрупп”

Чтобы установить скин, если используемая модель имеет несколько скинов, просто добавьте skin = skin_id, строку к таблице NPC, где skin_id это номер вашего скина.

Для “бодигрупп” - добавить таблицу bgr = {[1] = 2,[2] = 0,}, Структура таблици:

[Идентификатор bodygroup, которую вы устанавливаете. Начинается с  0] =Значение, которое вы устанавливаете для bodygroup. Начинается с 0

Заметка. Мы рекомендую использовать Easy Bodygroup Tool для быстрой настройки

Пример:

Давайте дадим клипборд Др. Кляйнеру

  model = "models/kleiner.mdl",
  bgr = {[1] = 1},
  sequence = "lineidle03",

image14.png

Случайная анимация

Чтобы ваш NPC проигрывал случайную анимацию каждый раз, когда он появляется, просто создайте таблицу на строчке sequence.

Пример:

NPC будет появляться с одной из этих 3 анимаций

 sequence = {"scaredidle","lineidle02","lineidle01"},

image11.png

Корректировка имени NPC

Чтобы настроить высоту имени над NPC, добавьте namepos = number, строчку в таблицу с NPC. Это может быть полезно, если вы используете большие или маленькие модели.

Пример:

NPC использует анимацию приседания, и мы немного сдвигаем имя

 namepos = 30,

image16.png

Начало случайного диалога

Чтобы начать диалог со случайного предложения Вы можете добавить параметр random_dialog = {номер id, номер id, номер id},  в таблицу NPC после того, как закончите основную настройку. Когда игрок начинает диалог с NPC, В случайном порядке выбирается ID предложения для начала диалога вместо использования первого предложения в установленном порядке.

Полезно для вариативности часто используемых NPC.

Пример:

Параметр случайно выберет первое, второе или пятое предложение на место первого

 random_dialog = {1, 2, 5},

Случайный диалог после ответа

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

Пример:

Параметр случайно выберет 4ое, 5ое, 6ое, или 7ое предложение как ответ

["Answers"] = {
   {"Tell me a joke!", {4, 5, 6, 7} },
},

Дополнительные функции для таблицы ответов:

Функция возврата

Описание: Эта функция вызывается на стороне клиента, когда игрок выбирает ответ, выставите значение nil, чтобы игнорировать ее.

Пример 1:

Отправляет сетевое сообщение на сервер

["Answers"] = {
   {"Show me what you got", "close", function() net.Start(“Open_some_menu”) net.SendToServer() end},
},

Пример 2:

Игнорирует функцию обратного вызова при использовании функции проверки

["Answers"] = {
   {"I’m fine", "close", nil ,function() return LocalPlayer():Health() >= 100 end},
},
Функция проверки ( Entity npc )

Описание: Клиентская функция, которая управляет добавлением ответа в список или нет. Должена возвращать логическое значение

Аргументы: Объект откуда эта функция была вызвана

Пример 1:

Отправляет сетевое сообщение на сервер при условии если у игрока меньше 100 здоровья

["Answers"] = {
   {"I’m fine", "close", nil ,function() return LocalPlayer():Health() >= 100 end},
   {"I’m injured", "close", function() net.Start(“Buy_Health”) net.SendToServer() end, function() return LocalPlayer():Health() < 100 end},
},

Шаблон для выбора работы через NPC:

Меняет работу на “Гражданскую оборону”.
Заметка: Если вы хотите начать голосование за смену должности, добавьте “vote” перед командой работы (см.строку 3)

["Answers"] = {
   {"I want to become a CP", "close", function() RunConsoleCommand("darkrp", "cp" ) end},
   {"I want to be a mayor", "close", function() RunConsoleCommand("darkrp", "votemayor" ) end},
},