#include <storyline>

Особенности:
- ■ Прямое подключение к базе данных MySQL R41. Автоматическая загрузка и сохранение данных игроков.
■ Простота взаимодействия с системой.
Что из себя представляет система? Если объяснять простым языком, вы можете создавать "истории", каждая история имеет свои "ответвления", а каждое ответвление имеет свои "шаги" выполнения. После создания истории, вы можете задать её игроку, указав при этом ответвление. Система автоматически определяет на каком шагу остановился игрок. Если задано впервые, всё начинается с начала. Когда игрок выполняет то или иное действие, вы обновляете игроку статус этой истории, далее система определяет следующий шаг, после чего вы указываете следующие действие, которое необходимо сделать игроку. Если игрок выполнит все шаги, система сообщит вам об этом, после чего данная история и это ответвление завершается для игрока. Задать повторно не получится, система сообщит, что игрок уже завершил это. Одновременно может быть активна только одна задача у игрока, но при переключении на другую - прогресс сохраняется.
Пример использования Storyline (ссылка)
Покажу, как это выглядит в коде. Создаём истории:
enum Storyline:E_STORYLINE_STORY // при создании необходимо использовать специальный тег 'Storyline:' { STORY_A = 1, // история с именем 'A' STORY_B = 2 // история с именем 'B' }

Далее создаём ответвления для каждой истории:
enum Storyline:E_STORY_A // история 'A' имеет 3 ответвления { LINE_A1 = 1, // ответвление с именем 'A1' LINE_A2 = 2, // ответвление с именем 'A2' LINE_A3 = 3 // ответвление с именем 'A3' } enum Storyline:E_STORY_B // история 'B' имеет 1 ответвление { LINE_B1 = 1 // ответвление с именем 'B1' }

Теперь создаём для каждого ответвления шаги выполнения:
enum Storyline:E_LINE_A1 // ответвление 'A1' имеет 3 шага { STEP_A1_1 = 1, STEP_A1_2 = 2, STEP_A1_3 = 3 } enum Storyline:E_LINE_A2 // ответвление 'A2' имеет 2 шага { STEP_A2_1 = 1, STEP_A2_2 = 2 } enum Storyline:E_LINE_A3 // ответвление 'A1' имеет 4 шага { STEP_A3_1 = 1, STEP_A3_2 = 2, STEP_A3_3 = 3, STEP_A3_4 = 4 } enum Storyline:E_LINE_B1 // ответвление 'B1' имеет 6 шагов { STEP_B1_1 = 1, STEP_B1_2 = 2, STEP_B1_3 = 3, STEP_B1_4 = 4, STEP_B1_5 = 5, STEP_B1_6 = 6 }

Созданы истории, в каждой истории есть свои ответвления, у каждого ответвления есть свои шаги. Их количество не ограничивается со стороны системы. Рекомендую явно указывать позицию элемента (после знака '='), чтобы в будущем у вас ничего не перепуталось, если вы измените порядок в списке. Имена 'A' и 'B' используются только для примера, вы сами решаете, как называть элементы.
Переходим к инициализации элементов. В OnGameModeInit необходимо выполнить следующее: используем функцию UpdateStoryline(story, line, step), где story - номер истории, line - номер ответвления, step - общее количество шагов в указанном ответвлении.
public OnGameModeInit() { UpdateStoryline(STORY_A, LINE_A1, E_LINE_A1); // инициализируем все истории и их ответвлениях UpdateStoryline(STORY_A, LINE_A2, E_LINE_A2); UpdateStoryline(STORY_A, LINE_A3, E_LINE_A3); UpdateStoryline(STORY_B, LINE_B1, E_LINE_B1); return 1; }

Удалять данные строки после первого создания - не нужно. В случае, если у вас изменится количество шагов в каком-либо ответвление, при запуске система обновит автоматически это в базе данных.
После того, как всё инициализировано, переходим к игроку. Например, игрок встал на пикап, который выбирает для него историю STORY_A и ответвление LINE_A1:
{ SelectPlayerStoryline(playerid, STORY_A, LINE_A1); }

После использования функции SelectPlayerStoryline, будет вызыван колбэк OnPlayerStoryline(playerid, story, line, step, status), где story - номер истории, line - номер ответвления, step - номер шага, status - статус вызова.
Возможные статусы вызова:
■ STORYLINE_STATUS_ACTIVE - игрок выполняет задание
■ STORYLINE_STATUS_FINISH - игрок завершил выполнение задания
■ STORYLINE_STATUS_COMPLETED - игрок уже завершал данное задание
■ STORYLINE_STATUS_CANCEL - выполнение задания отменено с помощью функции CancelPlayerStoryline
■ STORYLINE_STATUS_DELETE - выполнение задания отменено с помощью функции DestroyStoryline
■ STORYLINE_STATUS_UNKNOWN - указано несуществующее задание
В OnPlayerStoryline мы определяем все действия для игрока, что ему необходимо сделать в том или ином задании. Пример использования:
public OnPlayerStoryline(playerid, story, line, step, status) { switch(story) { case STORY_A: { switch(line) { case LINE_A1: { switch(step) { case STEP_A1_1: { } case STEP_A1_2: { } case STEP_A1_3: { } } } case LINE_A2: { switch(step) { case STEP_A2_1: { } case STEP_A2_2: { } } } case LINE_A3: { switch(step) { case STEP_A3_1: { } case STEP_A3_2: { } case STEP_A3_3: { } case STEP_A3_4: { } } } } } case STORY_B: { switch(line) { case LINE_B1: { switch(step) { case STEP_B1_1: { } case STEP_B1_2: { } case STEP_B1_3: { } case STEP_B1_4: { } case STEP_B1_5: { } case STEP_B1_6: { } } } } } } }

Привёл пример с разбиением всего на switch, но на практике большинство действий перечисляется в массиве подобным образом:
SetPlayerCheckpoint(playerid, pos[story][line][step], pos[story][line][step], pos[story][line][step], 5.0);

После того, как игрок выполняет указанное действие, вам достаточно использовать функцию UpdatePlayerStoryline(playerid) и система автоматически перенаправит игрока на выполнение следующего шага.
Весь функционал системы:
Также имеются дополнительные опции, для активации необходимо создать макрос с именем перед подключением инклуда:
■ STORYLINE_SETTING_AUTO_SELECT - изменяет архитектуру строения всех ответвлений таким образом, что они перестраиваются последовательно друг за другом. Для функции SelectPlayerStoryline больше не нужно указывать ответвление, оно определяется автоматически, а при выполнение всех шагов, система автоматически переключает игрока на следующее ответвление.
■ STORYLINE_SETTING_AUTO_UP - при использовании данной опции, в случае изменения количества шагов в одном из ответвлений в большую сторону (было 1, стало 2), всем игрокам, которые уже завершили прохождение данного ответвления, можно будет задать его снова с последнего сохранённого шага.
■ STORYLINE_SETTING_AUTO_DOWN - при использовании данной опции, в случае изменения количества шагов в одном из ответвлений в меньшую сторону (было 2, стало 1), всем игрокам, которые уже дошли до этого и более шага, будет засчитано прохождение данного ответвления, его больше нельзя будет задать игроку.
■ STORYLINE_SETTING_QUERY - при использовании данной опции, добавляется новая функция:
Скачать:

Сообщение отредактировал M I S T E V: 15 июня 2025 - 01:06