NASC — справочник

цвет ссылки:ФункцииОбъектыСобытияEnum

КВЕСТЫ И ПАМЯТЬ КВЕСТОВ (Quest / Memo)

26 функций

HaveMemoGLOBAL🟢 высокая

взят ли квест

Самая частая проверка во всей группе: есть ли у персонажа cCreature активный memo указанного квеста nQuestId (идентификатор из [quest_pch]). Функция принадлежит глобальному объекту (gg). Возвращает единицу (@TRUE), если квест взят, и ноль, если нет.

Сигнатура

HaveMemo( CSharedCreatureData cCreature, int nQuestId )

Параметры

cCreature (CSharedCreatureData) — кого проверяем.
nQuestId (int) — квест.
    значения — из словаря [quest_pch]

Пример

if ( HaveMemo( talker, @the_wishing_potion ) == 0 ) {

Пример использования

if ( HaveMemo( target, @relics_of_the_old_empire ) == 1 ) {
    random1_list.SetInfo( 0, target );
}

GetMemoStateGLOBAL🟢 высокая

прочитать стадию квеста

Читает числовое состояние квеста — то, что записал SetMemoState, — для персонажа cCreature и квеста nQuestId (из [quest_pch]). Функция принадлежит глобальному объекту (gg). Если memo нет, обычно возвращает ноль.

Сигнатура

GetMemoState( CSharedCreatureData cCreature, int nQuestId )

Параметры

cCreature (CSharedCreatureData) — игрок.
nQuestId (int) — квест.
    значения — из словаря [quest_pch]

Пример

i0 = GetMemoState( talker, @supplier_of_reagents );

Пример использования

if ( HaveMemo( talker, @succession_to_the_legend_shillien_saint ) == 1 && talker.occupation == @shillien_elder && GetMemoState( talker, @succession_to_the_legend_shillien_saint ) == 14 && OwnItemCount( talker, @q_resonance_amulet6_29 ) == 0 && myself.i_quest0 == 1 && myself.sm.param2 == talker.dbid ) {
    ShowPage( talker, "abyss_maiden_elcardia_q0098_0110.htm" );
}

GetMemoStateExGLOBAL🟢 высокая

прочитать значение из дополнительного слота

Читает значение из дополнительного слота nSlot состояния квеста nQuestId (из [quest_pch]) для персонажа cCreature — парная к SetMemoStateEx. Функция принадлежит глобальному объекту (gg); индекс слота — в диапазоне 0…3.

Сигнатура

GetMemoStateEx( CSharedCreatureData cCreature, int nQuestId, int nSlot )

Параметры

cCreature (CSharedCreatureData) — игрок.
nQuestId (int) — квест.
    значения — из словаря [quest_pch]
nSlot (int) — индекс слота 03.

Пример

i2 = GetMemoStateEx( talker, @gourd_event, 1 );

Пример использования

i0 = GetMemoStateEx( talker, @seductive_whispers, 1 );
if ( i0 < 0 ) { i0 = 0; }

GetDailyQuestFlagGLOBAL🟢 высокая

проверить флаг ежедневного квеста

Проверяет отметку выполнения суточного квеста nQuestId (из [quest_pch]) для персонажа cCreature. Функция принадлежит глобальному объекту (gg). Флаг автоматически сбрасывается раз в сутки рано утром, после чего квест снова доступен.

Сигнатура

GetDailyQuestFlag( CSharedCreatureData cCreature, int nQuestId )

Параметры

cCreature (CSharedCreatureData) — игрок.
nQuestId (int) — ежедневный квест.
    значения — из словаря [quest_pch]

Пример

if (GetDailyQuestFlag(talker, @daily_queen_ant) == 1)

Пример использования

if (HaveMemo(talker, @proof_of_valrakas_hunting) == @FALSE && GetDailyQuestFlag(talker, @proof_of_valrakas_hunting) == @TRUE && OwnItemCount(talker, @q_floating_stone) >= 1 && talker.level >= 84) {
    ShowPage(talker, "watcher_valakas_klein_q0907_05.htm");
}

SetDailyQuestFlagGLOBAL🟢 высокая

поставить флаг ежедневного квеста

Отмечает, что персонаж cCreature выполнил ежедневный (суточный) квест nQuestId (из [quest_pch]). Парная к GetDailyQuestFlag; флаг автоматически сбрасывается раз в сутки рано утром, после чего квест снова доступен.

Сигнатура

SetDailyQuestFlag( CSharedCreatureData cCreature, int nQuestId )

Параметры

cCreature (CSharedCreatureData) — существо, которому ставится флаг выполнения ежедневного квеста
nQuestId (int) — идентификатор ежедневного квеста из словаря [quest_pch]
    значения — из словаря [quest_pch]

Пример

SetDailyQuestFlag(talker, @promise);

Пример использования

else {
    SetDailyQuestFlag( talker, @daily_fall_of_the_dragon );
    CastBuffForQuestReward( talker, CHECK_SKILL );
    ShowPage( talker, "nevit_s_herald003.htm" );
}

SetMemoNPC🟢 высокая

выдать (зарегистрировать) квест

Создаёт у персонажа (аргумент cCreature, обычно talker) запись-memo о квесте — фактически выдаёт задание и регистрирует его как активное. Второй аргумент nQuestId — идентификатор квеста из словаря [quest_pch]. Дальше состоянием квеста управляют SetMemoState/GetMemoState; назначение возвращаемого значения не подтверждено.

Сигнатура

SetMemo( CSharedCreatureData cCreature, int nQuestId )

Параметры

cCreature (CSharedCreatureData) — кому выдаём квест (обычно talker).
nQuestId  (int) — идентификатор квеста (@...).
    значения — из словаря [quest_pch]

Пример

SetMemo( c1, @blood_offering );

Пример использования

if ( HaveMemo( talker, @gourd_event ) == 0 ) {
    SetMemo( talker, @gourd_event );
}

RemoveMemoNPC🟢 высокая

снять квест

Удаляет memo квеста у персонажа cCreature: задание завершено или от него отказались. Второй аргумент nQuestId — квест из [quest_pch]. После вызова HaveMemo для этого квеста начнёт возвращать ноль; назначение возвращаемого значения не подтверждено.

Сигнатура

RemoveMemo( CSharedCreatureData cCreature, int nQuestId )

Параметры

cCreature (CSharedCreatureData) — у кого убираем квест.
nQuestId  (int) — квест.
    значения — из словаря [quest_pch]

Пример

RemoveMemo( c1, @blood_offering );

Пример использования

if ( i2 < 1262221261 ) {
    RemoveMemo( talker, @gourd_event );
}

GetMemoCountNPC🟢 высокая

сколько у игрока квестов

Возвращает число активных memo (одновременно взятых квестов) у персонажа cCreature. Используется как страховка от переполнения: новый квест выдают, только если их меньше предельного количества.

Сигнатура

GetMemoCount( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — чьи квесты считаем.

Пример

if ( GetMemoCount( talker ) < @MAX_QUEST_NUM ) {

Пример использования

if ( GetMemoCount( talker ) >= 25 ) {
    ShowPage( talker, "fullquest.htm" );
    return;
}

SetMemoStateNPC🟢 высокая

записать стадию квеста

Записывает числовое состояние (стадию) квеста: для персонажа cCreature и квеста nQuestId (из [quest_pch]) задаёт значение nState. Семантику числа полностью определяет сам скрипт квеста — где-то это 1, 2, 3, где-то десятки и даже десятки тысяч; значение можно как присваивать, так и наращивать, читая прежнее.

Сигнатура

SetMemoState( CSharedCreatureData cCreature, int nQuestId, int nState )

Параметры

cCreature (CSharedCreatureData) — игрок.
nQuestId  (int) — квест.
    значения — из словаря [quest_pch]
nState    (int) — новое состояние/стадия.

Пример

SetMemoState( c1, @testimony_of_trust, 3 );

Пример использования

if ( reply == 71 && HaveMemo( talker, @in_the_name_of_evil_part2 ) == 1 && GetMemoState( talker, @in_the_name_of_evil_part2 ) == 407 && GetOneTimeQuestFlag( talker, @in_the_name_of_evil_part2 ) == 0 ) {
    SetMemoState( talker, @in_the_name_of_evil_part2, 408 );
    ShowPage( talker, "asama_q0126_26.htm" );
}

SetMemoStateExNPC🟢 высокая

записать значение в дополнительный слот

Записывает значение nState в дополнительный слот nSlot состояния квеста nQuestId (из [quest_pch]) для персонажа cCreature. В отличие от SetMemoState с одним основным состоянием, даёт несколько независимых числовых ячеек, адресуемых по номеру слота (индексы 0…3 — четыре ячейки на квест).

Сигнатура

SetMemoStateEx( CSharedCreatureData cCreature, int nQuestId, int nSlot, int nState )

Параметры

cCreature (CSharedCreatureData) — игрок.
nQuestId  (int) — квест.
    значения — из словаря [quest_pch]
nSlot     (int) — индекс слота 03 (4 ячейки на квест: 0→nState, 1→nState2, 2→nState3, 3→nState4). Подтверждено исходником.
nState    (int) — значение в слот.

Пример

SetMemoStateEx( talker, @four_goblets, 2, i0 );

Пример использования

if ( ( i0 % 10 ) == 0 ) {
    SetMemoStateEx( talker, @resurrection_of_old_manager, 1, ( i0 + 1 ) );
}

SetFlagJournalNPC🟢 высокая

обновить шаг в журнале

Меняет видимый игроку шаг квеста в окне заданий: для персонажа cCreature и квеста nQuestId (из [quest_pch]) задаёт отображаемый номер шага nStep. Это «витрина» задания, тогда как SetMemoState — его внутренняя кухня; часто оба вызова стоят рядом и оперируют одним числом, но иногда внутреннее состояние и отображаемый шаг намеренно расходятся.

Сигнатура

SetFlagJournal( CSharedCreatureData cCreature, int nQuestId, int nStep )

Параметры

cCreature (CSharedCreatureData) — игрок.
nQuestId (int) — квест.
    значения — из словаря [quest_pch]
nStep (int) — номер шага для отображения.

Пример

SetFlagJournal( c1, @testimony_of_life, 5 );

Пример использования

if ( OwnItemCount( c1, @ol_mahum_runestone ) >= 1 && OwnItemCount( c1, @turek_runestone ) >= 1 && OwnItemCount( c1, @turak_bugbear_runestone ) >= 1 ) {
    SetFlagJournal( c1, @trial_of_the_seeker, 5 );
    ShowQuestMark( c1, @trial_of_the_seeker );
}

ShowQuestMarkNPC🟢 высокая

значок квеста

Показывает игроку cCreature индикатор задания — тот самый значок-эффект при получении квеста для конкретного квеста nQuestId (из [quest_pch]). Обычно вызывается сразу после выдачи memo.

Сигнатура

ShowQuestMark( CSharedCreatureData cCreature, int nQuestId )

Параметры

cCreature (CSharedCreatureData) — игрок.
nQuestId (int) — квест.
    значения — из словаря [quest_pch]

Пример

ShowQuestMark( c1, @testimony_of_life );

ShowQuestionMarkNPC🟢 высокая

знак вопроса

Показывает игроку cCreature над головой значок квеста. Второй аргумент nQuestId — идентификатор квеста из [quest_pch]: показывается значок именно этого квеста. В скриптах он записан сырым числом (значением из [quest_pch]), а не @-именем, поэтому поначалу выглядит как абстрактный «код»; проверка подтвердила совпадение этих чисел с ID квестов (малые 1…32 — классический диапазон, большие 10021…10650 — расширенный и кастомный).
Связанное событие: клик по «?» приходит событием QUESTION_MARK_CLICKED(talker, question_id) (см. NASC_HANDLERS).

Сигнатура

ShowQuestionMark( CSharedCreatureData cCreature, int nQuestId )

Параметры

cCreature (CSharedCreatureData) — игрок.
nQuestId  (int) — квест, чей значок показать.
    значения — из словаря [quest_pch]

Пример

ShowQuestionMark(talker, 26);

Пример использования

if ( i3 == 3 ) {
    ShowQuestionMark( talker, 5 );
    SoundEffect( talker, "ItemSound.quest_tutorial" );
}

ShowQuestionMark2NPC🟢 высокая

расширенный значок квеста (гипотеза)

Отложенный вариант ShowQuestionMark: показывает значок квеста не сразу, а через заданную задержку. По декомпилю движок ставит таймер (CShowQuestionMarkTimer) и по его срабатывании показывает над головой существа значок квеста nQuestId. Первый числовой аргумент — ID квеста из [quest_pch] (как у ShowQuestionMark), второй — задержка в СЕКУНДАХ (внутри переводится в мс: nDelay·1000). Живых вызовов в скриптах не найдено.
Связанное событие: клик по «?» приходит событием QUESTION_MARK_CLICKED(talker, question_id) (см. NASC_HANDLERS).

Сигнатура

ShowQuestionMark2( CSharedCreatureData cCreature, int nQuestId, int nDelay )

Параметры

    cCreature (CSharedCreatureData) — существо, которому показывается значок вопроса
    nQuestId  (int) — идентификатор квеста из словаря [quest_pch]
    nDelay    (int) — задержка в секундах до показа значка (движок ставит таймер на nDelay·1000 мс). Подтверждено декомпилем.

Пример (иллюстративный):

    ShowQuestionMark2( talker, nQuestId, nDelay );

ShowQuestPageNPC🟢 высокая

html-страница квеста

Показывает игроку cCreature html-страницу диалога (аргумент sHtmlName — имя html-файла), привязанную к конкретному квесту nQuestId (из [quest_pch]). По сути это ShowPage, но с указанием задания, чтобы окно открылось в правильном квестовом контексте.

Сигнатура

ShowQuestPage( CSharedCreatureData cCreature, string sHtmlName, int nQuestId )

Параметры

cCreature (CSharedCreatureData) — игрок.
sHtmlName (string) — имя html-файла.
nQuestId  (int) — квест.
    значения — из словаря [quest_pch]

Пример

ShowQuestPage(talker, "arujien_q0002_00.htm", @what_women_want);

Пример использования

if ( GetMemoCount( talker ) < @MAX_QUEST_NUM ) {
    ShowQuestPage( talker, "blacksmith_wilbert_q0663_01.htm", @seductive_whispers );
} else {
    ShowPage( talker, "fullquest.htm" );
}

ShowQuestFHTMLNPC🟢 высокая

квестовая страница из объекта html

Делает то же, что ShowQuestPage, но страница не берётся из готового файла, а собирается на лету как объект CFHTML (аргумент fhtml). Третий аргумент nQuestId — квест из [quest_pch]. Прямых вызовов в коллекции не найдено.

Сигнатура

ShowQuestFHTML( CSharedCreatureData cCreature, CFHTML fhtml, int nQuestId )

Параметры

cCreature (CSharedCreatureData) — игрок.
fhtml     (CFHTML) — объект динамического html.
nQuestId  (int) — квест.
    значения — из словаря [quest_pch]

Пример

ShowQuestFHTML( talker, fhtml0, @black_swan );

ShowQuestInfoListNPC🟢 высокая

список квестов NPC

Открывает игроку cCreature список или окно квестов данного NPC — перечень доступных заданий. Прямых вызовов в коллекции не найдено.

Сигнатура

ShowQuestInfoList( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок.

Пример

ShowQuestInfoList(talker);

SetCurrentQuestIDNPC🟢 высокая

назначить «текущий квест»

Объявляет, какой квест nQuestId (из [quest_pch]) считается текущим в этой обработке: после вызова последующие квестовые действия NPC относятся к этому заданию. Обычно стоит в самом начале разбора выбора игрока в диалоге; назначение возвращаемого значения не подтверждено.

Сигнатура

SetCurrentQuestID( int nQuestId )

Параметры

nQuestId (int) — квест, делаемый «текущим».
    значения — из словаря [quest_pch]

Пример

SetCurrentQuestID( @q_mimirs_elixir );

Пример использования

if ( _from_choice == 0 || ( HaveMemo( talker, @find_sir_windawood ) == 0 && GetOneTimeQuestFlag( talker, @find_sir_windawood ) == 1 ) ) {
    SetCurrentQuestID( @find_sir_windawood );
    ShowPage( talker, "finishedquest.htm" );
}

CheckAndSetTransactMemoNPC🟢 высокая

защита от двойной выдачи

Атомарный «замок» транзакции для персонажа cCreature: одним действием проверяет, не идёт ли уже операция для этого игрока, и тут же ставит флаг занятости. Возвращает @TRUE, если можно продолжать (замок успешно взят), и @FALSE, если выдача уже выполняется, — тогда скрипт прерывается и награда не уходит дважды. Парная ResetTransactMemo снимает замок (коммитит транзакцию) после успешного завершения операции.

Сигнатура

CheckAndSetTransactMemo( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок.

Пример

if ( CheckAndSetTransactMemo( talker ) == @FALSE ) { return; }

Пример использования

if ( CheckAndSetTransactMemo( talker ) ) {
    GiveItem1( talker, @q_adventure_coupon1, 1 ); 
    SetOneTimeQuestFlag( talker, @207, 1 ); 
    ShowPage( talker, fnCoupon1Ok );
}

TriggerCompleteQuestNPC🟢 высокая

асинхронно завершить квест

Ставит в очередь атомарную серверную задачу, которая асинхронно помечает квест nQuestId (из [quest_pch]) завершённым для персонажа cCreature. В отличие от ручной связки RemoveMemo плюс SetOneTimeQuestFlag, выполняется движком как единая транзакция — без гонок, с обновлением всей серверной бухгалтерии завершения квеста.

Сигнатура

TriggerCompleteQuest( CSharedCreatureData cCreature, int nQuestId )

Параметры

cCreature (CSharedCreatureData) — игрок.
nQuestId (int) — квест.

Пример

TriggerCompleteQuest(target, @tiat);

GetAccountQuestCompleteCountNPC🟢 высокая

счётчик завершений на аккаунт

Читает счётчик завершений квеста nQuestId (из [quest_pch]) на игровой аккаунт персонажа c, а не на отдельного персонажа. Применяется для лимитов «один раз на аккаунт» — для награды или квеста, который нельзя пройти повторно другим персонажем того же аккаунта.

Сигнатура

GetAccountQuestCompleteCount( CSharedCreatureData c, int nQuestId )

Параметры

    c (CSharedCreatureData) — игрок (берётся его аккаунт).
    nQuestId (int) — квест.

Пример (иллюстративный):

    GetAccountQuestCompleteCount( talker, nQuestId );

IncrementAccountQuestCompleteCountNPC🟢 высокая

увеличить счётчик завершений на аккаунт

Увеличивает счётчик завершений квеста nQuestId (из [quest_pch]) на игровой аккаунт персонажа c. Парная к GetAccountQuestCompleteCount; служит для лимитов «один раз на аккаунт».

Сигнатура

IncrementAccountQuestCompleteCount( CSharedCreatureData c, int nQuestId )

Параметры

    c (CSharedCreatureData) — существо, на чей игровой аккаунт увеличивается счётчик завершений квеста
    nQuestId (int) — идентификатор квеста из словаря [quest_pch]

Пример (иллюстративный):

    IncrementAccountQuestCompleteCount( talker, nQuestId );

GetOneTimeQuestFlagNPC🟢 высокая

проверить флаг однократного события

Читает флаг однократного квеста или события для персонажа cCreature — отметку, что он уже делал нечто неповторимое. Второй аргумент nFlagId резолвится через [quest_pch] (в скриптах бывает и числом). Возвращает единицу, если уже сделано, иначе ноль; часто стоит сразу за проверкой HaveMemo, чтобы отличить «квест ещё не взят» от «квест уже когда-то пройден».

Сигнатура

GetOneTimeQuestFlag( CSharedCreatureData cCreature, int nFlagId )

Параметры

cCreature (CSharedCreatureData) — игрок.
nFlagId   (int) — идентификатор однократного квеста/события.
    значения — из словаря [quest_pch]

Пример

if ( GetOneTimeQuestFlag( talker, @in_the_name_of_evil_part1 ) == 0 ) {

Пример использования

if ( HaveMemo( talker, @in_the_name_of_evil_part2 ) == 0 && talker.level >= 77 && GetOneTimeQuestFlag( talker, @in_the_name_of_evil_part1 ) != 0 && GetOneTimeQuestFlag( talker, @in_the_name_of_evil_part2 ) == 0 ) {
    ShowPage( talker, "asama_q0126_05.htm" );
}

SetOneTimeQuestFlagNPC🟢 высокая

поставить флаг однократного события

Ставит или сбрасывает флаг однократного квеста/события для персонажа cCreature: аргумент nFlagId (из [quest_pch]) задаёт событие, а nValue равный 1 помечает как выполненное, 0 — снимает отметку. Парная к GetOneTimeQuestFlag.

Сигнатура

SetOneTimeQuestFlag( CSharedCreatureData cCreature, int nFlagId, int nValue )

Параметры

cCreature (CSharedCreatureData) — игрок.
nFlagId   (int) — идентификатор однократного квеста/события.
    значения — из словаря [quest_pch]
nValue    (int) — 1 — выполнено, 0 — сброс.

Пример

SetOneTimeQuestFlag( talker, @blood_fiend, 1 );

Пример использования

if ( i1 > 0 ) {
    SetOneTimeQuestFlag( c0, i1, 0 );
}

CastBuffForQuestReward2NPC🟢 высокая

баф как награда

Накладывает на персонажа cCreature (часто это myself.sm) баф в качестве награды или эффекта квеста, задавая умение по имени-идентификатору nSkillNameId из словаря [skill_pch]. Это «сервисный» каст: он не зависит от очереди желаний и боевых ограничений, поэтому срабатывает гарантированно.

Сигнатура

CastBuffForQuestReward2( CSharedCreatureData cCreature, int skillname_id )

Параметры

cCreature (CSharedCreatureData) — цель бафа (часто myself.sm).
skillname_id (int) — умение/баф (@s_...).

Пример

CastBuffForQuestReward2( talker, @s_wind_walk2);

Пример использования

if ( i5 <= 0 && Rand( 100 ) < LongRangeGuardRate ) {
    CastBuffForQuestReward2( myself.sm, @s_npc_ultimate_defence3 );
}

CastBuffForQuestRewardNPC🟢 высокая

баф как награда (старый вариант)

Более старый вариант CastBuffForQuestReward2 — накладывает баф-награду на персонажа cCreature. Второй аргумент — умение-баф из словаря [skill_pch] (в вызовах @s_npc_haste1, @s_npc_ultimate_defence3 или локальная переменная Buff, хранящая такой id).

Сигнатура

CastBuffForQuestReward( CSharedCreatureData cCreature, int nSkillNameId )

Параметры

cCreature    (CSharedCreatureData) — цель бафа.
nSkillNameId (int) — умение/баф (@s_...).
    значения — из словаря [skill_pch]

Пример

CastBuffForQuestReward( talker, @s_npc_haste1 );

Пример использования

if ( DistFromMe( c0 ) <= 75 ) {
    CastBuffForQuestReward( c0, Buff ); 
}

ПРЕДМЕТЫ (Item)

18 функций

OwnItemCountGLOBAL🟢 высокая

суммарное количество предметов класса у существа

Возвращает суммарное число предметов класса nItemClassId (из [item_pch]), которые есть у существа c (обычно talker). Заточка и аугментация при этом игнорируются — считаются все экземпляры. Базовый способ проверить наличие квестового предмета или узнать сумму адены.

Сигнатура

OwnItemCount( CSharedCreatureData c, int nItemClassId )

Параметры

c (CSharedCreatureData) — у кого считаем (обычно talker).
nItemClassId (int) — класс предмета (@adena, @official_letter…).
    значения — из словаря [item_pch]

Пример

i1 = OwnItemCount( talker, @q_watching_eyes );

Пример использования

if ( HaveMemo( talker, @succession_to_the_legend_shillien_saint ) == 1 && talker.occupation == @shillien_elder && GetMemoState( talker, @succession_to_the_legend_shillien_saint ) == 14 && OwnItemCount( talker, @q_resonance_amulet6_29 ) == 0 && myself.i_quest0 == 1 && myself.sm.param2 == talker.dbid ) {
    ShowPage( talker, "abyss_maiden_elcardia_q0098_0110.htm" );
}

OwnItemCount2GLOBAL🟢 высокая

подсчёт предметов с учётом аугментации

То же, что OwnItemCount, но с дополнительным флагом bFindAugment: у существа c считается число предметов класса nItemClassId (из [item_pch]), и при bFindAugment = 1 подсчёт ведётся с учётом аугментации, а при 0 функция ведёт себя как обычный OwnItemCount.

Сигнатура

OwnItemCount2( CSharedCreatureData c, int nItemClassId, int bFindAugment )

Параметры

    c (CSharedCreatureData) — у кого считаем.
    nItemClassId (int) — класс предмета.
    bFindAugment (int) — учитывать аугментацию (0/1).

Пример (иллюстративный):

    OwnItemCount2( talker, nItemClassId, bFindAugment );

OwnItemCountEx2GLOBAL🟢 высокая

подсчёт с фильтром по заточке и аугментации

Самый полный счётчик: у существа c подсчитывает предметы класса nItemClassId (из [item_pch]), фильтруя одновременно по уровню заточки nEnchantLevel и по аугментации (bFindAugment, 0/1). Объединяет возможности OwnItemCountEx и OwnItemCount2.

Сигнатура

OwnItemCountEx2( CSharedCreatureData c, int nItemClassId, int nEnchantLevel, int bFindAugment )

Параметры

    c (CSharedCreatureData) — у кого считаем.
    nItemClassId (int) — класс предмета.
    nEnchantLevel (int) — требуемый уровень заточки.
    bFindAugment (int) — учитывать аугментацию (0/1).

Пример (иллюстративный):

    OwnItemCountEx2( talker, nItemClassId, nEnchantLevel, bFindAugment );

OwnItemEnchantCountGLOBAL🟢 высокая

уровень заточки имеющегося предмета

Возвращает уровень заточки предмета класса nItemClassId (из [item_pch]), имеющегося у существа c — НЕ число штук (имя обманчиво). Если предмета нет, возвращает 0. Если у игрока несколько подходящих экземпляров с разной заточкой, функция вернёт заточку ПОСЛЕДНЕГО найденного при обходе инвентаря (не максимум и не сумму) — на это полагаться не стоит, проверка рассчитана на единичный предмет.

Сигнатура

OwnItemEnchantCount( CSharedCreatureData cCreature, int nItemClassId )

Параметры

cCreature    (CSharedCreatureData) — у кого смотрим.
nItemClassId (int) — класс предмета.
    значения — из словаря [item_pch]

Пример

i0 = OwnItemEnchantCount(talker, @ev_fake_dualblunt);
i0 = OwnItemEnchantCount( talker, talker.equiped_weapon_class_id );
i0 = OwnItemEnchantCount( talker, yogy_staff );

GetItemCollectableGLOBAL🟢 высокая

есть ли спойл-предметы, готовые к сбору

Возвращает 1, если у существа cCreature есть спойл-предметы, готовые к сбору, иначе 0. По сути это проверка, можно ли сейчас свиповать (собрать) добычу со спойленного моба.

Сигнатура

GetItemCollectable( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — проверяемое существо (моб со спойлом).

Пример

if (GetItemCollectable(myself.sm) == @TRUE)

Пример использования

if ( GetItemCollectable( myself.sm ) == 1 ) {
    if ( Rand( 5 ) < 2 ) {
        CreateOnePrivateEx( @dragon_knight_5, "dragon_knight_5", 0, 0, FloatToInt( myself.sm.x ), FloatToInt( myself.sm.y ), FloatToInt( myself.sm.z ), 0, 1000, GetIndexFromCreature( myself.top_desire_target ), 0 );
    }
} else
if ( Rand( 5 ) < 1 ) {
    CreateOnePrivateEx( @dragon_knight_5, "dragon_knight_5", 0, 0, FloatToInt( myself.sm.x ), FloatToInt( myself.sm.y ), FloatToInt( myself.sm.z ), 0, 1000, GetIndexFromCreature( myself.top_desire_target ), 0 );
}

OwnItemCountExNPC🟢 высокая

подсчёт предметов с конкретной заточкой

Считает число предметов класса nItemClassId (из [item_pch]) у существа c, но только с конкретным уровнем заточки nEnchantLevel. Удобно, когда важна именно заточенная версия предмета. Возвращает количество подходящих экземпляров.

Сигнатура

OwnItemCountEx( CSharedCreatureData cCreature, int nItemClassId, int nEnchantLevel )

Параметры

cCreature     (CSharedCreatureData) — у кого считаем.
nItemClassId  (int) — класс предмета.
    значения — из словаря [item_pch]
nEnchantLevel (int) — требуемый уровень заточки.

Пример

if (IsInCategory(@third_class_group, talker.occupation) == 1 && OwnItemCountEx(talker, 5708, GetSSQRoundNumber()) > 0) {

Пример использования

if ( IsInCategory( @third_class_group, talker.occupation ) == 1 && OwnItemCountEx( talker, @the_lord_of_manor_s_agreement, GetSSQRoundNumber( ) ) > 0 ) {
    ShowPage( talker, szName + "_" + QUEST_ID + "_07.htm" );
}

GiveItem1NPC🟢 высокая

выдать предмет в инвентарь

Выдаёт существу c (обычно talker или target) nCount штук предмета nItemClassId (из [item_pch]) без заточки. Самый частый способ вручить квестовый предмет или награду. Если nCount вычисляется и получается 0, предмет фактически не выдаётся.

Сигнатура

GiveItem1( CSharedCreatureData cCreature, int nItemClassId, int64 nCount )

Параметры

cCreature    (CSharedCreatureData) — кому выдать (обычно talker/target).
nItemClassId (int) — класс предмета.
    значения — из словаря [item_pch]
nCount       (int64) — количество.

Пример

GiveItem1( talker, @q_info_urz, 1 );

Пример использования

if ( i1 == 3 ) {
    GiveItem1( c1, @demon_s_gloves_fabric, 1 );
}

GiveItemExNPC🟢 высокая

выдать предмет с заданной заточкой

Как GiveItem1, но выдаёт существу c nCount штук предмета nItemClassId (из [item_pch]) с заданным уровнем заточки nEnchantLevel. Применяется для наградных вещей с фиксированной или случайной заточкой.

Сигнатура

GiveItemEx( CSharedCreatureData cCreature, int nItemClassId, int nEnchantLevel, int64 nCount )

Параметры

cCreature     (CSharedCreatureData) — кому выдать.
nItemClassId  (int) — класс предмета.
    значения — из словаря [item_pch]
nEnchantLevel (int) — уровень заточки выдаваемого.
nCount        (int64) — количество.

Пример

GiveItemEx( talker, @br_xmas_shirts, 6, 1 );

Пример использования

if ( OwnItemCount( talker, @br_xmas_wpn_ticket_normal ) > 0 ) {
    GiveItemEx( talker, i1, 4 + Rand( 13 ), 1 );
    DeleteItem1( talker, @br_xmas_wpn_ticket_normal , 1 );
    ShowPage( talker, "br_xmas_wannabe_santa2024.htm" );
} else {
    ShowPage( talker, "br_xmas_wannabe_santa2023.htm" );
}

GiveEventItemNPC🟢 высокая

атомарный обмен предметов в рамках ивента

Выполняет обмен в одно действие: забирает у pTarget (обычно talker) nReqAmount штук предмета nReqItemId (из [item_pch], например @adena) и взамен выдаёт nGiveAmount штук предмета nGiveItemId (тоже из [item_pch]). Аргумент nId задаёт идентификатор или категорию ивента, а nTimeLimit — ограничение времени в часах на выданный временный предмет. Существует расширенная версия GiveEventItem2, которая за одну плату выдаёт сразу два разных предмета.

Сигнатура

GiveEventItem( CSharedCreatureData pTarget, int nReqItemId, int64 nReqAmount, int nGiveItemId, int64 nGiveAmount, int nId, int nTimeLimit )

Параметры

pTarget (CSharedCreatureData) — кому/у кого (обычно talker).
nReqItemId (int) — что забрать (плата, напр. @adena).
    значения — из словаря [item_pch]
nReqAmount (int64) — сколько забрать.
nGiveItemId (int) — что выдать.
    значения — из словаря [item_pch]
nGiveAmount (int64) — сколько выдать.
nId (int) — id/категория ивента.
nTimeLimit (int) — срок жизни выданного предмета (ч).

Пример

GiveEventItem( talker, @adena, 500, search_scroll, 1, 0, 12 );

Пример использования

if ( reply == 1 ) {
    GiveEventItem( talker, @adena, 1, event_present_skill, 1, 0, 20 );
}

DeleteItem1NPC🟢 высокая

изъять предмет у существа

Удаляет (изымает) у существа c nCount штук предмета nItemClassId (из [item_pch]). Частый приём — забрать все экземпляры, передав вторым множителем OwnItemCount того же предмета. Используется при завершении квестов (изъять квест-предметы) и при оплате (списать адену).

Сигнатура

DeleteItem1( CSharedCreatureData cCreature, int nItemClassId, int64 nCount )

Параметры

cCreature    (CSharedCreatureData) — у кого изъять.
nItemClassId (int) — класс предмета.
    значения — из словаря [item_pch]
nCount       (int64) — сколько изъять.

Пример

DeleteItem1( talker, @lunargent, 1 );

Пример использования

if ( OwnItemCount( talker, @adena ) >= GetCookie( talker, "AgitDecoFee" ) ) {
    DeleteItem1( talker, @adena, GetCookie( talker, "AgitDecoFee" ) );
    ShowPage( talker, fnAfterSetDeco );
} else {
    ShowPage( talker, fnNotEnoughAdena );
}

DeleteItemExNPC🟢 высокая

изъять предмет с конкретной заточкой

Удаляет у существа c nCount штук предмета nItemClassId (из [item_pch]) с конкретным уровнем заточки nEnchantLevel — точечное изъятие заточенной версии, пара к OwnItemCountEx. Порядок аргументов выведен по аналогии с GiveItemEx и OwnItemCountEx.

Сигнатура

DeleteItemEx( CSharedCreatureData cCreature, int nItemClassId, int nEnchantLevel, int64 nCount )

Параметры

    cCreature     (CSharedCreatureData) — у кого изъять.
    nItemClassId  (int) — класс предмета.
        значения — из словаря [item_pch]
    nEnchantLevel (int) — уровень заточки.
    nCount        (int64) — сколько изъять.

Пример (иллюстративный):

    DeleteItemEx( talker, nItemClassId, nEnchantLevel, nCount );

DropItem1NPC🟢 высокая

уронить предмет на землю

Роняет предмет nItemClassId (из [item_pch]) в количестве nCount на землю рядом с NPC так, что подобрать его может существо c — владелец дропа. В отличие от GiveItem1, который кладёт вещь прямо в инвентарь, здесь предмет появляется на земле. Часто используется боссами и саммонами для выдачи награды призывателю (myself.sm).

Сигнатура

DropItem1( CSharedCreatureData cCreature, int nItemClassId, int64 nCount )

Параметры

cCreature    (CSharedCreatureData) — владелец дропа (кто подберёт).
nItemClassId (int) — класс предмета.
    значения — из словаря [item_pch]
nCount       (int64) — количество.

Пример

DropItem1(myself.sm, @key_of_controller, 1);

Пример использования

if (Rand(100) < 50) {
    DropItem1(myself.sm, 8192, 1);
}

DropItem2NPC🟢 высокая

уронить предмет с явным владельцем

Как DropItem1, но с явным указанием id владельца дропа nOwnerId — кому разрешено поднять предмет nItemClassId (из [item_pch]) в количестве nCount. В рейдах туда передают идентификатор призывателя, чтобы дроп достался конкретному игроку, а не любому.

Сигнатура

DropItem2( CSharedCreatureData cCreature, int nItemClassId, int64 nCount, int nOwnerId )

Параметры

cCreature    (CSharedCreatureData) — существо-контекст дропа.
nItemClassId (int) — класс предмета.
    значения — из словаря [item_pch]
nCount       (int64) — количество.
nOwnerId     (int) — id владельца (кто может поднять).

Пример

DropItem2( c1, @crystal_a, 4, myself.sm.summoner_id );

Пример использования

if ( i1 == 0 ) {
    DropItem2( myself.sm, @green_soul_crystal_12, 1, myself.sm.summoner_id );
}

DropItemsNPC🟢 высокая

сброс из настроенных дроп-листов NPC

Инициирует сброс предметов из заранее настроенных дроп-листов самого NPC (заданных в данных моба), а не одного конкретного предмета. Аргумент nDropListMask — битовая маска, выбирающая, какие наборы дропа задействовать (биты комбинируются), а pDropOwner указывает, кому достанется добыча.

Сигнатура

DropItems( int nDropListMask, CSharedCreatureData pDropOwner )

Параметры

    nDropListMask (int) — битовая маска дроп-листов.
    pDropOwner (CSharedCreatureData) — владелец дропа.

Пример (иллюстративный):

    DropItems( nDropListMask, talker );

GetItemDataNPC🟢 высокая

получить описатель предмета

Возвращает объект-описатель (CSharedItemData) предмета класса nItemClassId (из [item_pch]) у существа c — для последующего обращения к его полям или передачи в другие функции. В скриптах часто вызывается сразу после выдачи предмета, чтобы поработать с конкретным экземпляром.

Сигнатура

GetItemData( CSharedCreatureData cCreature, int nItemClassId )

Параметры

cCreature    (CSharedCreatureData) — у кого берём предмет.
nItemClassId (int) — класс предмета.
    значения — из словаря [item_pch]

Пример

GetItemData(talker, @baby_cougar_chime);

Пример использования

item0 = GetItemData( talker, @manacles_of_redemption );
if ( item0 ) {
    DestroyPet( talker, item0.dbid, item0.pet_level );
}

UseItemNPC🟢 высокая

заставить NPC использовать предмет

Предположительно заставляет NPC использовать предмет, заданный единственным аргументом. Точный домен аргумента не подтверждён (индекс в инвентаре против класса предмета), прямых вызовов в коллекции не найдено, поэтому поведение описано с осторожностью.

Сигнатура

UseItem( int nItem )

Параметры

    nItem (int) — предмет, который использует NPC (индекс в инвентаре или класс предмета, домен не подтверждён — 0 вызовов)

Пример (иллюстративный):

    UseItem( nItem );

UseCategoryItemNPC🟢 высокая

использовать предмет из категории

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

Сигнатура

UseCategoryItem( int nCategory )

Параметры

    nCategory (int) — категория предмета, из которой NPC использует предмет (назначение не подтверждено — 0 вызовов)

Пример (иллюстративный):

    UseCategoryItem( nCategory );

EquipItemNPC🟢 высокая

экипировать предмет на NPC

Заставляет NPC экипировать предмет: единственный аргумент nItemClassId резолвится через [item_pch], то есть это класс предмета. Прямых вызовов в коллекции не найдено.

Сигнатура

EquipItem( int nItemClassId )

Параметры

nItemClassId (int) — класс предмета для экипировки.
    значения — из словаря [item_pch]

Пример

EquipItem(@npc_invisi_1hs);

Пример использования

if (timer_id == 1525007) {
    EquipItem(OHS_Weapon1);
}

Инвентарь (Inventory)

4 функций

GetInventoryInfoNPC🟢 высокая

числовой показатель инвентаря существа

Возвращает числовой показатель инвентаря существа cCreature — какой именно, выбирает второй аргумент nInfoType (@IPT_*): @IPT_CURRENT_SLOT_COUNT/@IPT_MAX_SLOT_COUNT (занято/максимум слотов), @IPT_CURRENT_WEIGHT/@IPT_MAX_CARRY_WEIGHT (текущий/предельный вес), @IPT_CURRENT_QUEST_SCOUNT/@IPT_MAX_QUEST_SCOUNT (квестовые слоты). Классика — проверка места и перегруза перед выдачей награды.

Сигнатура

GetInventoryInfo( CSharedCreatureData cCreature, int Type )

Параметры

cCreature (CSharedCreatureData) — существо, по чьему инвентарю запрашивают показатель
Type (int) — какой показатель инвентаря вернуть
    Используются константы из [manual_pch]:
        @IPT_CURRENT_SLOT_COUNT   (0) — сейчас занято слотов инвентаря
        @IPT_MAX_SLOT_COUNT       (1) — максимум слотов инвентаря
        @IPT_CURRENT_WEIGHT       (2) — текущий вес переносимого
        @IPT_MAX_CARRY_WEIGHT     (3) — предельный переносимый вес
        @IPT_CURRENT_QUEST_SCOUNT (4) — сейчас занято квестовых слотов
        @IPT_MAX_QUEST_SCOUNT     (5) — максимум квестовых слотов

Пример

if ( GetInventoryInfo( talker, @IPT_CURRENT_SLOT_COUNT ) >= ( GetInventoryInfo( talker, @IPT_MAX_SLOT_COUNT ) * 0.800000 ) || GetInventoryInfo( talker, @IPT_CURRENT_WEIGHT ) >= ( GetInventoryInfo( talker, @IPT_MAX_CARRY_WEIGHT ) * 0.800000 ) ) {

Пример использования

if ( GetInventoryInfo( talker, @IPT_CURRENT_SLOT_COUNT ) >= ( GetInventoryInfo( talker, @IPT_MAX_SLOT_COUNT ) * 0.800000 ) || GetInventoryInfo( talker, @IPT_CURRENT_WEIGHT ) >= ( GetInventoryInfo( talker, @IPT_MAX_CARRY_WEIGHT ) * 0.800000 ) ) {
    ShowSystemMessage( talker, 1118 );
    return;
}

UseSoulShotNPC🟢 высокая

NPC использует соул-шоты

NPC использует соул-шоты (усиление физической атаки) на nCount зарядов.

Сигнатура

UseSoulShot( int nCount )

Параметры

nCount (int) — количество используемых зарядов соул-шотов (в вызовах 10, 20, переменная SoulShot).

Пример

UseSoulShot( SoulShot );
UseSoulShot( 20 );
UseSoulShot(10);

UseSpiritShotNPC🟢 высокая

NPC использует спирит-шоты

NPC использует спирит-шоты (усиление магической атаки). По декомпилю L2NPC
(CNPC::UseSpiritShot_489FE0) движок шлёт серверу пакет opcode 113, где тип шота захардкожен
(=1, spiritshot), а первый аргумент — число зарядов; ещё два аргумента в скриптах названы
SpeedBonus/HealBonus и передаются вместе с применением.

Сигнатура

UseSpiritShot( int nCount, int nSpeedBonus, int nHealBonus )

Параметры

nCount (int) — количество используемых зарядов спирит-шотов (в вызовах 20, переменная SpiritShot).
nSpeedBonus (int) — бонус скорости применения (в скриптах SpeedBonus/SpiritShotSpeedBonus).
nHealBonus (int) — бонус восстановления (в скриптах HealBonus/SpiritShotHealBonus).

Пример

UseSpiritShot( SpiritShot, SpeedBonus, HealBonus );
UseSpiritShot( SpiritShot, SpiritShotSpeedBonus, SpiritShotHealBonus );
UseSpiritShot( 20, SpeedBonus, HealBonus );

IsSpoiledNPC🟢 высокая

наложен ли спойл на NPC

Возвращает, спойлен ли уже этот NPC (есть ли наложенный спойл): 1 или 0.

Сигнатура

IsSpoiled(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if ( Rand( 100 ) < 50 && c1.occupation == @scavenger && IsSpoiled( ) == 1 ) {

Пример использования

if ( Rand( 100 ) < 50 && c1.occupation == @scavenger && IsSpoiled( ) == 1 ) {
    i0 = ( i0 + 1 );
}

Умения, эффекты и бафы (Skill / Abnormal)

27 функций

Skill_GetAbnormalLevelGLOBAL🟢 высокая

уровень накладываемого эффекта

Возвращает уровень эффекта, который накладывает умение. В паре с GetAbnormalLevel(существо, Skill_GetAbnormalType(s)) позволяет понять, стоит ли на цели этот баф уже в полную силу (если текущий уровень не ниже уровня умения — баф есть). Именно так бафферы гасят кнопки уже выданных бафов. Аргумент nSkillId — умение из [skill_pch].

Сигнатура

Skill_GetAbnormalLevel( int nSkillId )

Параметры

nSkillId (int) — умение.
    значения — из словаря [skill_pch]

Пример

if (GetAbnormalLevel(talker, Skill_GetAbnormalType(buff1)) >= Skill_GetAbnormalLevel(buff1)) { FHTML_SetStr(fhtml0, "bypass_buff1", _blank); FHTML_SetFStr(fhtml0, "button_type1", 36810606, _blank, _blank, _blank, _blank, _blank); }

Пример использования

if (GetAbnormalLevel(talker, Skill_GetAbnormalType(buff1)) >= Skill_GetAbnormalLevel(buff1)) { FHTML_SetStr(fhtml0, "bypass_buff1", _blank); FHTML_SetFStr(fhtml0, "button_type1", 36810606, _blank, _blank, _blank, _blank, _blank); }
else { FHTML_SetStr(fhtml0, "bypass_buff1", "bypass -h menu_select?ask=-301&reply=1"); FHTML_SetFStr(fhtml0, "button_type1", 36810605, _blank, _blank, _blank, _blank, _blank); }

Skill_IsMagicGLOBAL🟢 высокая

магическое умение или физическое

Сообщает, является ли умение магическим (1) или физическим (0). По этому признаку ИИ выбирает контр-эффект: против физики ставит щитовой удар, против магии — немоту и т.п. Аргумент nSkillId — умение из [skill_pch].

Сигнатура

Skill_IsMagic( int nSkillId )

Параметры

nSkillId (int) — умение.
    значения — из словаря [skill_pch]

Пример

if (Skill_IsMagic(Skill01_ID) == 0 && (GetAbnormalLevel(myself.sm, Skill_GetAbnormalType(@s_shield_slam1)) > 0 || GetAbnormalLevel(myself.sm, Skill_GetAbnormalType(@s_curse_of_doom1)) > 0))

SetSkillAllGLOBAL🟢 высокая

выдать все умения

Выдаёт существу сразу все умения — отладочная/сервисная команда. По декомпилю отправляет
серверу асинхронную команду (как IsToggleSkillOnOff — не мгновенный запрос). Результата
скрипту не возвращает. Аргумент c — кому выдать; если c пустой, ничего не делает.

Сигнатура

SetSkillAll( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, которому выдаются все умения

Пример

SetSkillAll(talker);

Пример использования

if( reply == 1 ) {
    SetSkillAll( talker );
}

GetAbnormalLevelGLOBAL🟢 высокая

детектор состояний на существе

Возвращает текущий уровень эффекта заданного типа у существа: если эффекта нет,
результат отрицательный (на практике проверяют «меньше либо равно нулю»), а если
эффект висит — его уровень больше нуля. Принимает существо (c, CSharedCreatureData,
без namespace) и тип эффекта (nAbnormalType, int, без namespace), который почти
всегда получают тут же через Skill_GetAbnormalType. Так проверяют, стоит ли уже
стан на цели, не отравлена ли она и не висит ли на игроке нужный баф в полную силу.

Сигнатура

GetAbnormalLevel( CSharedCreatureData cCreature, int nAbnormalType )

Параметры

cCreature     (CSharedCreatureData) — у кого проверяем.
nAbnormalType (int) — тип эффекта (обычно Skill_GetAbnormalType(s)).

Пример

i0 = GetAbnormalLevel( myself.sm, Skill_GetAbnormalType( @s_stun_attack11 ) );

Пример использования

i1 = GetAbnormalLevel( myself.sm, Skill_GetAbnormalType( @s_npc_paralyze1 ) );
if ( i0 <= 0 && i1 <= 0 ) {
    if ( Rand( 100 ) < SoulShotRate ) { UseSoulShot( SoulShot ); }
}

Skill_GetConsumeMPNPC🟢 высокая

стоимость умения в мане

Возвращает, во сколько маны (MP) обойдётся каст указанного умения. ИИ использует это, чтобы проверить, хватит ли у NPC маны на применение. Аргумент nSkillId — умение из [skill_pch]; почти всегда проверяется в связке с расходом HP и перезарядкой.

Сигнатура

Skill_GetConsumeMP( int nSkillId )

Параметры

nSkillId (int) — умение.
    значения — из словаря [skill_pch]

Пример

if ( Skill_GetConsumeMP( DDMagic1 ) < myself.sm.mp && Skill_GetConsumeHP( DDMagic1 ) < myself.sm.hp ) {

Пример использования

if ( Skill_GetConsumeMP( SetCurse ) < myself.sm.mp && Skill_GetConsumeHP( SetCurse ) < myself.sm.hp && Skill_InReuseDelay( SetCurse ) == 0 ) {
    AddUseSkillDesire( attacker, SetCurse, @ST_ATTACK, @AMT_MOVE_TO_TARGET, 1000000 );
}

Skill_GetConsumeHPNPC🟢 высокая

стоимость умения в здоровье

Возвращает, во сколько здоровья (HP) обойдётся каст — для умений, жрущих здоровье. Полный аналог Skill_GetConsumeMP и проверяется в той же связке. Аргумент nSkillId — умение из [skill_pch].

Сигнатура

Skill_GetConsumeHP( int nSkillId )

Параметры

nSkillId (int) — умение.
    значения — из словаря [skill_pch]

Пример

if ( Skill_GetConsumeMP( DDMagic1 ) < myself.sm.mp && Skill_GetConsumeHP( DDMagic1 ) < myself.sm.hp ) {

Пример использования

if ( Skill_GetConsumeMP( SetCurse ) < myself.sm.mp && Skill_GetConsumeHP( SetCurse ) < myself.sm.hp && Skill_InReuseDelay( SetCurse ) == 0 ) {
    AddUseSkillDesire( attacker, SetCurse, @ST_ATTACK, @AMT_MOVE_TO_TARGET, 1000000 );
}

Skill_InReuseDelayNPC🟢 высокая

проверка перезарядки

Сообщает, находится ли умение на перезарядке (reuse delay): ноль означает, что оно готово к применению, не-ноль — что ещё на кулдауне. Аргумент nSkillId — умение из [skill_pch]. Вместе с проверками расхода маны и здоровья даёт классическое условие «хватает ресурсов и кулдаун прошёл».

Сигнатура

Skill_InReuseDelay( int nSkillId )

Параметры

nSkillId (int) — умение.
    значения — из словаря [skill_pch]

Пример

if ( Skill_InReuseDelay( DDMagic1 ) == 0 ) {

Пример использования

if ( Skill_GetConsumeMP( SetCurse ) < myself.sm.mp && Skill_GetConsumeHP( SetCurse ) < myself.sm.hp && Skill_InReuseDelay( SetCurse ) == 0 ) {
    AddUseSkillDesire( attacker, SetCurse, @ST_ATTACK, @AMT_MOVE_TO_TARGET, 1000000 );
}

Skill_GetAbnormalTypeNPC🟢 высокая

тип накладываемого эффекта

Возвращает тип накладываемого умением эффекта (abnormal type) — ключ, по которому затем спрашивают наличие эффекта у существа через GetAbnormalLevel(существо, тип). Так ИИ понимает, висит ли уже на цели стан, яд или баф. Аргумент nSkillId — умение из [skill_pch].

Сигнатура

Skill_GetAbnormalType( int nSkillId )

Параметры

nSkillId (int) — умение.
    значения — из словаря [skill_pch]

Пример

i0 = GetAbnormalLevel( myself.sm, Skill_GetAbnormalType( @s_stun_attack11 ) );

Пример использования

if ( GetAbnormalLevel( myself.sm, Skill_GetAbnormalType( @s_antaras_regen4 ) ) < 14 ) {
    AddUseSkillDesire( myself.sm, @s_antaras_regen4, @ST_ATTACK, @AMT_MOVE_TO_TARGET, 4000000 );
}

Skill_GetEffectPointNPC🟢 высокая

вес (сила) эффекта умения

Возвращает условную «силу эффекта» умения. В обработчиках реакции на чужой каст NPC по этому значению вычисляет, сколько агрессии добавить заклинателю: чем мощнее применённое по нему умение, тем выше приоритет ответной атаки. Аргумент nSkillId — умение из [skill_pch] (обычно skill_name_id, то есть то, что применили к NPC).

Сигнатура

Skill_GetEffectPoint( int nSkillId )

Параметры

nSkillId (int) — умение (обычно skill_name_id — то, что применили к NPC).
    значения — из словаря [skill_pch]

Пример

i0 = Skill_GetEffectPoint(skill_name_id);
f1 = Skill_GetEffectPoint(skill_name_id);
i1 = Skill_GetEffectPoint(skill_name_id);

Пример использования

if ( Skill_GetEffectPoint( skill_name_id ) > 0 ) {
    AddAttackDesire( speller, @AMT_STAND, ( ( ( Skill_GetEffectPoint( skill_name_id ) / myself.sm.max_hp ) / 0.050000 ) * 150 ) );
}

Skill_GetTargetTypeNPC🟢 высокая

тип цели умения

Возвращает тип цели умения — целое перечисление из двух десятков значений (на себя, на одну цель, на врага, на свою группу, на тело-труп, на точку земли и т.д.). Аргумент nSkillId — умение из [skill_pch]. Таблица типов раскрыта в структурной документации.

Сигнатура

Skill_GetTargetType( int nSkillId )

Параметры

    nSkillId (int) — умение.
        значения — из словаря [skill_pch]

Пример (иллюстративный):

    Skill_GetTargetType( nSkillId );

Skill_HaveAttributeNPC🟢 высокая

наличие стихии у умения

Проверяет, обладает ли умение заданной стихией (огонь, вода, ветер, земля, свет, тьма — или «без стихии»), и возвращает флаг наличия (1/0). Аргумент nSkillId — умение из [skill_pch], nAttribute — код стихии. Таблица кодов стихий раскрыта в структурной документации.

Сигнатура

Skill_HaveAttribute( int nSkillId, int nAttribute )

Параметры

nSkillId   (int) — умение.
    значения — из словаря [skill_pch]
nAttribute (int) — код стихии (enum AttributeTypeEnum, см. ниже).

Пример

if (skill_name_id > 0 && Skill_HaveAttribute(skill_name_id, 0) && Rand(100) < 70 && InMyTerritory(attacker)) {

UseSkillNPC🟢 высокая

немедленный каст умения на цель

Заставляет NPC немедленно применить умение на указанную цель. В отличие от AddUseSkillDesire, которая лишь добавляет желание в очередь, UseSkill срабатывает прямо сейчас — поэтому ею пользуются бафферы, выдающие игроку пачку усилений подряд, и служебные касты на себя или на призывателя. Аргумент c — цель, nSkillId — умение из [skill_pch].

Сигнатура

UseSkill( CSharedCreatureData cCreature, int nSkillId )

Параметры

cCreature (CSharedCreatureData) — цель умения.
nSkillId  (int) — умение.
    значения — из словаря [skill_pch]

Пример

UseSkill( talker, @s_golden_pig_haste );

Пример использования

if (script_event_arg1 == 18952) {
    UseSkill(myself.sm, SelfBuff);
}

UseCategorySkillNPC🟢 высокая

каст умения из категории

Заставляет NPC применить на указанное существо одно умение из заданной категории (набора
умений). Вместо конкретного умения вы называете номер категории, а нужное умение из неё
выбирается автоматически и кастуется на цель. Возвращает целое число — признак результата
(сработал каст или нет); используйте возврат, если важно узнать, применилось ли умение.
Категория задаётся числом (номер набора умений). Возвращаемое целое — признак результата
(применилось умение или нет), как у парной UseCategoryItem.

Сигнатура

UseCategorySkill( CSharedCreatureData cCreature, int nCategory )

Параметры

    cCreature (CSharedCreatureData) — на кого применить умение (цель каста).
    nCategory (int) — номер категории (набора умений), из которой берётся умение.

Пример (иллюстративный):

    i0 = UseCategorySkill( talker, nCategory );

FastBuffNPC🟢 высокая

быстрый баф по прямому идентификатору

«Быстрый баф» — служебный способ для NPC-бафферов выдать умение по прямому идентификатору и уровню с позиционным индексом (видимо, слот в списке бафов). Прямых вызовов в скриптах не найдено, порядок аргументов взят из сигнатуры. Аргументы: nIndex — индекс/слот, nSkillID — умение (прямой id), nSkillLevel — уровень.

Сигнатура

FastBuff( int nIndex, int nSkillID, int nSkillLevel )

Параметры

    nIndex (int) — индекс/слот бафа.
    nSkillID (int) — умение (прямой id).
    nSkillLevel (int) — уровень умения.

Пример (иллюстративный):

    FastBuff( nIndex, nSkillID, nSkillLevel );

GetPledgeSkillLevelNPC🟢 высокая

уровень клановых умений

Возвращает уровень клановых (pledge) умений у существа и часто служит условием-гейтом в клановых квестах и диалогах — например, доступ открывается лишь при уровне клан-скилла не ниже четвёртого. Аргумент c — у кого проверяем (обычно talker).

Сигнатура

GetPledgeSkillLevel( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — у кого проверяем (обычно talker).

Пример

i0 = GetPledgeSkillLevel(talker);

Пример использования

if ( GetPledgeSkillLevel( myself.c_ai0 ) < pledge_lv_req ) {
    return;
}

DeleteAcquireSkillsNPC🟢 высокая

удаление выученных умений

Удаляет у существа выученные умения указанной категории (сброс сабкласса, трансформаций и т.п.).
Второй аргумент — категория умений SkillAcquireType (по исходнику сервера), из словаря
manual_pch как @..._skill_acquire.

Сигнатура

DeleteAcquireSkills( CSharedCreatureData c, int nAcquireType )

Параметры

c (CSharedCreatureData) — у кого удалить умения.
nAcquireType (int) — категория умений (движок enum SkillAcquireType):
    -1 нет, 0 обычные, 1 рыбалка, 2 клановые, 3 умения саб-юнита клана,
    4 трансформации, 5 сабкласс, 6 сбор, 7 Bishop-share, 8 Elder-share,
    9 SilenElder-share, 10..24 расширенные наборы, 25 рыбалка (не-гном),
    26 премиум-аккаунт, 27 академик, 28..33 расовые (human/elf/dark-elf/orc/dwarf/kamael),
    34 алхимия. Хвостовые номера сдвигаются по хронике (manual_pch [*_skill_acquire]).

Пример

DeleteAcquireSkills(talker, @subjob_skill_acquire);

IsToggleSkillOnOffNPC🟢 высокая

состояние переключаемого умения

Относится к переключаемым (toggle) умениям — проверка или переключение состояния вкл/выкл умения у цели. Тип возврата в сигнатуре void (несмотря на имя Is...), что неоднозначно; прямых вызовов нет. Аргумент pTarget — у кого, nSkillUid — переключаемое умение из [skill_pch].

Сигнатура

IsToggleSkillOnOff( CSharedCreatureData pTarget, int nSkillUid )

Параметры

pTarget (CSharedCreatureData) — у кого.
nSkillUid (int) — переключаемое умение.
    значения — из словаря [skill_pch]

Пример

IsToggleSkillOnOff(myself.sm, @s_i_orfen_speed);
IsToggleSkillOnOff(myself.sm, @s_echimus_ultimate_shield1);

ShowSkillListNPC🟢 высокая

окно списка умений для изучения

Открывает игроку окно со списком умений, которые он может выучить у этого NPC-учителя.
Список умений подбирается по классу и уровню самого игрока — вам не нужно его перечислять.
Первый аргумент — кому показать окно (обычно talker). Второй — имя своей HTML-страницы окна:
во всех реальных вызовах он пустой ("" или _blank), и тогда открывается стандартное окно
списка умений класса. Задавать своё имя страницы имеет смысл, только если вы хотите показать
собственную оформленную страницу вместо стандартной.

Сигнатура

ShowSkillList( CSharedCreatureData c, string sListName )

Параметры

c (CSharedCreatureData) — кому показать окно (обычно talker).
sListName (string) — имя своей HTML-страницы окна; пусто ("" / _blank) — стандартное
    окно списка умений класса.

Пример

ShowSkillList( talker, "" );
ShowSkillList( talker, _blank );

Пример использования

if ( IsInCategory( @dwarf_bounty_class, talker.occupation ) ) {
    ShowSkillList( talker, "" );
} else {
    ShowPage( talker, fnClassMismatch );
}

ShowEtcSkillListNPC🟢 высокая

список прочих умений

Открывает игроку окно списка «прочих» умений — не обычных умений класса, а отдельного набора:
клановых, умений саб-юнита клана, трансформаций, сабкласса и т.п. Каким именно набором будет
окно, задаёт второй аргумент — тип набора умений для изучения. В реальных вызовах это либо
именованная константа (например @pledge_skill_acquire — клановые), либо то же число напрямую
(3 — умения саб-юнита клана). Третий аргумент — имя своей HTML-страницы окна: в вызовах он
пустой ("" / _blank), и тогда открывается стандартное окно набора. Своё имя страницы задают
лишь для собственного оформления окна.

Сигнатура

ShowEtcSkillList( CSharedCreatureData c, int nAcquireType, string sListName )

Параметры

c (CSharedCreatureData) — кому показать окно (обычно talker).
nAcquireType (int) — тип набора умений для изучения (какой список показать):
    -1 нет, 0 обычные, 1 рыбалка, 2 клановые, 3 умения саб-юнита клана,
    4 трансформации, 5 сабкласс, 6 сбор, 7 Bishop-share, 8 Elder-share,
    9 SilenElder-share, 10..24 расширенные, 25 рыбалка (не-гном), 26 премиум,
    27 академик, 28..33 расовые, 34 алхимия. В скриптах пишут константой
    (@pledge_skill_acquire, @subjob_skill_acquire) или числом. Хвостовые номера
    сдвигаются по хронике — сверяйте по manual_pch [*_skill_acquire].
sListName (string) — имя своей HTML-страницы окна; пусто ("" / _blank) — стандартное окно.

Пример

ShowEtcSkillList( talker, @subjob_skill_acquire, "" );

Пример использования

if ( reply == 0 ) {
    ShowEtcSkillList( talker, skill_acquire, "" );
}

ShowEnchantSkillListNPC🟢 высокая

окно заточки умений

Открывает игроку окно заточки умений. Это чисто презентационная команда (движок шлёт клиенту
пакет открытия окна; ничего не возвращает). Слоты игрока движок подставляет сам; числовые
аргументы скрипта пробрасываются клиенту как поля окна. Первый аргумент c — кому показать,
второй — числовой параметр окна. Родственные окна той же природы: ShowEnchantSkillListDrawer,
ShowEnchantSkillMessage, ShowGrowSkillMessage/…2 (различаются кодом пакета и числом полей).

Сигнатура

ShowEnchantSkillList( CSharedCreatureData c, int nEnchantType )

Параметры

c (CSharedCreatureData) — кому показать окно (обычно talker).
nEnchantType (int) — режим заточки (движок enum SkillEnchantType):
    0 обычная заточка, 1 безопасная, 2 сброс заточки (untrain), 3 смена ветки.

Пример

ShowEnchantSkillList( talker, state );
ShowEnchantSkillList(talker, action_id);

Пример использования

if ( talker.level > 75 ) {
    ShowEnchantSkillList( talker, state );
} else {
    ShowPage( talker, fnLevelMismatch );
}

ShowEnchantSkillListDrawerNPC🟢 высокая

панель списка заточки

Раскрывает игроку панель заточки для конкретного выбранного умения — тот развёрнутый список
вариантов, что появляется, когда игрок кликнул на умение в окне заточки. В скриптах вызывается
из обработчика нажатия в этом окне: туда приходят два значения — какое умение выбрал игрок
(skill_name_id) и что он хочет с ним сделать (action_id, вид заточки), — и вы просто передаёте
их сюда. Обычно перед раскрытием панели проверяют условия (например, что игрок не в
трансформации), и лишь затем вызывают эту функцию.

Сигнатура

ShowEnchantSkillListDrawer( CSharedCreatureData c, int nSkillUid, int nEnchantType )

Параметры

c (CSharedCreatureData) — кому показать панель (обычно talker).
nSkillUid (int) — какое умение затачиваем; в скриптах это skill_name_id, пришедший из
    события выбора умения в окне заточки (значение из словаря [skill_pch]).
nEnchantType (int) — что делаем с умением (вид заточки); в скриптах это action_id из того
    же события. Значения:
    0 обычная заточка, 1 безопасная, 2 сброс заточки, 3 смена ветки.

Пример

ShowEnchantSkillListDrawer(talker, skill_name_id, action_id);

ShowEnchantSkillMessageNPC🟢 высокая

сообщение о заточке умения

Показывает игроку короткое сообщение-подсказку о заточке умения — что именно даст выбранная
операция заточки для выбранного умения. В скриптах вызывается сразу после того, как игрок выбрал
умение в окне заточки: в обработчик приходят какое умение он выбрал (skill_name_id) и какой вид
заточки хочет (action_id), и вы передаёте их сюда, чтобы игрок увидел поясняющее сообщение перед
подтверждением.

Сигнатура

ShowEnchantSkillMessage( CSharedCreatureData c, int nSkillUid, int nEnchantType )

Параметры

c (CSharedCreatureData) — кому показать сообщение (обычно talker).
nSkillUid (int) — про какое умение сообщение; в скриптах это skill_name_id, пришедший из
    события выбора умения в окне заточки (значение из словаря [skill_pch]).
nEnchantType (int) — про какой вид заточки сообщение; в скриптах это action_id из того же
    события. Значения:
    0 обычная заточка, 1 безопасная, 2 сброс заточки, 3 смена ветки.

Пример

ShowEnchantSkillMessage(talker, skill_name_id, action_id);

ShowGrowSkillMessageNPC🟢 высокая

сообщение о росте умения

Показывает игроку сообщение-подсказку о том, что умение можно «вырастить» — повысить его
уровень у NPC-учителя. Первый аргумент — кому показать (обычно talker), второй — про какое
умение сообщение (skill_name_id). Третий — имя своей HTML-страницы окна: в реальных вызовах он
пустой ("" / _blank), и тогда показывается стандартное сообщение. Часто эту функцию вызывают
для обычных умений, а для «прочих» (клановых и т.п.) — родственную ShowGrowEtcSkillMessage,
выбирая между ними по типу набора.

Сигнатура

ShowGrowSkillMessage( CSharedCreatureData c, int nSkillUid, string sListName )

Параметры

c (CSharedCreatureData) — кому показать (обычно talker).
nSkillUid (int) — про какое умение сообщение; в скриптах это skill_name_id (значение из
    словаря [skill_pch]).
sListName (string) — имя своей HTML-страницы окна; пусто ("" / _blank) — стандартное
    сообщение.

Пример

ShowGrowSkillMessage( talker, skill_name_id, "" );
ShowGrowSkillMessage(talker, skill_name_id, _blank);

Пример использования

if (i0 == 0) {
    ShowGrowSkillMessage(talker, skill_name_id, _blank);
} else
if (i0 >= 1) {
    ShowGrowEtcSkillMessage(talker, skill_name_id, i0, _blank);
}

ShowGrowSkillMessage2NPC🟢 высокая

расширенное сообщение о росте умения

Расширенный вариант ShowGrowSkillMessage: показывает игроку то же сообщение о «росте» умения,
но принимает два дополнительных числовых аргумента между умением и именем страницы окна. Эти
два числа сервер не трактует — он вставляет их в текст сообщения, а отрисовывает клиент (по
смыслу это параметры роста умения, например уровни). Первый аргумент — кому показать,
последний — имя своей HTML-страницы окна (пусто — стандартное сообщение). Если два
дополнительных числа не нужны, используйте обычный ShowGrowSkillMessage.

Сигнатура

ShowGrowSkillMessage2( CSharedCreatureData c, int nSkillUid, int nParam1, int nParam2, string sListName )

Параметры

    c (CSharedCreatureData) — кому показать (обычно talker).
    nSkillUid (int) — про какое умение сообщение (значение из словаря [skill_pch]).
    nParam1 (int) — числовое поле сообщения о росте (подставляет клиент; по смыслу — параметр роста умения, напр. уровень).
    nParam2 (int) — второе такое же числовое поле сообщения (подставляет клиент).
    sListName (string) — имя своей HTML-страницы окна; пусто ("") — стандартное сообщение.

Пример (иллюстративный):

    ShowGrowSkillMessage2( talker, nSkillUid, nParam1, nParam2, "" );

ShowGrowEtcSkillMessageNPC🟢 высокая

сообщение о росте прочего умения

То же сообщение о «росте» умения, что и ShowGrowSkillMessage, но для «прочих» умений —
не обычных умений класса, а отдельного набора (клановых, умений саб-юнита клана и т.п.).
Поэтому здесь есть дополнительный аргумент — тип набора умений, к которому относится растущее
умение. В скриптах эту функцию и ShowGrowSkillMessage обычно ставят в развилку: если умение
из обычного набора — вызывают ShowGrowSkillMessage, если из прочего — эту, передавая тип
набора. Последний аргумент — имя своей HTML-страницы окна (пусто — стандартное сообщение).

Сигнатура

ShowGrowEtcSkillMessage( CSharedCreatureData c, int nSkillUid, int nAcquireType, string sListName )

Параметры

c (CSharedCreatureData) — кому показать (обычно talker).
nSkillUid (int) — про какое умение сообщение; в скриптах это skill_name_id (значение из
    словаря [skill_pch]).
nAcquireType (int) — тип набора умений, к которому относится растущее умение:
    -1 нет, 0 обычные, 1 рыбалка, 2 клановые, 3 умения саб-юнита клана, 4 трансформации,
    5 сабкласс, 6 сбор, 7 Bishop-share, 8 Elder-share, 9 SilenElder-share, 10..24 расширенные,
    25 рыбалка (не-гном), 26 премиум, 27 академик, 28..33 расовые, 34 алхимия.
    В скриптах пишут константой (@pledge_skill_acquire) или числом. Хвостовые номера
    сдвигаются по хронике — сверяйте по manual_pch [*_skill_acquire].
sListName (string) — имя своей HTML-страницы окна; пусто ("" / _blank) — стандартное
    сообщение.

Пример

ShowGrowEtcSkillMessage(talker, skill_name_id, @pledge_skill_acquire, _blank);

Пример использования

if (i0 >= 1) {
    ShowGrowEtcSkillMessage(talker, skill_name_id, i0, _blank);
}

DispelNPC🟢 высокая

снять эффект с существа

Снимает с существа эффект указанного типа — обратное действие к GetAbnormalLevel.
Принимает существо (c, CSharedCreatureData, без namespace) и тип эффекта
(nAbnormalType, int, без namespace), который, как и прежде, обычно берут из умения
через Skill_GetAbnormalType. Этим NPC сбрасывает, например, собственный временный
защитный баф перед сменой фазы боя.

Сигнатура

Dispel( CSharedCreatureData c, int nAbnormalType )

Параметры

c (CSharedCreatureData) — с кого снять эффект.
nAbnormalType (int) — тип абнормал-эффекта (обычно Skill_GetAbnormalType(@умение);
    открытый набор типов из skilldata.txt, фиксированного enum нет).

Пример

Dispel(myself.sm, Skill_GetAbnormalType(@s_trance1));

Пример использования

if ( ( ( ( talker.transformID == 260 ) || ( talker.transformID == 8 ) ) ) || ( talker.transformID == 9 ) ) {
    Dispel( talker, Skill_GetAbnormalType( @s_flying_form_shooting1 ) ); 
}

CastBuffForAgitManagerNPC🟢 высокая

бафы менеджера кланового зала

Накладывает на существо один баф — умение, заданное вторым аргументом, — с расходом маны у
NPC-менеджера. Фиксированного набора нет: кастуется ровно то умение, что передали, а «серию»
бафов клан-холла делают несколькими вызовами подряд. Принимает существо (обычно talker) и
умение-баф. Важное уточнение про «большие числа»: значение вроде 284557314 — это НЕ отдельный
серверный id, а обычная константа [skill_pch], записанная числом (упаковка «id умения << 16 |
уровень»: 284557314 = умение 4342, уровень 2). То есть символическая @-форма и это число —
одно и то же. Если существо не передано, функция пишет ошибку и ничего не делает. Близкие по смыслу функции выдачи
бафа за квест — CastBuffForQuestReward и её вторая версия — описаны в группе
квестов.

Сигнатура

CastBuffForAgitManager( CSharedCreatureData c, int nSkill )

Параметры

c (CSharedCreatureData) — кому баф (обычно talker).
nSkill (int) — умение-баф (в скриптах — прямой id, упаковка id<<16|уровень).
    значения — из словаря [skill_pch]

Пример

CastBuffForAgitManager(talker, reply);

ТАЙМЕРЫ (Timer)

7 функций

AddTimerExGLOBAL🟢 высокая

поставить одноразовый таймер

Планирует одноразовое срабатывание: через nTimeout миллисекунд движок вызовет
TIMER_FIRED_EX с указанным идентификатором nTimerId. Аргументы: nTimerId (произвольный
id, его же получит обработчик) и nTimeout (задержка до срабатывания, мс), оба без
namespace; ничего не возвращает. Чтобы сделать таймер периодическим, его обычно
перезапускают изнутри самого обработчика TIMER_FIRED_EX, снова вызывая функцию с тем же id. Доступна
как у обычных NPC, так и у спавнеров — со одинаковым смыслом.
Связанное событие: таймер ловится событием TIMER_FIRED_EX(timer_id); у мейкера — ON_TIMER (см. NASC_HANDLERS).

Сигнатура

AddTimerEx( int nTimerId, int nTimeout )

Параметры

nTimerId (int) — произвольный id (его же получит `TIMER_FIRED_EX`).
nTimeout (int) — задержка до срабатывания, мс.

Пример

AddTimerEx( 1, 7000 );

Пример использования

if ( MoveAroundSocial > 0 || MoveAroundSocial1 > 0 ) {
    AddTimerEx( 1671, 10000 );
}

RegToRespawnTimerMAKER🟢 высокая

регистрация в таймере респауна

Регистрирует определение спавна в таймере респауна (механика спавнеров): после
смерти NPC планирует его повторное появление. Аргумент nRespawnTime — абсолютный
момент возрождения (без namespace); возвращает целое. Принадлежит классу определения
спавна, а не обычному NPC.

Сигнатура

RegToRespawnTimer( int nRespawnTime )

Параметры

nRespawnTime (int) — абсолютный момент респауна = death_time + respawn_time определения
                     спавна (время смерти существа плюс интервал возрождения из loaded_def).

Пример

def0.RegToRespawnTimer(i0);

AtomicAddTimerExNPC🟢 высокая

атомарная постановка таймера с анти-дублем

«Атомарная» постановка таймера, привязанная к существу c: ставит таймер только
если такого ещё нет, и возвращает признак успеха (предположительно TRUE, если
поставлен, FALSE, если уже был). Аргументы: c (существо-владелец таймера,
CSharedCreatureData), nTimerId (id таймера) и nTimeout (задержка, мс), все без
namespace. По смыслу это защитный «замок» для таймеров.
Связанное событие: таймер ловится событием TIMER_FIRED_EX(timer_id) (см. NASC_HANDLERS).

Сигнатура

AtomicAddTimerEx( CSharedCreatureData c, int nTimerId, int nTimeout )

Параметры

    c (CSharedCreatureData) — существо-владелец таймера.
    nTimerId (int) — id таймера (произвольное число скрипта).
    nTimeout (int) — задержка, мс.

Пример (иллюстративный):

    AtomicAddTimerEx( talker, nTimerId, nTimeout );

BlockTimerNPC🟢 высокая

приостановить таймер

Приостанавливает (блокирует) таймер с данным идентификатором — его срабатывания
перестают доходить до TIMER_FIRED_EX. Аргумент: nTimerId (id блокируемого таймера, без
namespace); ничего не возвращает. Применяют, чтобы временно отключить периодическую
логику (например, на время особой фазы боя) или погасить группу таймеров разом.

Сигнатура

BlockTimer( int nTimerId )

Параметры

nTimerId (int) — id блокируемого таймера.

Пример

BlockTimer(1001);

Пример использования

if ( myself.i_ai2 == 0 ) {
    BlockTimer( CHECK_TIME_ANNOUNCE );
    myself.i_ai2 = 1;
    AddTimerEx( CHECK_TIME_ANNOUNCE2, ( 1 * 100 ) );
}

UnblockTimerNPC🟢 высокая

снять блокировку таймера

Снимает блокировку, наложенную BlockTimer, — таймер снова работает. Аргумент:
nTimerId (id разблокируемого таймера, без namespace); ничего не возвращает. Обычно
идёт парой с BlockTimer: выключили на время фазы — включили обратно.

Сигнатура

UnblockTimer( int nTimerId )

Параметры

nTimerId (int) — id разблокируемого таймера.

Пример

UnblockTimer(1001);

SetTimerPeriodNPC🟢 высокая

задать период системного таймера (мс)

Задаёт период системного периодического таймера NPC — как часто движок дёргает
регулярный обработчик. Аргумент: nPeriodMs (период тика в миллисекундах); ничего не
возвращает. Влияет на частоту регулярной логики ИИ (в вызовах 1800 мс).

Сигнатура

SetTimerPeriod( int nPeriodMs )

Параметры

nPeriodMs (int) — период тика, мс (в вызовах 1800).

Пример

SetTimerPeriod(1800);

SetTimerPeriodByTickNPC🟢 высокая

задать период системного таймера (тики)

То же, что SetTimerPeriod, но период задаётся в серверных тиках, а не в
миллисекундах. Аргумент: nPeriod (период в серверных тиках, без namespace); ничего
не возвращает. Смысл выведен по имени, прямых вызовов не извлечено.

Сигнатура

SetTimerPeriodByTick( int nPeriodTicks )

Параметры

    nPeriodTicks (int) — период тика, в серверных тиках.


Пример (иллюстративный):

    SetTimerPeriodByTick( nPeriodTicks );

ЖЕЛАНИЯ (DESIRE)

32 функций

AddAttackDesireNPC🟢 высокая

«хочу атаковать вот это существо»

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

Принимает три вещи: кого атаковать (существо — обычно тот, кто только что
ударил NPC), как двигаться при этом (параметр nMoveType) и насколько сильно
этого хочется (вес).

Значения nMoveType разобраны ниже, в разделе «Параметры». Иногда вместо
константы там стоит выражение IsWalkedNpc, которое само вычисляет 0 или 1.
Связанное событие: по завершении — ATTACK_FINISHED(target), при срыве — ATTACK_INTERRUPTED (см. NASC_HANDLERS).

Сигнатура

AddAttackDesire( CSharedCreatureData cCreature, int nMoveType, float fDesireValue )

Параметры

    cCreature (CSharedCreatureData) — цель атаки (существо). Обычно attacker, creature, c0, target.master.
    nMoveType (int) — способ перемещения к цели при выполнении желания
        Используются константы из [manual_pch]:
            @AMT_STAND          (0) — атаковать с места, не сближаясь
            @AMT_MOVE_TO_TARGET (1) — подойти к цели вплотную и атаковать (преследовать)
    fDesireValue (float) — приоритет желания (чем больше — тем раньше исполнится).

Пример. Монстр получил удар и бросается на обидчика:

    AddAttackDesire( attacker, @AMT_MOVE_TO_TARGET, 2000 );

Здесь `attacker` — нападавший, `@AMT_MOVE_TO_TARGET` — «преследовать», 2000 — вес.

Тот же приём с другой целью — например, помощник кидается на цель хозяина:

    AddAttackDesire( c0, @AMT_MOVE_TO_TARGET, 500 );

Пример использования

if ( creature.karma > 0 ) {
    AddAttackDesire( creature, @AMT_MOVE_TO_TARGET, 1500 );
}

AddAttackDesireExNPC🟢 высокая

атаковать цель, заданную по идентификатору

То же самое, что AddAttackDesire, но с двумя отличиями. Во-первых, цель
указывается не ссылкой на существо, а её числовым object-id (его обычно
получают заранее функциями вроде GetObjectID). Во-вторых, появляется флаг
форсирования nForce — судя по скриптам, он заставляет желание срабатывать
жёстче (в боевых файлах встречается значение 1; точный смысл вынесен в вопросы).
Связанное событие: по завершении — ATTACK_FINISHED(target), при срыве — ATTACK_INTERRUPTED (см. NASC_HANDLERS).

Сигнатура

AddAttackDesireEx( int nTargetObjectId, int nMoveType, int nForce, float fDesireValue )

Параметры

nTargetObjectId (int) — object-id цели (например, i0, результат GetObjectID/GetCreatureID).
nMoveType (int) — способ перемещения к цели при выполнении желания
    Используются константы из [manual_pch]:
        @AMT_STAND          (0) — атаковать с места, не сближаясь
        @AMT_MOVE_TO_TARGET (1) — подойти к цели вплотную и атаковать (преследовать)
nForce (int) — флаг форсирования: 1 = выполнить желание в обход проверок (дальности, маны и т.п.); 0 = с проверками.
fDesireValue (float) — приоритет желания.

Пример

    AddAttackDesireEx( i0, @AMT_MOVE_TO_TARGET, 1, 100 );

Атаковать существо с идентификатором i0, преследуя его, в форсированном
режиме, с весом 100.

Пример использования

if ( Rand( 100 ) < 30 ) {
    AddAttackDesireEx( i0, @AMT_MOVE_TO_TARGET, 1, 100 );
}

AddUseSkillDesireNPC🟢 высокая

«хочу применить умение»

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

Важно понимать связку «характер умения + цель». Если умение атакующее
(@ST_ATTACK), целью будет враг; если поддерживающее (@ST_HEAL) — союзник или
сам персонаж (myself.sm — хозяин).

Значения skill_type и nMoveType разобраны ниже, в разделе «Параметры»; те же
два набора используют все функции семейства AddUseSkillDesire (включая
Ex-варианты и AddUseOneTimeSkillDesire).
Связанное событие: начало — USE_SKILL_STARTED, завершение — USE_SKILL_FINISHED(target, skill_name_id, success), срыв — USE_SKILL_INTERRUPTED (см. NASC_HANDLERS).

Сигнатура

AddUseSkillDesire( CSharedCreatureData cCreature, int nSkillNameID, int skill_type, int nMoveType, float fDesireValue )

Параметры

    cCreature (CSharedCreatureData) — цель умения (враг для атаки, союзник/myself.sm для лечения).
    nSkillNameID (int) — ID умения (@s_*).
        значения — из словаря [skill_pch]
    skill_type (int) — характер умения: наступательное (по врагу) или поддерживающее (на союзника/себя)
        Используются константы из [manual_pch]:
            @ST_ATTACK (0) — наступательное умение — применяется по врагу
            @ST_HEAL   (1) — поддержка: лечение/баф — на союзника или на себя
    nMoveType (int) — способ перемещения к цели при выполнении желания
        Используются константы из [manual_pch]:
            @AMT_STAND          (0) — атаковать с места, не сближаясь
            @AMT_MOVE_TO_TARGET (1) — подойти к цели вплотную и атаковать (преследовать)
    fDesireValue (float) — приоритет желания.

Пример наступательного умения. NPC накладывает на атакующего проклятие страха,
не сходя с места, с максимальным приоритетом:

    AddUseSkillDesire(attacker, @s_curse_fear_chance30, @ST_ATTACK, @AMT_STAND, 1000000000);

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

    AddUseSkillDesire(myself.sm, SpecialSkill, @ST_HEAL, @AMT_MOVE_TO_TARGET, 1000000);

Пример использования

if ( Skill_GetConsumeMP( SetCurse ) < myself.sm.mp && Skill_GetConsumeHP( SetCurse ) < myself.sm.hp && Skill_InReuseDelay( SetCurse ) == 0 ) {
    AddUseSkillDesire( attacker, SetCurse, @ST_ATTACK, @AMT_MOVE_TO_TARGET, 1000000 );
}

AddUseSkillDesireExNPC🟢 высокая

применить умение (расширенный вариант)

Развитие AddUseSkillDesire для более тонких случаев. Цель задаётся по
object-id, и добавляются два дополнительных параметра: флаг форсирования
nForce и флаг желания nDesireFlag (в скриптах он почти всегда 0; набор его
возможных значений уточняется в вопросах).
Связанное событие: начало — USE_SKILL_STARTED, завершение — USE_SKILL_FINISHED(target, skill_name_id, success), срыв — USE_SKILL_INTERRUPTED (см. NASC_HANDLERS).

Сигнатура

AddUseSkillDesireEx( int nTargetObjectId, int nSkillNameID, int skill_type, int nMoveType, int nForce, float fDesireValue, int nDesireFlag )

Параметры

    nTargetObjectId (int) — object-id цели.
    nSkillNameID (int) — ID умения.
        значения — из словаря [skill_pch]
    skill_type (int) — характер умения: наступательное (по врагу) или поддерживающее (на союзника/себя)
        Используются константы из [manual_pch]:
            @ST_ATTACK (0) — наступательное умение — применяется по врагу
            @ST_HEAL   (1) — поддержка: лечение/баф — на союзника или на себя
    nMoveType (int) — способ перемещения к цели при выполнении желания
        Используются константы из [manual_pch]:
            @AMT_STAND          (0) — атаковать с места, не сближаясь
            @AMT_MOVE_TO_TARGET (1) — подойти к цели вплотную и атаковать (преследовать)
    nForce (int) — флаг форсирования (1 = в обход проверок дальности/маны).
    fDesireValue (float) — приоритет желания.
    nDesireFlag (int) — битовый флаг «несменяемости» желания (в скриптах обычно 0). Есть биты «несменяемости»: для skill-желания (одноразовое-неудаляемое) и для attack-желания (абсолютное).

Пример — призыватель раздаёт умения по цели хозяина:

    AddUseSkillDesireEx(myself.sm.master.target_id, step0_skill01, @ST_ATTACK, reply, ask, 1000000, 0);

Цель — то, что атакует хозяин призывателя; способ перемещения и флаг форса
берутся из переменных reply и ask, вес миллион, дополнительный флаг 0.

Пример использования

if ( Skill_GetConsumeMP( DDMagic ) < myself.sm.mp && Skill_GetConsumeHP( DDMagic ) < myself.sm.hp && Skill_InReuseDelay( DDMagic ) == 0 ) {
    AddUseSkillDesireEx( myself.sm.id, DDMagic, 0, reply, ask, 1000000, 0 );
}

AddMoveToDesireNPC🟢 высокая

«хочу дойти до точки на карте»

Отправляет персонажа в конкретную точку мира с заданными координатами X, Y, Z.
Чаще всего так возвращают NPC «домой», на место появления, после того как бой
закончился.
Связанное событие: по прибытии — MOVE_TO_FINISHED(x, y, z), при срыве — MOVE_TO_INTERRUPTED (см. NASC_HANDLERS).

Сигнатура

AddMoveToDesire( int nX, int nY, int nZ, float fDesire )

Параметры

    nX      (int) — координата X точки назначения, куда идёт персонаж
    nY      (int) — координата Y точки назначения, куда идёт персонаж
    nZ      (int) — координата Z точки назначения, куда отправляют персонажа
    fDesire (float) — вес (приоритет) желания идти в указанную точку

Пример — вернуться на точку спавна:

    AddMoveToDesire( myself.start_x, myself.start_y, myself.start_z, 30 );

Координаты берутся из сохранённых при рождении start_x/start_y/start_z, вес
небольшой (30) — это спокойное фоновое возвращение, которое легко перебьёт
любое боевое желание.

Пример использования

if ( timer_id == 2001 ) {
    AddMoveToDesire( ( Dest_X + Rand( 400 ) ), ( Dest_Y + Rand( 400 ) ), Dest_Z, 5 );
}

AddFleeDesireNPC🟢 высокая

«хочу убежать»

Персонаж начинает спасаться бегством от указанного существа. Типичный сценарий —
трусливый монстр или раненый NPC, у которого мало здоровья.
Связанное событие: по завершении — FLEE_FINISHED(target), при срыве — FLEE_INTERRUPTED (см. NASC_HANDLERS).

Сигнатура

AddFleeDesire( CSharedCreatureData cCreature, float fDesire )

Параметры

cCreature (CSharedCreatureData) — существо, от которого персонаж убегает
fDesire   (float) — вес (приоритет) желания спасаться бегством

Пример

    AddFleeDesire(creature, 1000000);

Убегать от `creature` с высоким приоритетом, чтобы желание уверенно перекрыло
желание драться.

Пример использования

if ( myself.i_ai2 == 1 ) {
    AddFleeDesire( attacker, 5000 );
}

AddFollowDesireNPC🟢 высокая

«хочу следовать за кем-то»

Заставляет персонажа держаться рядом с указанным существом и ходить за ним.
Часто используется миньонами, которые следуют за своим боссом (myself.boss).
Связанное событие: по завершении — FOLLOW_FINISHED(target), при срыве — FOLLOW_INTERRUPTED (см. NASC_HANDLERS).

Сигнатура

AddFollowDesire( CSharedCreatureData cCreature, float fDesire )

Параметры

cCreature (CSharedCreatureData) — существо, за которым персонаж следует и держится рядом
fDesire (float) — вес (приоритет) желания следовать за указанным существом

Пример

    AddFollowDesire(myself.boss, 5);

Маленький вес (5) здесь уместен: следование — это спокойное фоновое поведение,
которое в любой момент уступит место бою.

Пример использования

if ( creature.is_pc == 1 && Rand( 100 ) < 50 ) {
    AddFollowDesire( creature, 100 );
}

AddMoveAroundDesireNPC🟢 высокая

«хочу побродить рядом»

Лёгкое «холостое» поведение: персонаж не стоит столбом, а слегка перемещается в
окрестности. Первый параметр задаёт длительность/интервал блуждания (в скриптах
обычно 5–10), второй — вес.
Связанное событие: по завершении — MOVE_AROUND_FINISHED, при срыве — MOVE_AROUND_INTERRUPTED (см. NASC_HANDLERS).

Сигнатура

AddMoveAroundDesire( int time, float fDesire )

Параметры

    time (int) — длительность/интервал блуждания в окрестности (обычно 510)
    fDesire (float) — вес (приоритет) желания слегка перемещаться в окрестности

Пример мирного NPC:

    AddMoveAroundDesire(5, 5);

Пример использования

if ( IsWalkedNpc == 1 ) {
    AddMoveAroundDesire( 5, 5 );
}

RemoveDesireNPC🟢 высокая

удалить желания одного типа

Убирает из очереди все желания заданного типа. Единственный аргумент — это код
типа желания (перечисление PhysicalState/PSTATE). Стабильное ядро, одинаковое во всех
хрониках: 0 — бездействие, 1 — блуждать, 2 — стоять пусто, 3 — атаковать, 4 — преследовать,
5 — убегать, 6 — подобрать предмет, 7 — следовать, 8 — истлевать, 9 — идти по вейпойнтам,
10 — применить умение, 11 — идти в точку, 12 — социальное действие. Коды старше 12
(подойти к цели, super point и т.п.) в разных хрониках нумеруются по-разному — точная
таблица по хроникам приведена в структурном NASC_FUNCTIONS.md. На практике в скриптах
встречаются только коды из стабильного ядра: например, RemoveDesire(11) снимает все
желания «идти в координаты». Тот же набор кодов использует и GetTopDesireValue.

Сигнатура

RemoveDesire( int nDesireType )

Параметры

nDesireType (int) — код типа желания (PhysicalState/PSTATE): 0 бездействие · 1 блуждать · 2 стоять ·
    3 атаковать · 4 преследовать · 5 убегать · 6 подобрать предмет · 7 следовать · 8 истлевать ·
    9 идти по вейпойнтам · 10 применить умение · 11 идти в точку · 12 соц-действие. Коды >12
    нумеруются по-разному в разных версиях (полная таблица — в NASC_FUNCTIONS.md).

Пример

RemoveDesire(11);

RemoveAllDesireNPC🟢 высокая

стереть все желания

Полностью очищает очередь желаний — персонаж «забывает», что собирался делать.
Удобно вызывать перед сменой состояния AI, чтобы старое поведение не мешало
новому.

RemoveAllDesire();

Сигнатура

RemoveAllDesire(  )

Параметры

(нет — функция вызывается без аргументов)

Пример использования

if ( myself.sm.db_value == 0 ) {
    RemoveAllDesire( );
}

AddMoveToTargetDesireNPC🟢 высокая

подойти к цели на нужную дистанцию

В отличие от AddMoveToDesire, который ведёт персонажа в неподвижную точку с
координатами, эта функция приближает его к движущейся цели и держит заданную
дистанцию. Цель задаётся идентификатором, дальше идут желаемое расстояние,
служебный флаг (в скриптах обычно 0) и вес.

AddMoveToTargetDesire(h1.creature.id, 150, 0, 1000);

Подойти к существу h1.creature на 150 единиц.
Связанное событие: по прибытии — MOVE_TO_FINISHED, при срыве — MOVE_TO_INTERRUPTED (см. NASC_HANDLERS).

Сигнатура

AddMoveToTargetDesire( int nTargetObjectId, int nDistance, int nDesireFlag, float fDesire )

Параметры

nTargetObjectId (int) — идентификатор движущейся цели, к которой приближается персонаж
nDistance (int) — желаемая дистанция, которую держат до цели
nDesireFlag (int) — служебный флаг режима (в скриптах обычно 0)
fDesire (float) — вес (приоритет) желания подойти к движущейся цели и держать дистанцию

Пример использования

if (IsNullCreature(myself.c_ai0) == 0) {
    AddMoveToTargetDesire(myself.c_ai0.id, 150, 0, 10000);
}

AddChaseDesireNPC🟢 высокая

преследовать существо

Боевое преследование: персонаж гонится за указанным существом. Принимает цель и
вес. По смыслу близка к связке «следовать + атаковать», но это отдельное
самостоятельное желание погони.
Связанное событие: по завершении — CHASE_FINISHED, при срыве — CHASE_INTERRUPTED (см. NASC_HANDLERS).

Сигнатура

AddChaseDesire( CSharedCreatureData cCreature, float fDesire )

Параметры

    cCreature (CSharedCreatureData) — существо, за которым ведётся боевое преследование (погоня)
    fDesire   (float) — вес (приоритет) желания преследовать цель

Пример (иллюстративный):

    AddChaseDesire( talker, 0.0 );

AddFleeDesireExNPC🟢 высокая

убежать на заданное расстояние

То же бегство, что и AddFleeDesire, только теперь можно прямо указать, на какую
дистанцию отбежать. Удобно, когда нужно не просто «спасаться», а отскочить на
конкретное расстояние и, например, начать стрелять издалека.

AddFleeDesireEx( attacker, 300, 100000 );

Отбежать от атакующего на 300 единиц с высоким приоритетом.
Связанное событие: по завершении — FLEE_FINISHED(target), при срыве — FLEE_INTERRUPTED (см. NASC_HANDLERS).

Сигнатура

AddFleeDesireEx( CSharedCreatureData cCreature, int nDistance, float fDesire )

Параметры

cCreature (CSharedCreatureData) — существо, от которого персонаж отбегает
nDistance (int) — дистанция, на которую нужно отбежать от существа
fDesire   (float) — вес (приоритет) желания убежать на заданное расстояние

Пример использования

if ( private == myself.boss ) {
    AddFleeDesireEx( private, 500, 10000000 );
}

AddFollowDesire2NPC🟢 высокая

следовать «в строю», на месте относительно союзника

Продвинутое следование. Простой AddFollowDesire просто тянется за целью, а здесь
можно задать точное место рядом с ней: на каком расстоянии держаться и под каким
углом стоять. Угол отсчитывается в градусах — 0 это спереди, 90 справа, 180
сзади, 270 слева; для удобства есть готовые имена eAFD2_DEGREE_FRONT, _RIGHT,
_BACK, _LEFT. Тип следования выбирает способ удержания позиции: по расстоянию и
углу (eAFD2_FT_DIST_AND_DEGREE) или по смещению по осям (eAFD2_FT_XY_GAP).

AddFollowDesire2(myself.c_ai0, 9, @eAFD2_FT_DIST_AND_DEGREE, 250, @eAFD2_DEGREE_FRONT);

Держаться в 250 единицах строго перед союзником. Так выстраивают свиту и
эскорт-формации.
Связанное событие: по завершении — FOLLOW_FINISHED(target), при срыве — FOLLOW_INTERRUPTED (см. NASC_HANDLERS).

Сигнатура

AddFollowDesire2( CSharedCreatureData cCreature, float value, int follow_type, int dist, int angle )

Параметры

cCreature (CSharedCreatureData) — существо, за которым персонаж следует, занимая позицию рядом
value (float) — вес желания (приоритет следования)
follow_type (int) — тип удержания позиции: по дистанции и углу или по смещению по осям
dist (int) — расстояние, на котором держаться от цели при следовании
angle (int) — угол позиции относительно цели в градусах (0 спереди, 90 справа, 180 сзади, 270 слева); можно использовать константы `eAFD2_DEGREE_FRONT`/`_RIGHT`/`_BACK`/`_LEFT`

Пример использования

if ( IsNullCreature( myself.boss ) == 0 ) {
    AddFollowDesire2( myself.boss, 100, 1, ( 150 + Rand( 150 ) ), ( 90 + Rand( 180 ) ) );
}

AddPetDefaultDesire_FollowNPC🟢 высокая

поведение питомца по умолчанию

Задаёт питомцу базовое «фоновое» желание — следовать за хозяином. Принимает
только вес. Это та самая привычка ручного зверя ходить за владельцем, когда ему
не отдают других команд.

AddPetDefaultDesire_Follow(20.000000);
Связанное событие: по завершении — FOLLOW_FINISHED(target) (см. NASC_HANDLERS).

Сигнатура

AddPetDefaultDesire_Follow( float fDesire )

Параметры

fDesire (float) — вес (приоритет) фонового желания питомца следовать за хозяином

Пример

AddPetDefaultDesire_Follow(20.0);

AddMoveAroundLimitedDesireNPC🟢 высокая

бродить, но недалеко

Как AddMoveAroundDesire, только блуждание ограничено радиусом — персонаж не
уходит дальше указанного расстояния от исходной точки. Три параметра:
длительность, вес и предельный радиус.

AddMoveAroundLimitedDesire(500, 250, 250);

Бродить в пределах 250 единиц.
Связанное событие: по завершении — MOVE_AROUND_FINISHED (см. NASC_HANDLERS).

Сигнатура

AddMoveAroundLimitedDesire( int time, float fDesire, int nDistance )

Параметры

time (int) — длительность/интервал блуждания
fDesire (float) — вес (приоритет) желания бродить в окрестности
nDistance (int) — предельный радиус удаления от исходной точки при блуждании

Пример

AddMoveAroundLimitedDesire(5, 5, 0);

AddMoveSuperPointDesireNPC🟢 высокая

патруль по маршруту

«Супер-точка» — это заранее заданный в данных маршрут патрулирования. Функция
отправляет персонажа идти по такому маршруту: нужно указать его имя, метод
обхода и вес. Вариант с двойкой на конце добавляет ещё один флаг режима.

AddMoveSuperPointDesire( SuperPointName, SuperPointMethod, SuperPointDesire );
AddMoveSuperPointDesire2( SuperPointName, SuperPointMethod, SuperPointDesire, 1 );

Пример

AddMoveSuperPointDesire("iz_aq_antaras01", @MoveSuperPoint_FollowRail, 100);

AddMoveFreewayDesireNPC🟢 высокая

движение по «фривею» (маршруту по номеру)

Близкий родственник супер-точки, но маршрут задаётся не именем, а числовым
идентификатором. Так водят, например, караваны и транспорт по фиксированным
дорогам.

AddMoveFreewayDesire( FreewayID, FreewayMethod, 50 );
Связанное событие: по прибытии в узлы — NODE_ARRIVED (см. NASC_HANDLERS).

Сигнатура

AddMoveFreewayDesire( int nFreewayID, int nFreewayMethod, float fDesire )

Параметры

nFreewayID     (int) — числовой идентификатор маршрута-фривея, по которому движется персонаж.
nFreewayMethod (int) — способ прохождения маршрута. Известное значение: @MoveFreeway_Loop = 1
                       (зациклить маршрут). В одном и том же вызове @MoveFreeway_Loop и 1
                       взаимозаменяемы — отсюда значение константы. Скрипт может передавать
                       свою переменную FreewayMethod.
fDesire        (float) — вес (приоритет) желания двигаться по маршруту (в вызовах 50 / 100 / 99999).

Пример использования

if ( FreewayID > -1 && FreewayDesire > 0 ) {
    AddMoveFreewayDesire( FreewayID, FreewayMethod, FreewayDesire ); 
}

AddMoveToWayPointDesireNPC🟢 высокая

обход списка путевых точек

Здесь маршрут передаётся прямо в виде двух списков: координат путевых точек и
задержек на каждой из них. Персонаж идёт от точки к точке, останавливаясь на
заданное время. Третий аргумент — число проходов маршрута (1 = один проход,
переменная-счётчик задаёт число повторов), четвёртый — вес желания.

AddMoveToWayPointDesire( WayPoints, WayPointDelays, 1, 10 );
Связанное событие: по завершении — MOVE_TO_WAY_POINT_FINISHED, в узлах — NODE_ARRIVED (см. NASC_HANDLERS).

Сигнатура

AddMoveToWayPointDesire( WayPointsType WayPoints, WayPointDelaysType WayPointDelays, int nRepeat, float fDesire )

Параметры

WayPoints      (WayPointsType) — список координат путевых точек маршрута.
WayPointDelays (WayPointDelaysType) — список задержек (времени остановки) на каждой точке.
nRepeat        (int) — число проходов маршрута: 1 = один проход; переменная-счётчик (напр. myself.i_ai1)
                       задаёт нужное число повторов обхода.
fDesire        (float) — вес (приоритет) желания идти по точкам (в вызовах = 10).

Пример использования

if ( myself.i_ai1 > 0 ) {
    AddMoveToWayPointDesire( WayPoints, WayPointDelays, myself.i_ai1, 10 );
} else {
    AddMoveToWayPointDesire( WayPoints, WayPointDelays, 1, 10 );
}

AddMoveFormationDesireNPC🟢 высокая

движение в формации

Задаёт NPC желание двигаться не самому по себе, а в составе строя (формации) — так группа
мобов идёт единым порядком, держа места друг относительно друга. Ключевые аргументы — номер
группы и номер формации: в живых вызовах NPC получает свой GroupID (дважды) и FormationID,
и именно они связывают его с остальными участниками строя (в скрипте это параметры класса,
по умолчанию -1). Последний аргумент — вес (приоритет) желания, как у всех Add*Desire: чем
он больше, тем настойчивее NPC держит строй. Заметно, что вес меняют по ситуации — при
появлении ставят высокий (2000), а после прибытия в очередную путевую точку низкий (50),
чтобы строй не перебивал другие действия. Номер формации ссылается на определение строя из formationinfo.txt (какой именно порядок держать).
Первый (строковый) аргумент — имя «супер-точки» (именованного маршрута); в вызовах пустой.

Сигнатура

AddMoveFormationDesire( string sSuperPoint, int nFreewayId, int nEffectId, int nGroupId1, int nGroupId2, int nFormationId, int nDesireFlag, float fDesire )

Параметры

sSuperPoint (string) — имя «супер-точки» (именованного маршрута движения); в вызовах пустая строка.
nFreewayId  (int) — id «фривея» (маршрута/дороги движения); в вызовах постоянно 35.
nEffectId   (int) — id эффекта движения; в вызовах постоянно 1.
nGroupId1   (int) — первая группа строя (в вызовах GroupID) — связывает участников одного строя.
nGroupId2   (int) — вторая группа строя (в вызовах тот же GroupID).
nFormationId (int) — номер формации из formationinfo.txt — какой именно порядок держать.
nDesireFlag (int) — флаги желания; в вызовах постоянно 1.
fDesire     (float) — вес (приоритет) желания держать строй; в вызовах 2000 при появлении и 50 в пути.

Пример

AddMoveFormationDesire("", 35, 1, GroupID, GroupID, FormationID, 1, 50);

AddDoNothingDesireNPC🟢 высокая

стоять и ничего не делать

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

AddDoNothingDesire( 40, 30 );

Сигнатура

AddDoNothingDesire( int nDuration, float fDesire )

Параметры

nDuration (int) — длительность бездействия (сколько времени стоять без действий)
fDesire   (float) — вес (приоритет) желания бездействовать

Пример использования

if ( x == myself.start_x && y == myself.start_y && z == myself.start_z ) {
    AddDoNothingDesire( 40, 30 );
}

AddDecayingDesireNPC🟢 высокая

начать растворяться (посмертное исчезновение)

«Decaying» в Lineage — это стадия, когда труп убитого существа истлевает и
исчезает. Функция добавляет желание перейти в это состояние; единственный
параметр — вес. Применяется, когда скрипт сам решает убрать персонажа со сцены.
Связанное событие: по завершении — DECAYING_FINISHED, при срыве — DECAYING_INTERRUPTED (см. NASC_HANDLERS).

Сигнатура

AddDecayingDesire( float fDesire )

Параметры

    fDesire (float) — вес (приоритет) желания перейти в состояние истлевания трупа.

Пример (иллюстративный):

    AddDecayingDesire( 0.0 );

AddEffectActionDesireNPC🟢 высокая (подтверждено исходниками движка)

сыграть жест/анимацию

Желание проиграть социальное действие — поклон, жест, эмоцию — обращённое к
указанному существу (чаще всего к самому себе, myself.sm: «жест в никуда»).
Номер действия выбирает конкретную анимацию модели NPC (1, 2, 3 … — первый,
второй, третий социальный жест: Social-анимации клиента). Длительность задаётся
В МИЛЛИСЕКУНДАХ — поэтому в скриптах она часто записана выражением
(N * 1000) / 30: это пересчёт N кадров анимации при 30 кадрах в секунду в
миллисекунды. Вариант с двойкой добавляет пятым аргументом вторую длительность
(тоже мс).

Это «фоновое» желание с малым весом: типовая связка — периодический таймер
проверяет, что NPC стоит без дела (myself.p_state, см. NASC_LANGUAGE), и с
шансом играет жест.

Сигнатура

AddEffectActionDesire( CSharedCreatureData cCreature, int nEffectID, int nEffectDuration, float fDesire )
AddEffectActionDesire2( CSharedCreatureData cCreature, int nEffectID, int nEffectDuration, float fDesire, int nEffectDuration2 )

Параметры

cCreature (CSharedCreatureData) — в чью сторону обращён жест (обычно myself.sm).
nEffectID (int) — номер социального действия/анимации (1, 2, 3 …; набор жестов
    определяется моделью конкретного NPC).
nEffectDuration (int) — длительность жеста, миллисекунды; запись
    (N * 1000) / 30 — перевод N кадров (30 к/с) в мс.
fDesire (float) — вес (приоритет) желания; у фоновых жестов обычно небольшой (50).
nEffectDuration2 (int, только у AddEffectActionDesire2) — вторая длительность, мс.

Пример

AddEffectActionDesire(myself.sm, 3, (MoveAroundSocial * 1000) / 30, 50);
AddEffectActionDesire2(myself.sm, 4, 1500, 10000000, 5000);

Пример использования

    EventHandler TIMER_FIRED_EX( timer_id )
    {
        if (timer_id == 1671) {
            if (  ( myself.sm.hp > (myself.sm.max_hp * 0.400000) )  &&  ( myself.sm.alive != 0 )  &&  ( myself.p_state != 3 )  ) {
                if (MoveAroundSocial > 0 || MoveAroundSocial1 > 0) {
                    if (MoveAroundSocial > 0 && Rand(100) < 40) {
                        AddEffectActionDesire( myself.sm, 3, ((MoveAroundSocial * 1000) / 30), 50 );
                    } else
                    if (MoveAroundSocial1 > 0 && Rand(100) < 40) {
                        AddEffectActionDesire( myself.sm, 2, ((MoveAroundSocial1 * 1000) / 30), 50 );
                    }
                }
            }
            AddTimerEx(1671, 10000);
        }
        super;
    }

Мирный житель раз в 10 секунд, если жив, здоров и не идёт (p_state != 3, то есть
не @ACT_MOVE), с шансом 40% играет один из двух настроенных жестов; длительность
задана параметром класса в кадрах и переведена в миллисекунды.

AddGetItemDesireNPC🟢 высокая

подобрать предмет с земли

Желание поднять лежащий предмет. Базовая версия принимает сам предмет
(объект CSharedItemData), а версия Ex — его числовой object-индекс. Второй
параметр, как обычно, вес желания.

Откуда берётся этот индекс — важный вопрос. Он приходит из события SEE_ITEM,
которое срабатывает, когда NPC замечает лежащие рядом предметы. Первый аргумент
этого обработчика — item_index_list, список увиденных предметов (тип
CItemIndexList). У списка два метода: GetSize даёт количество предметов, а
GetItemIndex(n) — object-индекс n-го предмета (именно его и передают в
AddGetItemDesireEx; этот же индекс можно сравнивать с @-идентификаторами предметов
из [item_pch]). Типичный обработчик выглядит так:

EventHandler SEE_ITEM( item_index_list, i0, i1, i2 )
{
i0 = item_index_list.GetSize( ); // сколько предметов рядом
for( i1 = 0; i1 < i0; ++i1 ) {
AddGetItemDesireEx( item_index_list.GetItemIndex( i1 ), ( 10000 - i1 ) );
}
}

NPC хочет подобрать все увиденные предметы, причём для первых в списке вес выше
(10000 - i1) — их он схватит раньше. Здесь i0, i1, i2 — это локальные переменные-
черновики, объявленные прямо в заголовке обработчика (целые, по префиксу i).
Рядом по смыслу стоят функция LookItem (заставить NPC отреагировать на предмет) и
событие GET_ITEM_FINISHED, которое срабатывает, когда подбор завершён.
Связанное событие: по завершении — GET_ITEM_FINISHED(item, success), при срыве — GET_ITEM_INTERRUPTED; предметы — из SEE_ITEM (см. NASC_HANDLERS).

Пример (иллюстративный):

AddGetItemDesire();

AddUseOneTimeSkillDesireNPC🟢 высокая

применить умение один раз

Полный аналог AddUseSkillDesire со всеми теми же параметрами (цель, умение, его
характер, способ перемещения, вес), но желание срабатывает однократно: персонаж
применяет умение один раз и снимает это желание, а не пытается повторять.
Связанное событие: начало — USE_SKILL_STARTED, завершение — USE_SKILL_FINISHED, срыв — USE_SKILL_INTERRUPTED (см. NASC_HANDLERS).

Сигнатура

AddUseOneTimeSkillDesire( CSharedCreatureData cCreature, int nSkillNameID, int skill_type, int nMoveType, float fDesireValue )

Параметры

    cCreature    (CSharedCreatureData) — существо-цель, на которое однократно применяется умение
    nSkillNameID (int) — идентификатор применяемого умения ([skill_pch])
    skill_type   (int) — характер умения: наступательное (по врагу) или поддерживающее (на союзника/себя)
        Используются константы из [manual_pch]:
            @ST_ATTACK (0) — наступательное умение — применяется по врагу
            @ST_HEAL   (1) — поддержка: лечение/баф — на союзника или на себя
    nMoveType    (int) — способ перемещения к цели при выполнении желания
        Используются константы из [manual_pch]:
            @AMT_STAND          (0) — атаковать с места, не сближаясь
            @AMT_MOVE_TO_TARGET (1) — подойти к цели вплотную и атаковать (преследовать)
    fDesireValue (float) — вес (приоритет) однократного желания применить умение

Пример (иллюстративный):

    AddUseOneTimeSkillDesire( talker, nSkillNameID, skill_type, nMoveType, 0.0 );

AddUseSkillDesireExByActionNPC🟢 высокая

умение, привязанное к действию игрока

Расширение AddUseSkillDesireEx: к обычному набору параметров добавлен
идентификатор клиентского действия. То есть применение умения можно связать с
конкретным действием со стороны клиента/игрока (например, нажатием кнопки).
Связанное событие: начало — USE_SKILL_STARTED, завершение — USE_SKILL_FINISHED, срыв — USE_SKILL_INTERRUPTED (см. NASC_HANDLERS).

Сигнатура

AddUseSkillDesireExByAction( int nTargetObjectId, int nSkillNameID, int skill_type, int nMoveType, int nForce, float fDesireValue, int nDesireFlag, int nClientActionId )

Параметры

nTargetObjectId (int) — идентификатор существа-цели, на которое применяется умение
nSkillNameID (int) — идентификатор применяемого умения
skill_type (int) — характер умения: наступательное (по врагу) или поддерживающее (на союзника/себя)
    Используются константы из [manual_pch]:
        @ST_ATTACK (0) — наступательное умение — применяется по врагу
        @ST_HEAL   (1) — поддержка: лечение/баф — на союзника или на себя
nMoveType (int) — способ перемещения к цели при выполнении желания
    Используются константы из [manual_pch]:
        @AMT_STAND          (0) — атаковать с места, не сближаясь
        @AMT_MOVE_TO_TARGET (1) — подойти к цели вплотную и атаковать (преследовать)
nForce (int) — признак/степень принудительного применения умения
fDesireValue (float) — вес (приоритет) желания применить умение
nDesireFlag (int) — служебный флаг желания (обычно 0)
nClientActionId (int) — идентификатор клиентского действия, с которым связано применение умения

Пример использования

if (step_skill_target01 == 2 && myself.master.alive > 0) {
    AddUseSkillDesireExByAction(myself.master.id, step_skill01, @ST_ATTACK, reply, ask, 1000000, 0, action_id);
}

RandomizeAttackDesireNPC🟢 высокая

случайно сменить цель

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

RandomizeAttackDesire();

Сигнатура

RandomizeAttackDesire(  )

Параметры

(нет — функция вызывается без аргументов)

Пример использования

if ( Rand( 3 ) < 1 ) {
    RandomizeAttackDesire( );
}

GetTopDesireValueNPC🟢 высокая

узнать вес самого приоритетного желания

Возвращает вес верхнего желания заданного типа (тот же код типа, что у RemoveDesire:
3 — атака, 11 — движение и т.д.; а 19 = «верхнее среди всех типов вообще»). Главный
приём её применения — поставить новое желание гарантированно первым: берут текущий
максимум и прибавляют к нему большое число.

AddUseSkillDesire( myself.sm, @s_devastated_recall, @ST_HEAL, @AMT_MOVE_TO_TARGET,
( GetTopDesireValue( 3 ) + 10000000000 ) );

Здесь 3 — это тип «атака»: берут вес верхнего атакующего желания и ставят умение с
приоритетом «нынешний максимум плюс десять миллиардов», то есть оно исполнится
раньше всего остального.

Сигнатура

GetTopDesireValue( int nDesireType )

Параметры

    nDesireType (int) — код типа желания, чей верхний вес нужно получить (например 3 — атака, 11 — движение, 19 — верхнее среди всех типов)

Пример (иллюстративный):

    GetTopDesireValue( nDesireType );

RemoveAttackDesireNPC🟢 высокая

перестать атаковать конкретную цель

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

RemoveAttackDesire(attacker.id);

Сигнатура

RemoveAttackDesire( int nTargetObjectId )

Параметры

nTargetObjectId (int) — идентификатор цели, желание бить которую нужно снять

Пример использования

if ( myself.top_desire_target.is_pc == 0 ) {
    RemoveAttackDesire( myself.boss.id );
}

RemoveAllAttackDesireNPC🟢 высокая

прекратить все атаки

Убирает сразу все боевые желания, но оставляет мирные — движение, следование и
прочее. Этим она отличается от RemoveAllDesire, которая стирает вообще всё.

RemoveAllAttackDesire();

Сигнатура

RemoveAllAttackDesire(  )

Параметры

(нет — функция вызывается без аргументов)

Пример использования

if ( myself.p_state != 3 && myself.p_state != 10 ) {
    RemoveAllAttackDesire( );
}

RemoveAbsoluteDesireNPC🟢 высокая

снять «абсолютное» желание

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

RemoveAbsoluteDesire();

Сигнатура

RemoveAbsoluteDesire(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

RemoveAbsoluteDesire();

ReportDesireNPC🟢 высокая

служебный вывод состояния очереди

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

Сигнатура

ReportDesire(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

ReportDesire( );

АГРЕССИЯ И СПИСОК НЕНАВИСТИ (Hate / Aggro)

11 функций

AddHateInfoNPC🟢 высокая

изменить ненависть к существу

Меняет ненависть указанного существа (CSharedCreatureData) на заданную величину и создаёт
запись в списке ненависти, если её ещё не было. Величину обычно вычисляют как вес, умноженный
на фактор события (урон, применение умения, помощь союзнику); она бывает и отрицательной, когда
ненависть нужно сбить. По декомпилю L2NPC (CNPC::AddHateInfo → HateInfoList::Add_46B410) третий
аргумент кладётся в поле записи HateInfo.m_nMapId (id карты; в скриптах всегда 0), а четвёртый
и пятый — именованные режимы из manual_pch, управляющие добавлением новой записи и обновлением
существующей. Ничего не возвращает.

Сигнатура

AddHateInfo( CSharedCreatureData c, int nHateValue, int nMapId, int nAddMode, int nUpdateMode )

Параметры

c (CSharedCreatureData) — кому менять ненависть.
nHateValue (int) — величина изменения ненависти (может быть отрицательной).
nMapId (int) — id карты в записи ненависти (HateInfo.m_nMapId); в вызовах всегда 0.
nAddMode (int) — режим добавления НОВОЙ цели (manual_pch):
    @AHI_ADD_VALUE (1) — добавить запись даже при переполненном списке;
    @AHI_SET_VALUE (0) — соблюдать ёмкость списка.
nUpdateMode (int) — режим для УЖЕ существующей цели (manual_pch):
    @AHI_DEL_UPDATE (1) — прибавить величину к текущей ненависти (накопить);
    @AHI_IGNORE (0) — заменить значение, без накопления.

Пример

AddHateInfo( c0, 300, 0, 1, 1 );

Пример использования

if ( creature.is_pc != 0 || IsInCategory( @summon_npc_group, creature.class_id ) ) {
    AddHateInfo( creature, ( 7 * 100 ), 0, 1, 1 );
}

GetMaxHateInfoNPC🟢 высокая

запись с максимальной ненавистью

Возвращает запись CHateInfo с наибольшей ненавистью — главную цель NPC. Единственный аргумент из
manual_pch — это не «ранг», а указание, по какому показателю искать максимум. Целью пользуются
как полем creature полученной записи.

Сигнатура

GetMaxHateInfo( int nValueType )

Параметры

nValueType (int) — по какому показателю искать максимум (manual_pch):
    @GMXHI_HATE_VALUE (0) — по постоянной ненависти (обычный вариант);
    @GMXHI_TEMP_VALUE (1) — по временному значению.

Пример

h0 = GetMaxHateInfo(0);

Пример использования

h0 = GetMaxHateInfo(0);
if (IsNullHateInfo(h0) == @FALSE)
{
    if (IsNullCreature(h0.creature) == @FALSE)
    {
        MakeAttackEvent(h0.creature, 100, 0);
    }
}

GetHateInfoCountNPC🟢 высокая

число записей в списке

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

Сигнатура

GetHateInfoCount(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

i0 = GetHateInfoCount();
i1 = GetHateInfoCount();
i10 = GetHateInfoCount();

Пример использования

if ( GetHateInfoCount( ) == 0 && i0 == 1 ) {
    AddHateInfo( creature, 300, 0, 1, 1 );
} else {
    AddHateInfo( creature, 100, 0, 1, 1 );
}

GetHateInfoByCreatureNPC🟢 высокая

запись по конкретному существу

Возвращает запись ненависти CHateInfo для конкретного существа (CSharedCreatureData), чтобы узнать, есть ли оно в списке и насколько ненавидимо. Результат проверяют на валидность через IsNullHateInfo.

Сигнатура

GetHateInfoByCreature( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — по какому существу искать запись.

Пример

h0 = GetHateInfoByCreature(c0);

Пример использования

h0 = GetHateInfoByCreature( speller );
if ( IsNullHateInfo( h0 ) == 1 ) {
    AddHateInfo( speller, 1, 0, 1, 1 );
}

GetHateInfoByIndexNPC🟢 высокая

запись по позиции в списке

Возвращает запись CHateInfo по её порядковой позиции (nIndex) в списке ненависти. Используется для обхода всех целей по их позициям.

Сигнатура

GetHateInfoByIndex( int nIndex )

Параметры

nIndex (int) — порядковая позиция (индекс) записи в списке ненависти.

Пример

h1 = GetHateInfoByIndex(i1);

Пример использования

h0 = GetHateInfoByIndex( i0 );
if ( IsNullCreature( h0.creature ) == 0 && IsInCategory( @tanker_group, h0.creature.occupation ) != 1 && Maker_GetNpcCount( ) < 100 && DistFromMe( h0.creature ) <= 8000 ) {
    CreateOnePrivateEx( @valakas_lavasaurus, "ai_boss07_cannon", 0, 0, FloatToInt( h0.creature.x ) + Rand( 100 ), FloatToInt( h0.creature.y ) + Rand( 100 ), FloatToInt( h0.creature.z ), 0, h0.creature.id, 0, 0 );
}

GetNthHateInfoNPC🟢 высокая

n-я запись с учётом сортировки

Возвращает n-ю запись CHateInfo с учётом критерия сортировки и направления обхода. Первый аргумент задаёт критерий сортировки (по значению ненависти, по возрастанию; иные значения движком не реализованы), второй — порядковый номер записи в отсортированном списке, третий — направление обхода: с начала или с конца списка (например, чтобы взять самого ненавидимого при сортировке по возрастанию).

Сигнатура

GetNthHateInfo( int nSortType, int nIndex, int nDirect )

Параметры

nSortType (int) — критерий сортировки списка ненависти перед выборкой (например, по значению ненависти)
nIndex (int) — порядковый номер записи в отсортированном списке
nDirect (int) — направление обхода: с начала или с конца списка

Пример

h0 = GetNthHateInfo(@GNHI_HATE_VALUE, Rand(9) + 1, @GNHI_ORDER_DOWN);

Пример использования

h0 = GetNthHateInfo(@GNHI_HATE_VALUE, Rand(9) + 1, @GNHI_ORDER_DOWN);
if (IsNullHateInfo(h0) == @FALSE)
{
    if (IsNullCreature(h0.creature) == @FALSE)
    {
        AddUseSkillDesire(h0.creature, Death_Clack, @ST_ATTACK, @AMT_MOVE_TO_TARGET, 10000000);
    }
}

GetAvgHateValueNPC🟢 высокая

средняя ненависть по списку

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

Сигнатура

GetAvgHateValue(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

GetAvgHateValue( );

RemoveHateInfoByCreatureNPC🟢 высокая

забыть конкретную цель

Удаляет указанное существо (CSharedCreatureData) из списка ненависти — NPC «забывает» эту цель. Применяется при сбросе агрессии на конкретного игрока, например после телепорта, смерти или ухода из зоны. Ничего не возвращает.

Сигнатура

RemoveHateInfoByCreature( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — кого убрать из hate-list.

Пример

RemoveHateInfoByCreature(c0);

Пример использования

if ( IsNullCreature( c0 ) == 0 && DistFromMe( c0 ) > 12000 ) {
    RemoveHateInfoByCreature( c0 ); 
}

RemoveAllHateInfoIFNPC🟢 высокая

массовое удаление по условию

Удаляет из списка ненависти все записи, подходящие под заданное условие. Условие задаётся именованной константой из [manual_pch]: убрать невалидные (мёртвые или исчезнувшие) цели, очистить весь список целиком, убрать тех, кто отошёл дальше заданного расстояния, или тех, у кого ненависть ниже порога. Второй аргумент для условий с числом задаёт само расстояние или порог ненависти; для условий «все» и «невалидные» он равен нулю. Ничего не возвращает.

Сигнатура

RemoveAllHateInfoIF( int nCondition, int nThreshold )

Параметры

nCondition (int) — условие удаления
    Используются константы из [manual_pch]:
        @COND_ALL                (0) — все записи списка
        @COND_IS_INVALID         (1) — недействительные записи (цель невалидна/пропала)
        @COND_HAS_HATE_LESS_THAN (2) — записи с ненавистью меньше заданного порога
        @COND_IS_FAR_AWAY        (3) — записи слишком далёких целей
nThreshold (int) — порог: дистанция (для @COND_IS_FAR_AWAY) или значение ненависти
    (для @COND_HAS_HATE_LESS_THAN); для @COND_ALL / @COND_IS_INVALID равен 0.

Пример

RemoveAllHateInfoIF(@COND_ALL, 0);

Пример использования

if ( ( creature.level + 15 ) < myself.sm.level ) {
    RemoveAllHateInfoIF( 0, 0 );
    if ( creature.is_pc != 0 || IsInCategory( @summon_npc_group, creature.class_id ) ) {
        AddHateInfo( creature, ( 7 * 100 ), 0, 1, 1 );
    }
}

SetMaxHateListSizeNPC🟢 высокая

предел размера списка

Задаёт максимальный размер списка ненависти — сколько целей NPC помнит одновременно. Принимает предельное число записей; обычно конфигурируется при инициализации NPC. Ничего не возвращает.

Сигнатура

SetMaxHateListSize( int nMaxSize )

Параметры

nMaxSize (int) — предельное число записей (целей), которое NPC помнит в списке ненависти.

Пример

SetMaxHateListSize(1);

SetHateInfoListIndexNPC🟢 высокая

текущий курсор в списке

Устанавливает текущий индекс-курсор в списке ненависти для последовательного обхода записей. Принимает позицию-курсор; точный смысл не до конца подтверждён. Ничего не возвращает.

Сигнатура

SetHateInfoListIndex( int nIndex )

Параметры

nIndex (int) — текущая позиция-курсор в списке ненависти для последовательного обхода

Пример

SetHateInfoListIndex( 1 );

Пример использования

for( i0 = 0; i0 < 4; ++i0 ) {
    SetHateInfoListIndex( i0 );
    SetMaxHateListSize( 200 );
}

Поведение и параметры NPC (Behavior / Params)

35 функций

AllocCodeInfoListGLOBAL🟢 высокая

создать список-накопитель вариантов

Создаёт пустой список-накопитель (CCodeInfoList) для механизма случайного выбора: в него кладут варианты через SetInfo, затем RandomSelectOne вытягивает один случайно. Используется в логике выбора случайной цели/реплики/ветки.

Сигнатура

AllocCodeInfoList(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

always_list = AllocCodeInfoList( );
random1_list = AllocCodeInfoList( );

SetInfoGLOBAL🟢 высокая

положить вариант в список выбора

Добавляет в список-накопитель (созданный AllocCodeInfoList) пару «код + существо»: nCode — идентификатор варианта, cCreature — связанное существо (например кандидат-цель).

Сигнатура

SetInfo( int nCode, CSharedCreatureData cCreature )

Параметры

nCode     (int) — код-идентификатор варианта в списке-накопителе
cCreature (CSharedCreatureData) — существо, связываемое с кодом

Пример

random1_list.SetInfo( 0, target );

RandomSelectOneGLOBAL🟢 высокая

случайно вытянуть один вариант из списка

Случайно выбирает и возвращает один элемент из списка-накопителя, ранее заполненного через SetInfo. Завершает связку AllocCodeInfoList -> SetInfo -> RandomSelectOne.

Сигнатура

RandomSelectOne(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

code_info = random1_list.RandomSelectOne( );

GetNPCFromIDGLOBAL🟢 высокая

найти NPC по object-id

Возвращает NPC по его object-id (nObjectId), который часто хранят в param*/переменных. Результат проверяют через IsNull* перед обращением к полям.

Сигнатура

GetNPCFromID( int nObjectId )

Параметры

nObjectId (int) — object-id искомого NPC

Пример

npc0 = GetNPCFromID( myself.sm.param3 );
npc0 = GetNPCFromID( c0.id );
npc0 = GetNPCFromID( myself.sm.param1 );

Пример использования

npc0 = GetNPCFromID( myself.sm.param3 );
if ( IsNull( npc0 ) == 0 ) {
    npc0.i_quest0 = 0;
}

IncreaseAPGLOBAL🟢 высокая

начислить очки арены/славы (AP)

Начисляет игроку c очки арены/славы (AP) в количестве nAP.

Сигнатура

IncreaseAP( CSharedCreatureData c, int nAP )

Параметры

c (CSharedCreatureData) — игрок, которому начисляют очки арены/славы
nAP (int) — количество начисляемых очков AP

Пример

IncreaseAP(talker, 6);
IncreaseAP( talker, 5 );
IncreaseAP( talker, 8 );
IncreaseAP( talker, 10 );

SetNpcParamGLOBAL🟢 высокая

задать рантайм-параметр NPC

Задаёт рантайм-параметр NPC c (vital/боевой коэффициент): nVcpType — тип (@VCP_*), dValue — значение (float).

Сигнатура

SetNpcParam( CSharedCreatureData cCreature, int nVcpType, float dValue )

Параметры

cCreature (CSharedCreatureData) — NPC, которому задают рантайм-параметр
nVcpType (int) — выбор типа задаваемого параметра
    значение из семейства @VCP_* — свойства существа (HP, MP, статы, атака/защита и т.п.); полный список в [manual_pch]
dValue (float) — новое значение параметра

Пример

SetNpcParam( myself.sm, @VCP_HP, myself.sm.max_hp * 0.2 );

Пример использования

if ( myself.sm.flag == @SCE_FRINTESSA_SPAWN_DEMON_FINAL ) {
    SetNpcParam( myself.sm, @VCP_HP, myself.sm.max_hp * 0.2 );
    return;
}

GetValueGLOBAL🟢 высокая

прочитать атомарное значение

Читает атомарное значение (счётчик с потокобезопасным доступом, CAtomicValue).

Сигнатура

GetValue(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if ( myself.av_quest0.GetValue( ) != 1 ) {

Пример использования

if ( myself.av_quest0.GetValue( ) != 1 ) {
    myself.i_quest0 = 0;
}

GetPchValueGLOBAL🟢 высокая

резолвить значение pch-константы по имени

Резолвит значение pch-константы по её имени-строке sName (динамический доступ к @-словарю).

Сигнатура

GetPchValue( string name )

Параметры

name (string) — имя `@`-константы, значение которой нужно получить

Пример

if ( GetPchValue( "client_hf" ) == 1 ) {

Пример использования

if ( GetPchValue( "client_hf" ) == 1 ) {
    ShowBuySell( talker, SellList0, BuyList0, -50 );
} else {
    Sell( talker, SellList0, ShopName, fnBuy, _blank, _blank );
}

IsSameStringGLOBAL🟢 высокая

сравнить две строки

Сравнивает две строки s1 и s2: возвращает 1, если равны, иначе 0.

Сигнатура

IsSameString( string s1, string s2 )

Параметры

s1 (string) — первая сравниваемая строка
s2 (string) — вторая сравниваемая строка

Пример

if ( IsSameString( DoorName, "altar_door_controller_basic_default" ) == 0 ) {

Пример использования

if ( IsSameString( DoorName, "altar_door_controller_basic_default" ) == 0 ) {
    Castle_GateOpenClose2( DoorName, 0 );
}

IntToFStrGLOBAL🟢 высокая

число в строку для подстановки во фразы

Преобразует число n в строку для подстановки во фразы (FString).

Сигнатура

IntToFStr( int64 nNum )

Параметры

nNum (int64) — число, которое преобразуют в строку для подстановки во фразы

Пример

ChangeFStrNickName(myself.sm, 1801100, IntToFStr(i1));

GetCurrentTickNPC🟢 высокая

текущее серверное время в тиках

Возвращает текущее серверное время в тиках (миллисекундах серверного таймера). Используется для замера интервалов: запомнить тик, позже сравнить разницу (кулдауны, тайминги фаз, анти-спам диалога).

Сигнатура

GetCurrentTick(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if ( ( GetCurrentTick( ) - talker.quest_last_reward_time ) > 1 ) {

Пример использования

i0 = GetCurrentTick( );
if ( i0 > ( myself.i_quest1 + 5 ) ) {
    if ( IsNullCreature( myself.top_desire_target ) == 0 ) {
        if ( Skill_GetConsumeMP( Hold ) < myself.sm.mp && Skill_GetConsumeHP( Hold ) < myself.sm.hp && Skill_InReuseDelay( Hold ) == 0 ) {
            AddUseSkillDesire( myself.top_desire_target, Hold, @ST_ATTACK, @AMT_MOVE_TO_TARGET, 1000000 );
        }
    }
}

GetTickNPC🟢 высокая

текущее серверное время в тиках

То же, что GetCurrentTick: возвращает текущее серверное время в тиках для замера интервалов между событиями.

Сигнатура

GetTick(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

myself.i_ai1 = GetTick( );

Пример использования

if ( ( GetTick( ) - myself.i_ai1 ) > ( ( 5 * 60 ) * 1000 ) ) {
    myself.i_ai3 = 0;
    BroadcastScriptEvent( 1000, 0, 300 );
}

GetLastAttackerNPC🟢 высокая

последний, кто атаковал NPC

Возвращает дескриптор существа, которое последним нанесло урон этому NPC (для ответных реакций). Результат проверяют через IsNull* перед обращением к полям.

Сигнатура

GetLastAttacker(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

c1 = GetLastAttacker( );
c0 = GetLastAttacker( );
target = GetLastAttacker( );
c2 = GetLastAttacker();

Пример использования

c1 = GetLastAttacker( );
if ( c1.master ) { c1 = c1.master; }

GetMasterUserNPC🟢 высокая

игрок-хозяин призванного NPC

Для призванного/саммон-NPC возвращает дескриптор игрока-хозяина. Результат проверяют через IsNull* перед обращением к полям.

Сигнатура

GetMasterUser(  )

Параметры

    (нет — функция вызывается без аргументов)

Пример: в наших скриптах прямых вызовов нет.

LookNeighborNPC🟢 высокая

осмотреться, спровоцировать восприятие соседей

Заставляет NPC «осмотреться»: провоцирует события восприятия соседей в радиусе nRadius (часто перед поиском целей).

Сигнатура

LookNeighbor( int nRadius )

Параметры

nRadius (int) — радиус осмотра соседей (в вызовах, напр., 300).

Пример

if ( AttackLowLevel == 1 ) { LookNeighbor( 300 ); }

ChangeMoveTypeNPC🟢 высокая

сменить манеру передвижения

Меняет манеру передвижения NPC: nMoveType = @MT_SLOW (0, шагом) или @MT_FAST (1, бегом).

Сигнатура

ChangeMoveType( int nMoveType )

Параметры

nMoveType (int) — способ перемещения к цели при выполнении желания
    Используются константы из [manual_pch]:
        @AMT_STAND          (0) — атаковать с места, не сближаясь
        @AMT_MOVE_TO_TARGET (1) — подойти к цели вплотную и атаковать (преследовать)

Пример

ChangeMoveType(@MT_FAST);
ChangeMoveType( 1 );
ChangeMoveType( 0 );
ChangeMoveType(@MT_SLOW);

Пример использования

if ( IsNullCreature( c0 ) == 0 ) {
    ChangeMoveType( 1 );
    AddMoveToDesire( FloatToInt( c0.x ), FloatToInt( c0.y ), FloatToInt( c0.z ), 10000000 );
}

ChangeMoveType2NPC🟢 высокая

сменить манеру передвижения принудительно

То же, что ChangeMoveType, плюс bForce: при 1 смена применяется принудительно, в обход проверок.

Сигнатура

ChangeMoveType2( int nMoveType, int bForce )

Параметры

nMoveType (int) — способ перемещения к цели при выполнении желания
    Используются константы из [manual_pch]:
        @AMT_STAND          (0) — атаковать с места, не сближаясь
        @AMT_MOVE_TO_TARGET (1) — подойти к цели вплотную и атаковать (преследовать)
bForce (int) — флаг принудительной смены в обход проверок (1 — принудительно)

Пример

ChangeMoveType2(@MT_FAST, 1);
ChangeMoveType2( 0, 1 );
ChangeMoveType2( 1, 1 );
ChangeMoveType2(@MT_SLOW, 1);

FixMoveTypeNPC🟢 высокая

зафиксировать/разблокировать тип движения

Фиксирует или разблокирует текущий тип движения NPC: bBlock = 1 запрещает смену, 0 разрешает.

Сигнатура

FixMoveType( int bBlock )

Параметры

bBlock (int) — флаг блокировки: 1 — запретить смену типа движения, 0 — разрешить

Пример

FixMoveType(1);

StopMoveNPC🟢 высокая

немедленно остановить движение

Немедленно останавливает движение NPC.

Сигнатура

StopMove(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

StopMove( );

Пример использования

if ( myself.sm.in_peacezone != 0 ) {
    StopMove( );
    RemoveAllDesire( );
    RemoveAllHateInfoIF( 0, 0 );
    InstantTeleport( myself.sm, myself.start_x, myself.start_y, myself.start_z );
    return;
}

SetVisibleNPC🟢 высокая

показать/спрятать NPC

Показывает или прячет NPC: bVisible = @FALSE (0) делает невидимым, @TRUE (1) — видимым.

Сигнатура

SetVisible( int bVisible )

Параметры

bVisible (int) — видимость NPC: @TRUE (1) — показать, @FALSE (0) — спрятать.

Пример

SetVisible(@FALSE);

Пример использования

if ( GetSSQStatus( ) != @SS_SEAL_EFFECT && GetSSQStatus( ) != @SS_ACCOUNTING ) {
    SetVisible( 0 );
}

ChangeNPCStateNPC🟢 высокая

сменить визуальное состояние NPC

Меняет визуальное состояние/анимационный режим NPC c на nState.

Сигнатура

ChangeNPCState( CSharedCreatureData pCreatureShared, int nState )

Параметры

pCreatureShared (CSharedCreatureData) — само существо, чьё визуальное состояние меняют (обычно `myself.sm`)
nState (int) — номер нового анимационного состояния/режима отображения

Пример

ChangeNPCState(myself.sm, 1);

Пример использования

if ( timer_id == OFF_TIMER ) {
    ChangeNPCState( myself.sm, 2 );
}

ChangeStatusNPC🟢 высокая

сменить боевой статус/режим NPC

Меняет отображаемый статус NPC — видимость имени и возможность выбрать его целью.

Сигнатура

ChangeStatus( int nStatus )

Параметры

nStatus (int) — новый статус NPC (manual_pch):
    @NAME_INVISIBLE (0) — скрыть имя; @NAME_VISIBLE (1) — показать имя;
    @TARGET_DISABLE (2) — запретить выбор целью; @TARGET_ENABLE (3) — разрешить выбор целью.

Пример

ChangeStatus(@TARGET_DISABLE);

ChangeDirNPC🟢 высокая

развернуть NPC к цели

Разворачивает NPC к цели nTargetId под углом nAngle; первый аргумент — само существо (обычно myself.sm).

Сигнатура

ChangeDir( CSharedCreatureData pCreatureShared, int nTargetId, int nAngle )

Параметры

pCreatureShared (CSharedCreatureData) — само существо, которое разворачивают (обычно `myself.sm`)
nTargetId (int) — идентификатор цели, в сторону которой поворачивают NPC
nAngle (int) — угол доворота относительно цели

Пример

ChangeDir(myself.sm, c0.id, 0);

Пример использования

if ( FloatToInt( myself.sm.x ) == myself.start_x && myself.start_y == FloatToInt( myself.sm.y ) ) {
    ChangeDir( myself.sm, 0, direction );
} else {
    InstantTeleport( myself.sm, myself.start_x, myself.start_y, myself.start_z );
}

SuicideNPC🟢 высокая

NPC мгновенно умирает

NPC мгновенно «умирает» без указания виновника.

Сигнатура

Suicide(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

Suicide( );

Пример использования

if ( skill_name_id == SelfExplosion ) {
    Suicide( );
}

SuicideByNPC🟢 высокая

NPC умирает с указанием виновника

То же, что Suicide, но указывает виновника c (для лога/дропа).

Сигнатура

SuicideBy( CSharedCreatureData c )

Параметры

c (CSharedCreatureData) — существо-виновник гибели (записывается в лог/учитывается для дропа)

Пример

SuicideBy( myself.c_ai0 );

PlayAnimationNPC🟢 высокая

проиграть анимацию/жест NPC

Проигрывает анимацию/жест NPC окружающим игрокам. По декомпилю L2NPC (CNPC::PlayAnimation_49348C)
оба числа уходят клиентам пакетом opcode 144 "cddd": первое — номер анимации, второе — радиус
показа (в скриптах переменная зовётся FreewayPlayAniRange; в вызовах 600, 5000).

Сигнатура

PlayAnimation( int nAnimId, int nRange )

Параметры

nAnimId (int) — номер/идентификатор проигрываемой анимации или жеста (в вызовах 0..4).
nRange (int) — радиус показа анимации окружающим (в вызовах 600, 5000).

Пример

PlayAnimation(script_event_arg3, FreewayPlayAniRange);

Пример использования

if (timer_id == PHASE_ANI) {
    PlayAnimation(4, 600);
}

GetMyDirectionNPC🟢 высокая

текущий heading NPC

Возвращает текущий heading (направление взгляда) NPC; единицы — как у GetDirection.

Сигнатура

GetMyDirection(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

CreateOnePrivateEx(corpse, ai_corpse, 0, 0, FloatToInt(myself.sm.x), FloatToInt(myself.sm.y), FloatToInt(myself.sm.z), GetMyDirection(), GetIndexFromCreature(myself.sm), GetIndexFromCreature(myself.c_ai1), 0);

IsInThisTerritoryNPC🟢 высокая

находится ли NPC в именованной территории

Возвращает 1, если NPC находится в именованной территории sName, иначе 0.

Сигнатура

IsInThisTerritory( string sName )

Параметры

sName (string) — имя проверяемой именованной территории (напр. "25_15_frintessa_NoCharge01").

Пример

if ( IsInThisTerritory( "25_15_frintessa_NoCharge01" ) == 1 ) {

Пример использования

if ( IsInThisTerritory( "25_15_frintessa_NoCharge01" ) == 1 ) {
    if ( IsNullCreature( c2 ) == 0 ) {
        AddUseSkillDesire( c2, DashAllVer1, @ST_ATTACK, @AMT_MOVE_TO_TARGET, 10000 );
    }
}

IsInCombatModeNPC🟢 высокая

в боевом ли режиме существо

Возвращает, находится ли существо c в боевом режиме (сравнивают с @FALSE/@TRUE).

Сигнатура

IsInCombatMode( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, у которого проверяют боевой режим

Пример

if (i0 > 15 && IsInCombatMode(myself.sm) == @FALSE)

Пример использования

if ( IsInCombatMode( myself.sm ) == 0 ) {
    return;
}

IsBossNPC🟢 высокая

является ли NPC боссом

Возвращает, является ли сам NPC боссом (сравнивают с @FALSE/@TRUE).

Сигнатура

IsBoss(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if (IsBoss() == @FALSE)

Пример использования

if ( IsBoss( ) == 0 ) {
    AddAttackDesire( speller, @AMT_MOVE_TO_TARGET, desire );
}

IsMyBossAliveNPC🟢 высокая

жив ли «мой» босс

Для миньона возвращает, жив ли его босс (сравнивают с @FALSE/@TRUE).

Сигнатура

IsMyBossAlive(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if (IsMyBossAlive() == @FALSE)

Пример использования

if ( IsMyBossAlive( ) == 0 ) {
    Despawn( );
}

GetIdleTimeNPC🟢 высокая

сколько существо простаивает

Возвращает, сколько существо c простаивает (без действий).

Сигнатура

GetIdleTime( CSharedCreatureData c )

Параметры

c (CSharedCreatureData) — существо, время простоя которого запрашивают

Пример

if (creature.is_pc == 1 && GetIdleTime(creature) > 60)

Пример использования

if (creature.is_pc == 1 && GetIdleTime(creature) > 60)
    {
        InstantTeleport(creature, 35118, 147753, -3528);
    }

SetDieEventNPC🟢 высокая

настроить событие при смерти NPC

Включает/выключает у существа рассылку события его смерти окружающим. По декомпилю L2NPC
(CNPC::SetDieEvent_496C38) второй аргумент — булев флаг (хранится как c!=0), третий — радиус
рассылки, ограниченный движком значением ≤ 2048 (иначе лог «Too long distance to broadcast»).

Сигнатура

SetDieEvent( CSharedCreatureData c, int bEnable, int nBroadcastDist )

Параметры

c (CSharedCreatureData) — существо, для которого настраивают рассылку события смерти.
bEnable (int) — включить (1) или выключить (0) рассылку события смерти.
nBroadcastDist (int) — радиус рассылки события, ≤ 2048 (в вызовах 2000; больше — отклоняется с ошибкой в лог).

Пример

SetDieEvent( creature, 1, 2000 );
SetDieEvent( target, 1, 2000 );
SetDieEvent(attacker, 1, 2000);

Пример использования

if ( IsNullCreature( creature ) == 0 && creature.is_pc == 1 ) {
    SetDieEvent( creature, 1, 2000 );
}

IncrementParamNPC🟢 высокая

изменить параметр персонажа

Изменяет параметр персонажа c на величину nValue. nParam — @PARAM_*: EXP=0, SP=1, INT=2, STR=3, CON=4, MEN=5, DEX=6, WIT=7, LEVEL=8, PKCOUNT=9.

Сигнатура

IncrementParam( CSharedCreatureData c, int nParam, int64 nValue )

Параметры

c (CSharedCreatureData) — персонаж, чей параметр изменяют.
nParam (int) — выбор изменяемого параметра персонажа
    Используются константы из [manual_pch]:
        @PARAM_EXP              (0) — опыт (EXP)
        @PARAM_SP               (1) — очки умений (SP)
        @PARAM_INT              (2) — Интеллект (INT)
        @PARAM_STR              (3) — Сила (STR)
        @PARAM_CON              (4) — Выносливость (CON)
        @PARAM_MEN              (5) — Сила духа (MEN)
        @PARAM_DEX              (6) — Ловкость (DEX)
        @PARAM_WIT              (7) — Остроумие (WIT)
        @PARAM_LEVEL            (8) — уровень
        @PARAM_PKCOUNT          (9) — счётчик убийств игроков (PK)
        @PARAM_KARMA            (13) — карма
        @PARAM_SKILL_MULTIPLIER (65536) — множитель умений
nValue (int64) — величина изменения параметра (со знаком).

Пример

IncrementParam( talker, @PARAM_EXP, 2299404 * QuestExpRate );

Пример использования

if ( DeleteItem1( talker, @adena, 650000 ) ) {
    IncrementParam( talker, @PARAM_SP, -30000 );
    PledgeLevelUp( talker, 1 );
}

GetAIParameterNPC🟢 высокая

прочитать AI-параметр существа

Читает AI-параметр существа c по его типу nType.

Сигнатура

GetAIParameter( CSharedCreatureData c, int Type )

Параметры

c (CSharedCreatureData) — существо, AI-параметр которого читают
Type (int) — какой показатель инвентаря вернуть
    Используются константы из [manual_pch]:
        @IPT_CURRENT_SLOT_COUNT   (0) — сейчас занято слотов инвентаря
        @IPT_MAX_SLOT_COUNT       (1) — максимум слотов инвентаря
        @IPT_CURRENT_WEIGHT       (2) — текущий вес переносимого
        @IPT_MAX_CARRY_WEIGHT     (3) — предельный переносимый вес
        @IPT_CURRENT_QUEST_SCOUNT (4) — сейчас занято квестовых слотов
        @IPT_MAX_QUEST_SCOUNT     (5) — максимум квестовых слотов

Пример

i0 = GetAIParameter(myself.c_ai0, 3);

БОЙ, ПОВЕДЕНИЕ, ОБЪЕКТЫ МИРА И UI-СООБЩЕНИЯ (Combat / WorldTrap / AirShip / UI)

40 функций

SendUIEventGLOBAL🟢 высокая

отправить UI-событие

Отправляет событие интерфейса nMode игроку talker (CSharedCreatureData) с числовыми параметрами nArg1, nArg2 и строками sArg3..10; используется для счётчиков времени, прогресс-баров и т.п. Метод глобального объекта (CGlobalObject), без возврата.

Сигнатура

SendUIEvent( CSharedCreatureData cCreature, int nMode, int nArg1, int nArg2, string sArg1, string sArg2, string sArg3, string sArg4, string sArg5, string sArg6 )

Параметры

cCreature (CSharedCreatureData) — игрок-получатель события интерфейса
nMode     (int) — режим (тип) события интерфейса
nArg1     (int) — числовой параметр 1 события
nArg2     (int) — числовой параметр 2 события
sArg1     (string) — строковый параметр 1
sArg2     (string) — строковый параметр 2
sArg3     (string) — строковый параметр 3
sArg4     (string) — строковый параметр 4
sArg5     (string) — строковый параметр 5
sArg6     (string) — строковый параметр 6

Пример

SendUIEvent( talker, 0, 0, 0, "0", "0", "0", "", "0", "0" );

Пример использования

if ( talker.flag == 125 ) {
    SendUIEvent( talker, 0, 0, 0, "0", "60", "0", "Elapsed", "0", "0" );
}

SendUIEventFStrGLOBAL🟢 высокая

UI-событие с FString

То же, что SendUIEvent, но с поддержкой FString-форматирования (nFstringId — ID фразы для вставки и дополнительные строки sArg11..15). Метод глобального объекта (CGlobalObject), без возврата.

Сигнатура

SendUIEventFStr( CSharedCreatureData cCreature, int nArg1, int nArg2, int nArg3, string pStr1, string pStr2, string pStr3, string pStr4, string pStr5, int nArg4, string pStr6, string pStr7, string pStr8, string pStr9, string pStr10 )

Параметры

cCreature (CSharedCreatureData) — игрок-получатель события интерфейса
nArg1 (int) — режим (тип) события интерфейса
nArg2 (int) — числовой параметр 1 события
nArg3 (int) — числовой параметр 2 события
pStr1 (string) — строковый параметр 1
pStr2 (string) — строковый параметр 2
pStr3 (string) — строковый параметр 3
pStr4 (string) — строковый параметр 4
pStr5 (string) — строковый параметр 5
nArg4 (int) — идентификатор FString-фразы для вставки
pStr6 (string) — дополнительный строковый параметр 1
pStr7 (string) — дополнительный строковый параметр 2
pStr8 (string) — дополнительный строковый параметр 3
pStr9 (string) — дополнительный строковый параметр 4
pStr10 (string) — дополнительный строковый параметр 5

Пример

SendUIEventFStr(target, 2, 0, 0, p_sNoTimer, IntToStr(myself.av_ai0.GetValue()), IntToStr(inst_duration), p_sPercent, "0", p_iTitleUI, _blank, _blank, _blank, _blank, _blank);

Пример использования

if (myself.sm.flag == 2) {
    SendUIEventFStr(target, 2, 0, 0, p_sNoTimer, IntToStr(myself.av_ai0.GetValue()), IntToStr(inst_duration), p_sPercent, "0", p_iTitleUI, _blank, _blank, _blank, _blank, _blank);
} else {
    SendUIEventFStr(target, 5, 0, 0, p_sNoTimer, IntToStr(myself.av_ai0.GetValue()), IntToStr(inst_duration), p_sPercent, "0", p_iTitleUI, _blank, _blank, _blank, _blank, _blank);
}

ShowMsgInTerritoryGLOBAL🟢 высокая

сообщение в территории

Объявляет системное сообщение nSysMsgId всем игрокам в названной территории sAnnounceArea с объектом зоны nZoneObjId. Метод глобального объекта (CGlobalObject), без возврата.

Сигнатура

ShowMsgInTerritory( int nInZoneObjectId, string pwsAnnounceAreaName, int nSysMsgId )

Параметры

nInZoneObjectId (int) — идентификатор объекта зоны, в которой объявляется сообщение
pwsAnnounceAreaName (string) — название территории для объявления
nSysMsgId (int) — идентификатор системного сообщения

Пример

ShowMsgInTerritory(0, AnnounceZone, systemmsgId);
ShowMsgInTerritory( 0, AnonceZone, 8377 );
ShowMsgInTerritory(0, AnonceZone, 8380);
ShowMsgInTerritory(0, AnonceZone, 8381);

ShowFStrMsgInTerritory2GLOBAL🟢 высокая

FString-сообщение в территории

То же, что ShowMsgInTerritory, но с FString-форматированием по nFstringId и подстановкой до 5 строк sStr1..5. Метод глобального объекта (CGlobalObject), без возврата.

Сигнатура

ShowFStrMsgInTerritory2( int nInZoneObjectId, string pwsAnnounceAreaName, int nFstringId, string Str1, string Str2, string Str3, string Str4, string Str5 )

Параметры

nInZoneObjectId (int) — идентификатор объекта зоны, в которой объявляется сообщение
pwsAnnounceAreaName (string) — название территории для объявления
nFstringId (int) — идентификатор FString-фразы для форматирования
Str1 (string) — строка подстановки 1
Str2 (string) — строка подстановки 2
Str3 (string) — строка подстановки 3
Str4 (string) — строка подстановки 4
Str5 (string) — строка подстановки 5

Пример

ShowFStrMsgInTerritory2(0, "25_15_frintezza_announce01", 1010643, IntToStr(myself.av_ai1.GetValue()), _blank, _blank, _blank, _blank);

GetAcquireExpRateBossGLOBAL🟢 высокая

множитель опыта от босса

Возвращает множитель опыта для персонажа уровня nLevel при убийстве босса (обычно меньше 1 для высоких уровней). Метод глобального объекта (CGlobalObject), возвращает float.

Сигнатура

GetAcquireExpRateBoss( int nLevel )

Параметры

nLevel (int) — уровень персонажа, для которого возвращается множитель опыта с босса

Пример

i0 = FloatToInt(InstanceBossGetExp * GetAcquireExpRateBoss(target.level) * f0);

AddPCSocialGLOBAL🟢 высокая

социальное действие игроку

Выполняет социальное действие nSocialAction (танец, приветствие, боевой крик и т.п.) для персонажа с индексом nUserIndex. Метод глобального объекта (CGlobalObject), без возврата.

Сигнатура

AddPCSocial( int nUserIndex, int nSocialAction )

Параметры

nUserIndex    (int) — индекс персонажа-исполнителя. Берётся из GetIndexFromCreature(talker).
nSocialAction (int) — тип социального жеста. Это константа @SAT_* (задаётся в manual_pch);
                      голое число эквивалентно константе (в вызовах 3 == @SAT_VICTORY):

в коде                        число  смысл
@SAT_GREET                    2      приветствие
@SAT_VICTORY                  3      жест победы
@SAT_ADVANCE                  4      «вперёд»
@SAT_NO                       5      «нет»
@SAT_YES                      6      «да»
@SAT_BOW                      7      поклон
@SAT_UNAWARE                  8      растерянность
@SAT_WAITINGA                 9      ожидание
@SAT_LAUGH                    10     смех
@SAT_APPLAUS                  11     аплодисменты
@SAT_DANCE                    12     танец
@SAT_SAD                      13     грусть
@SAT_LEVEL_UP                 15     эффект повышения уровня
@SAT_HERO                     16     эффект героя
@SAT_CURSED_WEAPON_LEVEL_UP   17     повышение уровня проклятого оружия

В скриптах реально встречаются: @SAT_VICTORY/3 (массово), @SAT_BOW/7. Остальные значения —
из общего перечня жестов, доступны той же функцией.

Пример

AddPCSocial( GetIndexFromCreature(talker), @SAT_VICTORY );   // игрок проигрывает жест победы (то же, что 3)

CanAttackNPC🟢 высокая

проверить возможность атаки

Проверяет, может ли NPC атаковать существо target (CSharedCreatureData); возвращает 1, если атака возможна, 0 — если заблокирована (иммунитет, мирная зона, призрак и т.п.). Метод существа (CNPC).

Сигнатура

CanAttack( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — цель атаки, для которой проверяется возможность нападения NPC

Пример

if (CanAttack(myself.top_desire_target) == @TRUE)

Пример использования

if ( CanAttack( attacker ) == 1 ) {
    MakeAttackEvent( attacker, ( damage / 2 ), 0 ); 
}

IsAttackableNPC🟢 высокая

проверить атакуемость цели

Проверяет, может ли цель target (CSharedCreatureData) быть поражена — существует ли на карте, не скрыта ли, не в спецсостоянии; возвращает 1, если цель атакуема. Метод существа (CNPC).

Сигнатура

IsAttackable( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — цель, для которой проверяется доступность для поражения

Пример

if (attacker.is_pc == @FALSE && ((attacker.npc_class_id != 1033609 && attacker.npc_class_id != 1033611 && attacker.npc_class_id != 1033613 && attacker.npc_class_id != 1033615 && attacker.npc_class_id != 1033618 && attacker.npc_class_id != 1033617 && attacker.npc_class_id != 1033798) && (attacker.npc_class_id != 1033620 && attacker.npc_class_id != 1033622 && attacker.npc_class_id != 1033624 && attacker.npc_class_id != 1033626 && attacker.npc_class_id != 1033629 && attacker.npc_class_id != 1033628 && attacker.npc_class_id != 1033799) && (attacker.npc_class_id != 1033631 && attacker.npc_class_id != 1033633 && attacker.npc_class_id != @hayuk_cartia_95_02 && attacker.npc_class_id != @elliyah_cartia_95_02 && attacker.npc_class_id != @elliyah_guard_95_01 && attacker.npc_class_id != @alice_cartia_95_02 && attacker.npc_class_id != @cartia_95_mirror) && attacker.npc_class_id != @soldier_cartia_85_01 && attacker.npc_class_id != @soldier_cartia_90_01 && attacker.npc_class_id != @soldier_cartia_95_01 && attacker.npc_class_id != @prisoner_cartia_85_01 && attacker.npc_class_id != @prisoner_cartia_90_01 && attacker.npc_class_id != @prisoner_cartia_95_01) && IsInCategory(@summon_npc_group, attacker.npc_class_id) == @FALSE && IsAttackable(attacker) == 1)

Пример использования

if (IsAttackable(myself.sm) == @TRUE)
{
    SetAttackable(myself.sm, @FALSE);
}

SetAttackableNPC🟢 высокая

сделать цель атакуемой или неатакуемой

Устанавливает или снимает флаг атакуемости существа target (CSharedCreatureData): bFlag @TRUE/1 — атакуемая, @FALSE/0 — неатакуемая; обычно применяется к myself.sm для самого NPC. Метод существа (CNPC), без возврата.

Сигнатура

SetAttackable( CSharedCreatureData pCreatureShared, int nAttackable )

Параметры

pCreatureShared (CSharedCreatureData) — существо, которому задаётся флаг атакуемости (обычно сам NPC через `myself.sm`)
nAttackable (int) — флаг: `@TRUE`/1 — сделать атакуемым, `@FALSE`/0 — снять атакуемость

Пример

SetAttackable(myself.sm, @FALSE);
SetAttackable(myself.sm, @TRUE);
SetAttackable( myself.sm, 0 );
SetAttackable( myself.sm, 1 );

Пример использования

if ( attacker.is_pc == @TRUE && skill_name_id == @s_prominence11 ) {
    SetAttackable(myself.sm, @FALSE);
    Say("Now is NOT Attackable!");
}

GetPathfindFailCountNPC🟢 высокая

счётчик ошибок поиска пути

Возвращает количество последовательных неудач при расчёте пути NPC; обнуляется при успешном движении. Метод существа (CNPC), без аргументов.

Сигнатура

GetPathfindFailCount(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if (GetPathfindFailCount() > 10 && speller == myself.top_desire_target && FloatToInt(myself.sm.hp) != FloatToInt(myself.sm.max_hp)) {

Пример использования

if (GetPathfindFailCount() > 10 && speller == myself.top_desire_target && FloatToInt(myself.sm.hp) != FloatToInt(myself.sm.max_hp)) {
    InstantTeleport(myself.sm, FloatToInt(speller.x), FloatToInt(speller.y), FloatToInt(speller.z));
}

GetWayPointDelayNPC🟢 высокая

задержка в узле маршрута

Возвращает время задержки на узле маршрута с индексом nIndex из массива wayPoints (waypointdelaystype). Метод существа (CNPC), возвращает int.

Сигнатура

GetWayPointDelay( WayPointDelaysType aWayPoints, int nIndex )

Параметры

aWayPoints (WayPointDelaysType) — массив задержек узлов маршрута (waypoints), из которого берётся значение.
nIndex (int) — индекс узла маршрута, для которого возвращается задержка.

Пример

AddTimerEx( 100001, ( GetWayPointDelay( WayPointDelays, way_point_index ) * 1000 ) );

ChangeStopTypeNPC🟢 высокая

изменить тип остановки

Меняет поведение NPC при остановке: nType (0 — стоит и слушает, 1 — активный режим), nTimeout — время в миллисекундах. Метод существа (CNPC), без возврата.

Сигнатура

ChangeStopType( int nType, int nTimeout )

Параметры

nType (int) — тип поведения при остановке: 0 — стоит и слушает, 1 — активный режим.
nTimeout (int) — время действия режима, миллисекунды (в вызовах 30000).

Пример

ChangeStopType(0, 30000);
ChangeStopType(1, 30000);

Пример использования

if (myself.sm.stop_mode == 1) {
    ChangeStopType(0, 30000);
} else {
    ChangeStopType(1, 30000);
}

GetOverhitBonusNPC🟢 высокая

бонус перехита

Возвращает коэффициент «перехита» (overhit) для существа — насколько сильным был последний
удар по нему сверх того, что требовалось для смерти. Это дробное число: 1 означает обычный
добивающий удар без перебора, а больше 1 — что существо добили с запасом (чем крупнее
перебор, тем выше значение). В скриптах его как раз сравнивают с порогами: > 1 — был ли
вообще перехит, >= 1.2 — был ли перехит достаточно сильным, чтобы засчитать бонус или
отметку. Аргумент один — существо, чей перехит проверяют (обычно myself.sm, то есть сам
NPC, которого добили). Возвращает дробное значение (float).

Сигнатура

GetOverhitBonus( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, чей коэффициент перехита проверяют (обычно `myself.sm`).

Пример

if (GetOverhitBonus(myself.sm) > 1)

Пример использования

if (GetOverhitBonus(myself.sm) >= 1.200000) {
    SetMemoStateEx(last_attacker, 458, 2, GetMemoStateEx(last_attacker, 458, 2) + 1);
}

UnequipWeaponNPC🟢 высокая

снять оружие

Снимает основное оружие NPC; применяется при смене тактики боя. Метод существа (CNPC), без аргументов и без возврата.

Сигнатура

UnequipWeapon(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

UnequipWeapon();

Пример использования

if (timer_id == CHANGE_TIMER) {
    UnequipWeapon();
}

SetEnchantOfWeaponNPC🟢 высокая

задать заточку оружия

Устанавливает уровень заточки оружия NPC в значение nEnchantLevel (0, 10, 15 и т.п.). Метод существа (CNPC), без возврата.

Сигнатура

SetEnchantOfWeapon( int nEnchantLevel )

Параметры

nEnchantLevel (int) — уровень заточки оружия NPC (в вызовах 0, 10, 15).

Пример

SetEnchantOfWeapon( 15 );
SetEnchantOfWeapon( 10 );
SetEnchantOfWeapon( 0 );

IsWeaponEquippedInHandNPC🟢 высокая

оружие в руке

Проверяет, экипировано ли у существа target (CSharedCreatureData) оружие в руку; возвращает 1, если есть, 0 — если безоружен. Метод существа (CNPC).

Сигнатура

IsWeaponEquippedInHand( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, у которого проверяется наличие оружия в руке

Пример

if ( creature.is_pc == @TRUE && IsWeaponEquippedInHand( creature ) == 1 ) {

Пример использования

if ( creature.is_pc == @TRUE && IsWeaponEquippedInHand( creature ) == 1 ) {
    if ( Skill_GetConsumeMP( Skill02_ID ) < myself.sm.mp && Skill_GetConsumeHP( Skill02_ID ) < myself.sm.hp && Skill_InReuseDelay( Skill02_ID ) == 0 ) {
        AddUseSkillDesire( creature, Skill02_ID, @ST_ATTACK, @AMT_MOVE_TO_TARGET, 1000000 );
    }
    myself.c_ai0 = creature;
}

SetAbilityItemDropNPC🟢 высокая

управлять выпадением дропа

Управляет флагом выпадения предметов-дропа при убийстве NPC: nFlag @FALSE/0 — без дропа, 1 — дроп включён. Метод существа (CNPC), без возврата.

Сигнатура

SetAbilityItemDrop( int nCanDrop )

Параметры

nCanDrop (int) — флаг дропа предметов при убийстве: `@FALSE`/0 — без дропа, 1 — дроп включён

Пример

SetAbilityItemDrop( 0 );
SetAbilityItemDrop(@FALSE);
SetAbilityItemDrop( 1 );

Пример использования

if (IsInCategory(@beastfarm_beast, last_attacker.class_id) == 1) {
    SetAbilityItemDrop(0);
}

IsStackableItemExNPC🟢 высокая

складируемость предмета

Проверяет, может ли предмет с индексом nItemIndex объединяться в стак; возвращает 1, если складируемый.

Сигнатура

IsStackableItemEx( int nItemIndex )

Параметры

nItemIndex (int) — индекс предмета (обычно из item_index_list.GetItemIndex), складируемость которого проверяется.

Пример

if ( IsStackableItemEx( item_index_list.GetItemIndex( i1 ) ) ) {

Пример использования

if ( IsStackableItemEx( item_index_list.GetItemIndex( i1 ) ) ) {
    AddGetItemDesireEx( item_index_list.GetItemIndex( i1 ), ( 10000 - i1 ) );
}

ChangeUserTalkTargetNPC🟢 высокая

сменить цель диалога

Переносит диалоговый фокус NPC на существо npc (CSharedCreatureData); применяется в скриптах с несколькими NPC для смены говорящего. Без возврата.

Сигнатура

ChangeUserTalkTarget( CSharedCreatureData pCreatureShared )

Параметры

pCreatureShared (CSharedCreatureData) — существо (NPC), на которое переносится диалоговый фокус

Пример

ChangeUserTalkTarget( creature );
ChangeUserTalkTarget( myself.c_ai0 );
ChangeUserTalkTarget(talker);

IsAliveNPC🟢 высокая

проверить, живо ли существо

Проверяет, живо ли существо creature (CCreature); возвращает 1, если живо, 0 — если мертво или в духовном виде. Встроенный метод типа CCreature.

Сигнатура

IsAlive( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — проверяемое существо, живо ли оно

Пример

if ( IsAlive( creature ) == @FALSE || ( creature.is_pc == 0 && IsInCategory( @summon_npc_group, creature.class_id ) == 0 ) ) {

Пример использования

if ( IsAlive( creature ) == @FALSE || ( creature.is_pc == 0 && IsInCategory( @summon_npc_group, creature.class_id ) == 0 ) ) {
    return;
}

HotSpotChangeStateNPC🟢 высокая

изменить состояние горячей точки

Переключает состояние интерактивной зоны (Hotspot) на координатах (nX, nY, nZ): nState 0, 1, 2 — разные состояния (активна, неактивна, невидима и т.п.). Без возврата.

Сигнатура

HotSpotChangeState( int nState, int nX, int nY, int nZ )

Параметры

nState (int) — новое состояние зоны: 0, 1, 2 — активна/неактивна/невидима и т.п.
nX (int) — координата X интерактивной зоны
nY (int) — координата Y интерактивной зоны
nZ (int) — координата Z интерактивной зоны

Пример

HotSpotChangeState(0, 90067, -110007, 1032);

ChangeZoneInfoNPC🟢 высокая

изменить зональный параметр существа

Помечает конкретное существо зональным режимом — ставит или снимает у него признак,
привязанный к особой зоне (в вызовах это @ZONEINFO_FREYA, зона боя с Фреей). Первый аргумент —
кому ставим (в скриптах это игрок из списка агрессии или участник инстанс-зоны), второй — какой
именно зональный признак, третий — значение этого признака (в вызовах 1 или 2). По контексту
применения значения различаются: одно ставят участникам, пока они в зоне, другое (2) — перед
тем как выкинуть существо из зоны телепортом наружу. Значения nArg1 (тип зонального признака,
в вызовах @ZONEINFO_FREYA) и nArg2 передаются клиенту как «зональный эффект», который он и
отрисовывает, — поэтому точная трактовка nArg2 (в вызовах 1/2) остаётся на стороне клиента.
Ничего не возвращает.

Сигнатура

ChangeZoneInfo( CSharedCreatureData cCreature, int nArg1, int nArg2 )

Параметры

cCreature (CSharedCreatureData) — существо, которому меняют зональный признак (в вызовах — игрок в зоне Фреи).
nArg1 (int) — какой зональный признак меняем; в вызовах константа @ZONEINFO_FREYA.
nArg2 (int) — значение признака (в вызовах 1 или 2); по контексту 2 идёт при удалении существа из зоны, 1 — при нахождении в ней.

Пример

ChangeZoneInfo(creature, @ZONEINFO_FREYA, 2);

IsStaticObjectIDNPC🟢 высокая

проверить, статический ли ID

Проверяет, является ли nId идентификатором статического объекта на карте; возвращает 1, если статический. Метод существа (CNPC).

Сигнатура

IsStaticObjectID( int nId )

Параметры

nId (int) — идентификатор, проверяемый на принадлежность статическому объекту.

Пример

if (IsStaticObjectID(i0)) {

Пример использования

if ( IsStaticObjectID( i0 ) ) {
    Say( MakeFString( 1110073, "", "", "", "", "" ) );
    return;
}

GetStaticObjectFromIDNPC🟢 высокая

получить статический объект по ID

Возвращает структуру статического объекта (CSharedStaticObjectData) по идентификатору nId; используется для взаимодействия со статическими меши и декорацией. Метод существа (CNPC).

Сигнатура

GetStaticObjectFromID( int nId )

Параметры

nId (int) — идентификатор статического объекта, структуру которого нужно получить.

Пример

so0 = GetStaticObjectFromID(i0);

Пример использования

so0 = GetStaticObjectFromID( i0 );
if ( StaticObjectDistFromMe( so0 ) >= 2500 ) { SayFStr( 1110074, _blank, _blank, _blank, _blank, _blank ); } else
{
    if ( Skill_InReuseDelay( DDMagic ) ) { SayFStr( 1010551, _blank, _blank, _blank, _blank, _blank );  }
    if ( Skill_GetConsumeMP( DDMagic ) < myself.sm.mp && Skill_GetConsumeHP( DDMagic ) < myself.sm.hp && Skill_InReuseDelay( DDMagic ) == 0 ) {
        AddUseSkillDesireExByAction(i0, DDMagic, 0, reply, ask, 1000000, 0, action_id);
    }
}

SetStaticMeshStatusNPC🟢 высокая

изменить статус меша

Устанавливает параметры статического меша sMeshName на объекте object (CSharedCreatureData): bTargetable 0/1 — можно ли навести прицел, nMeshIndex — индекс меша в списке. Без возврата.

Сигнатура

SetStaticMeshStatus( CSharedCreatureData object, string sMeshName, int bTargetable, int nMeshIndex )

Параметры

object (CSharedCreatureData) — объект, на котором настраивается статический меш.
sMeshName (string) — имя статического меша.
bTargetable (int) — флаг наведения прицела: 0 — нельзя, 1 — можно.
nMeshIndex (int) — индекс меша в списке.

Пример

SetStaticMeshStatus( c0, MeshName, targetable, mesh_index );
SetStaticMeshStatus( myself.c_ai0, MeshName, targetable, 0 );

Пример использования

if ( mesh_index > -1 ) {
    SetStaticMeshStatus( myself.c_ai0, MeshName, targetable, 0 ); 
}

SetWorldTrapVisibleByClassIdNPC🟢 высокая

показать или скрыть ловушку

Управляет видимостью ловушки местности по классу nClassId: nVisibleFlag 0/1 — скрыто/видно; также применяется для смены состояний ловушки. Без возврата.

Сигнатура

SetWorldTrapVisibleByClassId( int nClassId, int nVisibleFlag )

Параметры

nClassId (int) — класс ловушки местности, видимость которой меняется (обычно myself.sm.class_id).
nVisibleFlag (int) — флаг видимости: 0 — скрыта, 1 — видна.

Пример

SetWorldTrapVisibleByClassId(myself.sm.class_id, show_detected);

Пример использования

if (IsDetected == 1) {
    SetWorldTrapVisibleByClassId(myself.sm.class_id, show_detected);
}

DefuseWorldTrapByClassIdNPC🟢 высокая

обезвредить ловушку

Обезвреживает ловушку местности по nTrapId и nClassId; ловушка теряет способность срабатывать. Без возврата.

Сигнатура

DefuseWorldTrapByClassId( int nTrapId, int nClassId )

Параметры

nTrapId (int) — идентификатор ловушки, которую нужно обезвредить (обычно myself.sm.id).
nClassId (int) — класс ловушки местности (обычно myself.sm.class_id).

Пример

DefuseWorldTrapByClassId(myself.sm.id, myself.sm.class_id);

Пример использования

if ( skill_name_id == trap_skill ) {
    DefuseWorldTrapByClassId( myself.sm.id, myself.sm.class_id );
}

ActivateWorldTrapByClassIdNPC🟢 высокая

активировать ловушку

Активирует ловушку местности по nTrapId и nClassId; ловушка готова срабатывать при попадании в триггер. Без возврата.

Сигнатура

ActivateWorldTrapByClassId( int nTrapId, int nClassId )

Параметры

nTrapId (int) — идентификатор ловушки, которую нужно активировать (обычно myself.sm.id).
nClassId (int) — класс ловушки местности (обычно myself.sm.class_id).

Пример

ActivateWorldTrapByClassId(myself.sm.id, myself.sm.class_id);

Пример использования

if ( script_event_arg1 == 12550 ) {
    ActivateWorldTrapByClassId( myself.sm.id, myself.sm.class_id );
}

RegisterAsAirportManagerNPC🟢 высокая

зарегистрировать менеджера аэропорта

Регистрирует NPC как менеджера аэропорта: nAirportId, nPlatformId, nAirportType (0 — обычный, 1 — премиум и т.п.); возвращает код результата (int).

Сигнатура

RegisterAsAirportManager( int nAirportId, int nPlatformId, int nAirportType )

Параметры

nAirportId (int) — идентификатор аэропорта.
nPlatformId (int) — идентификатор платформы.
nAirportType (int) — тип аэропорта (0 — обычный, 1 — премиум и т.п.; в вызовах 1).

Пример

myself.i_ai1 = RegisterAsAirportManager(airport_ID, platform_ID, 1);

GetOnAirShipNPC🟢 высокая

посадить на воздушный корабль

Размещает игрока talker (CSharedCreatureData) на платформу воздушного корабля (проверяет наличие места и билета). Без возврата.

Сигнатура

GetOnAirShip( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, размещаемый на платформу воздушного корабля

Пример

GetOnAirShip(talker);

Пример использования

if (talker.yongma_type == 0) {
    GetOnAirShip(talker);
} else {
    ShowSystemMessage(talker, 2258);
}

BuyAirShipNPC🟢 высокая

купить билет на корабль

Продаёт игроку talker (CSharedCreatureData) билет на корабль nShipId (списывает адену, выдаёт билет в инвентарь). Без возврата.

Сигнатура

BuyAirShip( CSharedCreatureData c, int nShipId )

Параметры

c (CSharedCreatureData) — игрок-покупатель билета на корабль.
nShipId (int) — идентификатор корабля, билет на который продаётся (в вызовах 2).

Пример

BuyAirShip(talker, 2);

Пример использования

if (OwnItemCount( talker, AirshipConfirm ) > 0) {
    BuyAirShip(talker, 2);
} else {
    ShowSystemMessageStr(talker, MakeFString(1800277, "", "", "", "", ""));
}

SummonAirShipNPC🟢 высокая

вызвать корабль на платформу

Вызывает воздушный корабль на платформу аэропорта для игрока talker (CSharedCreatureData).
Порядок аргументов — по реальным вызовам (SummonAirShip(talker, airport_ID, platform_ID)):
сначала id аэропорта, затем id платформы. Без возврата.

Сигнатура

SummonAirShip( CSharedCreatureData c, int nAirportId, int nPlatformId )

Параметры

c (CSharedCreatureData) — игрок, для которого вызывается воздушный корабль.
nAirportId (int) — идентификатор аэропорта (в вызовах airport_ID).
nPlatformId (int) — идентификатор платформы вызова (в вызовах platform_ID).

Пример

SummonAirShip(talker, airport_ID, platform_ID);
SummonAirShip( talker, AIRPORT_ID, PLATFORM_ID );

Пример использования

if (OwnItemCount( talker, EnergyStone ) >= 5) {
    SummonAirShip(talker, airport_ID, platform_ID);
} else {
    ShowSystemMessageStr(talker, MakeFString(1800250, "", "", "", "", ""));
}

IsOccupiedPlatformNPC🟢 высокая

проверить, занята ли платформа

Проверяет, занята ли платформа nPlatformId игроком или кораблём; возвращает 1, если занята.

Сигнатура

IsOccupiedPlatform( int nPlatformId )

Параметры

nPlatformId (int) — идентификатор платформы, занятость которой проверяется (в вызовах myself.i_ai1).

Пример

if (IsOccupiedPlatform(myself.i_ai1) == @FALSE)

RegisterTeleporterTypeNPC🟢 высокая

зарегистрировать тип телепортера

Регистрирует тип телепортера nType со стоимостью nCost; используется для разных групп пунктов назначения (RaidBoss, Dungeon и т.п.). Метод существа (CNPC), без возврата.

Сигнатура

RegisterTeleporterType( int nType, int nCost )

Параметры

nType (int) — тип телепортера / группа пунктов назначения (в вызовах 1, 3).
nCost (int) — стоимость телепортации (в вызовах 0, 40).

Пример

RegisterTeleporterType(1, 0);

Пример использования

if ( UseFreeTeleportBfr40lv == 1 ) {
    RegisterTeleporterType( 3, 40 );
}

ShowTelPosListPageNPC🟢 высокая

показать список телепортов

Показывает игроку talker (CSharedCreatureData) список доступных пунктов назначения posList (TelPosList) — обычно специальные списки вроде RaidBossList20_29. Метод существа (CNPC), без возврата.

Сигнатура

ShowTelPosListPage( CSharedCreatureData c, CTelPosList posList )

Параметры

c (CSharedCreatureData) — игрок, которому показывается список пунктов назначения.
posList (CTelPosList) — список пунктов назначения для отображения (напр. RaidBossList20_29).

Пример

ShowTelPosListPage( talker, RaidBossList20_29 );

SendPostNPC🟢 высокая

отправить письмо с предметами

Отправляет письмо игроку nUserId с темой sTitle и текстом sMsg (обычно через MakeFString), суммой адены nTradeMoney и до 9 предметов (пары ID и количества); письмо приходит в почтовый ящик. Метод существа (CNPC), без возврата.

Сигнатура

SendPost( int nUserDbId, string sTitle, string sMsg, int nTradeMoney, int nItemId1, int nItemAmount1, int nItemId2, int nItemAmount2, int nItemId3, int nItemAmount3, int nItemId4, int nItemAmount4, int nItemId5, int nItemAmount5, int nItemId6, int nItemAmount6, int nItemId7, int nItemAmount7, int nItemId8, int nItemAmount8, int nItemId9, int nItemAmount9 )

Параметры

nUserDbId (int) — идентификатор игрока-получателя письма в базе
sTitle (string) — тема письма
sMsg (string) — текст письма (обычно через `MakeFString`)
nTradeMoney (int) — сумма прилагаемой адены
nItemId1 (int) — идентификатор 1-го вложенного предмета
nItemAmount1 (int) — количество 1-го вложенного предмета
nItemId2 (int) — идентификатор 2-го вложенного предмета
nItemAmount2 (int) — количество 2-го вложенного предмета
nItemId3 (int) — идентификатор 3-го вложенного предмета
nItemAmount3 (int) — количество 3-го вложенного предмета
nItemId4 (int) — идентификатор 4-го вложенного предмета
nItemAmount4 (int) — количество 4-го вложенного предмета
nItemId5 (int) — идентификатор 5-го вложенного предмета
nItemAmount5 (int) — количество 5-го вложенного предмета
nItemId6 (int) — идентификатор 6-го вложенного предмета
nItemAmount6 (int) — количество 6-го вложенного предмета
nItemId7 (int) — идентификатор 7-го вложенного предмета
nItemAmount7 (int) — количество 7-го вложенного предмета
nItemId8 (int) — идентификатор 8-го вложенного предмета
nItemAmount8 (int) — количество 8-го вложенного предмета
nItemId9 (int) — идентификатор 9-го вложенного предмета
nItemAmount9 (int) — количество 9-го вложенного предмета

Пример

case @kamaloka_29_d_boss: { SendPost(target.dbid, MakeFString(3681150, _blank, _blank, _blank, _blank, _blank), MakeFString(3681151, MakeFString(3681162, _blank, _blank, _blank, _blank, _blank), _blank, _blank, _blank, _blank), 0, inst_reward_bow_29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); break; }

ShowSysMsgToParty2NPC🟢 высокая

системное сообщение группе

Показывает системное сообщение nSysMsgId всем членам группы party (CSharedPartyData) с подстановкой параметров; nParamCount — число параметров, далее nParam1..4 и nValue. Метод существа (CNPC), без возврата.

Сигнатура

ShowSysMsgToParty2( CSharedPartyData party, int nSysMsgId, int nParamCount, int nParam1, int nParam2, int nParam3, int nParam4 )

Параметры

party (CSharedPartyData) — группа, всем членам которой показывается сообщение.
nSysMsgId (int) — идентификатор системного сообщения.
nParamCount (int) — число передаваемых параметров подстановки.
nParam1 (int) — параметр подстановки 1.
nParam2 (int) — параметр подстановки 2.
nParam3 (int) — параметр подстановки 3.
nParam4 (int) — параметр подстановки 4 / значение.

Пример

ShowSysMsgToParty2(party0, 2, 1381, 3, 5901, 1, i1);

ShowVariationMakeWindowNPC🟢 высокая

окно создания вариации

Открывает игроку talker (CSharedCreatureData) интерфейс создания вариации (аугментации) предмета. Метод существа (CNPC), без возврата.

Сигнатура

ShowVariationMakeWindow( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, которому открывается окно создания вариации (аугментации)

Пример

ShowVariationMakeWindow(talker);

Пример использования

if (reply == 100) {
    ShowVariationMakeWindow(talker);
} else
if (reply == 200) {
    ShowVariationCancelWindow(talker);
}

ShowVariationCancelWindowNPC🟢 высокая

окно отмены вариации

Открывает игроку talker (CSharedCreatureData) интерфейс удаления вариации с предмета. Метод существа (CNPC), без возврата.

Сигнатура

ShowVariationCancelWindow( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, которому открывается окно удаления вариации

Пример

ShowVariationCancelWindow(talker);

Пример использования

if (reply == 200) {
    ShowVariationCancelWindow(talker);
}

ShowBaseAttributeCancelWindowNPC🟢 высокая

окно отмены базового атрибута

Открывает игроку talker (CSharedCreatureData) интерфейс удаления базового атрибута предмета. Без возврата.

Сигнатура

ShowBaseAttributeCancelWindow( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, которому открывается окно удаления базового атрибута

Пример

ShowBaseAttributeCancelWindow(talker);

Пример использования

if (reply == 611) {
    ShowBaseAttributeCancelWindow(talker);
}

СОЗДАНИЕ NPC (NPC-create)

12 функций

CreatePrivatesNPC🟢 высокая

призыв целой группы подчинённых

Спавнит целую группу подчинённых по имени набора sGroupName, заранее прописанного
в данных NPC. Принимает один аргумент — строку с именем набора (часто переменная
Privates), без namespace. Ничего не возвращает. Самый частый способ призвать
свиту или волну минионов одним вызовом.

Сигнатура

CreatePrivates( string sGroupName )

Параметры

sGroupName (string) — имя набора подчинённых из данных NPC (часто переменная Privates).

Пример

CreatePrivates(Privates);

Пример использования

if ( myself.sm.param1 == 4 ) {
    CreatePrivates( Privates1 );
}

CreateOnePrivateNPC🟢 высокая

создать одного подчинённого рядом с создателем

Создаёт одного подчинённого NPC заданного класса рядом с создателем, без явных
координат. Принимает класс NPC nNpcClassId из [npc_pch], имя/тип AI sName,
а также nWeightPoint (точка/вес спавна) и nRespawnTime (период авто-респавна) —
последние два, в отличие от Ex-версии, НЕ пользовательские param-слоты, что видно
по именованным вызовам с полями weight_point и respawn_time. Ничего не возвращает.
Связанное событие: у созданного NPC срабатывает CREATED(reply) (см. NASC_HANDLERS).

Сигнатура

CreateOnePrivate( int nNpcClassId, string sName, int nWeightPoint, int nRespawnTime )

Параметры

nNpcClassId (int) — класс создаваемого NPC.
    значения — из словаря [npc_pch]
sName (string) — имя/тип AI создаваемого NPC.
nWeightPoint (int) — точка/вес спавна (private.weight_point; часто 0).
nRespawnTime (int) — период авто-респавна, сек (private.respawn_time, 300, 280+Rand(40); 0=без респавна).

Пример

CreateOnePrivate( @grima, "grima", 0, 1 );

Пример использования

if ( private != myself.sm && private.respawn_time != 0 ) {
    CreateOnePrivate( private.npc_class_id, private.ai, private.weight_point, private.respawn_time );
}

CreateOneAnotherNPC🟢 высокая

создать одного независимого NPC по координатам

Создаёт одного независимого NPC заданного класса в точных координатах x, y, z
(не подчинён создателю). Принимает класс NPC nNpcClassId из [npc_pch], имя/тип AI
sName и три целочисленные координаты. Ничего не возвращает. Используется, когда
нужно поставить моба или объект в конкретном месте мира.

Сигнатура

CreateOneAnother( int npc_class_id, string npc_name, int x, int y, int z )

Параметры

npc_class_id (int) — класс создаваемого NPC.
    значения — из словаря [npc_pch]
npc_name (string) — имя/тип AI.
x (int) — координата X.
y (int) — координата Y.
z (int) — координата Z.

Пример

CreateOneAnother(@ow_kegor, "ow_kegor", 114650, -114522, -11205);

Пример использования

if ( Rand( 1200 ) < 1 ) {
    CreateOneAnother( @sia_champion_group, "sia_champion_group", pos0.x, pos0.y, pos0.z );
}

CreateOnePrivateNearUserNPC🟢 высокая

подчинённый рядом с указанным игроком

Создаёт подчинённого NPC (private) рядом с указанным игроком, а не рядом с самим создателем.
Точку появления NPC подбирает не жёстко: он берёт место игрока за центр и отходит от него на
случайное расстояние в пределах заданного радиуса, в случайную сторону. Полученную точку он
проверяет на проходимость (нельзя посадить NPC в стену или под землю) и при неудаче пробует
другую; готового NPC разворачивает лицом к игроку. Поэтому два одинаковых вызова дадут
подчинённых в разных местах вокруг игрока — это удобно для событийных спавнов «возле игрока»
(подарки, помощники, ловушки), когда точные координаты не важны, важна близость к человеку.

Первый аргумент — игрок-центр. Второй — какого NPC создать (код из [npc_pch]). Третий —
имя/тип поведения (AI) новорождённого. Четвёртый — «вес» подчинённого: чем он больше, тем
активнее приватник тянет на себя врагов и весомее в расчётах приоритета цели (обычно передают
вес самого создателя, myself.sm.weight_point). Последние три числа управляют размещением
вокруг игрока; в живом вызове это 1, 90, 60, и одно из них задаёт радиус случайного разброса
от игрока в единицах мира. Ничего не возвращает.
Связанное событие: у созданного NPC срабатывает CREATED (см. NASC_HANDLERS).

Сигнатура

CreateOnePrivateNearUser( CSharedCreatureData cUser, int nNpcClassId, string sName, int nWeightPoint, int nParam4, int nParam5, int nParam6 )

Параметры

cUser (CSharedCreatureData) — игрок, вокруг которого появится подчинённый (его место — центр разброса).
nNpcClassId (int) — какого NPC создать; код из словаря [npc_pch].
sName (string) — имя/тип поведения (AI) создаваемого NPC.
nWeightPoint (int) — «вес» подчинённого в расчётах агрессии/приоритета цели; обычно `myself.sm.weight_point`.
nParam4 (int) — параметр размещения (в вызове 1).
nParam5 (int) — параметр размещения (в вызове 90); задаёт радиус случайного разброса вокруг игрока в единицах мира.
nParam6 (int) — параметр размещения (в вызове 60).

Пример

CreateOnePrivateNearUser( talker, @br_santa_white_gift, "br_santa_white_gift", myself.sm.weight_point, 1, 90, 60 );

Пример использования

if ( IsNullCreature( talker ) == 0 ) {
    CreateOnePrivateNearUser( talker, @br_santa_white_gift, "br_santa_white_gift", myself.sm.weight_point, 1, 90, 60 );
}

CreateOnePrivateExNPC🟢 высокая

полный спавн подчинённого с координатами, поворотом и параметрами

Полный спавн одного подчинённого: класс NPC nNpcClassId из [npc_pch], тип AI
sAiType, точка спавна nWeightPoint, задержка nDelaySec, точные координаты x, y, z,
поворот nHeading (клиентские единицы, нередко как произведение угла на 182) и три
пользовательских параметра nUser1..nUser3. Возвращает результат (индекс/идентификатор
создаваемого существа). Расшифровка двух средних чисел — по декомпилю L2NPC
(CNPC::CreateOnePrivateEx_4B7D90): движок ставит AddTimer(obj, 1000*nDelaySec, 0),
т.е. 4-й аргумент — задержка спавна в секундах; 3-й аргумент кладётся в поле точки
спавна (в вызовах встречается буквально private.weight_point, как у CreateOnePrivate).
Последние три числа — произвольные пользовательские слоты: движок кладёт их в созданное
существо, и оно читает их как myself.sm.param1/param2/param3, а другие скрипты — как
param1/param2/param3 этого существа; туда складывают индекс владельца или цели, dbid,
тег, координаты — смысл задаёт сам скрипт.
Связанное событие: у созданного NPC срабатывает CREATED(reply) (см. NASC_HANDLERS).

Сигнатура

CreateOnePrivateEx( int nNpcClassId, string sAiType, int nWeightPoint, int nDelaySec, int x, int y, int z, int nHeading, int nUser1, int nUser2, int nUser3 )

Параметры

nNpcClassId (int) — класс NPC.
    значения — из словаря [npc_pch]
sAiType (string) — имя AI-типа (напр. myself.sm.ai, "HelpHeroAI").
nWeightPoint (int) — точка/вес спавна (в вызовах 0, 10, private.weight_point).
nDelaySec (int) — задержка спавна в секундах (движок: AddTimer(1000*nDelaySec);
    0 = немедленно; встречаются 5, Rand(5), 20, 30+Rand(60)).
x (int) — координата X (FloatToInt(...)).
y (int) — координата Y.
z (int) — координата Z.
nHeading (int) — поворот (клиентские единицы; i0*182, 32768=180°, полный круг 65536).
nUser1 (int) — пользовательские данные → созданный.param1.
nUser2 (int) — пользовательские данные → созданный.param2.
nUser3 (int) — пользовательские данные → созданный.param3.

Пример

CreateOnePrivateEx( @mikhail, "mikhail", 10, 5, 178304, -17712, -2194, 32768, 0, 0, 0 );

Пример использования

if ( HavePet == 1 ) {
    CreateOnePrivateEx( silhouette, ai_type, 0, 0, FloatToInt( ( myself.sm.x + 10 ) ), FloatToInt( ( myself.sm.y + 10 ) ), FloatToInt( myself.sm.z ), 0, 0, 0, 0 );
}

CreateOnePrivateInzoneExNPC🟢 высокая

спавн подчинённого внутри инстанс-зоны

Делает то же, что CreateOnePrivateEx, но спавн происходит внутри инстанс-зоны:
добавлен последний, двенадцатый аргумент nZoneId — id зоны/инстанса. По декомпилю
L2NPC (CNPC::CreateOnePrivateInzoneEx_4B7BE4) раскладка аргументов совпадает с Ex:
тот же AddTimer(obj, 1000*nDelaySec, 0) (4-й аргумент — задержка в секундах), 3-й —
точка спавна; три числа перед зоной — пользовательские слоты nUser1..nUser3 (кладутся
в созданное существо как param1/param2/param3). Возвращает индекс создаваемого существа.
Связанное событие: у созданного NPC срабатывает CREATED(reply) (см. NASC_HANDLERS).

Сигнатура

CreateOnePrivateInzoneEx( int nNpcClassId, string sAiType, int nWeightPoint, int nDelaySec, int x, int y, int z, int nHeading, int nUser1, int nUser2, int nUser3, int nZoneId )

Параметры

nNpcClassId (int) — класс создаваемого NPC.
    значения — из словаря [npc_pch]
sAiType (string) — имя AI-типа создаваемого NPC.
nWeightPoint (int) — точка/вес спавна (в вызовах обычно 0).
nDelaySec (int) — задержка спавна в секундах (движок: AddTimer(1000*nDelaySec); 0 = немедленно).
x (int) — координата X точки спавна.
y (int) — координата Y точки спавна.
z (int) — координата Z точки спавна.
nHeading (int) — поворот (клиентские единицы; 32768=180°, полный круг 65536).
nUser1 (int) — пользовательские данные → созданный.param1.
nUser2 (int) — пользовательские данные → созданный.param2.
nUser3 (int) — пользовательские данные → созданный.param3.
nZoneId (int) — id зоны/инстанса спавна (обычно InstantZone_GetId()).

Пример

CreateOnePrivateInzoneEx(i1, "warriors_of_rest", 0, 0, 55672, -252728, -6760, 0, 0, 2, 0, InstantZone_GetId());

Пример использования

if ( timer_id == 1001 ) {
    CreateOnePrivateInzoneEx( @portrait_spirit_winged, "ai_boss08_portrait_spirit_winged", 0, 0, SpawnPosX, SpawnPosY, SpawnPosZ, SpawnAngle, 0, 0, 0, InstantZone_GetId( ) );
}

CreatePetNPC🟢 высокая

создать питомца для игрока из предмета-призыва

Создаёт питомца для владельца cOwner из предмета-призыва nItemClassId (свисток или
окарина) с обликом/классом NPC nNpcClassId и заданным уровнем. Четвёртый аргумент —
уровень питомца: в реальных вызовах это talker.level либо числа 1, 15, 24, 25, 26,
55, совпадающие с уровнем детёныша. Ничего не возвращает. Используется NPC-питомниководами
при «активации» детёныша из купленного тикета.

Сигнатура

CreatePet( CSharedCreatureData cOwner, int nItemClassId, int nNpcClassId, int nLevel )

Параметры

cOwner (CSharedCreatureData) — будущий хозяин питомца.
nItemClassId (int) — предмет-призыв питомца.
    значения — из словаря [item_pch]
nNpcClassId (int) — класс/облик питомца.
    значения — из словаря [npc_pch]
nLevel (int) — уровень создаваемого питомца (в вызовах talker.level или 1/15/24/25/26/55).

Пример

CreatePet( talker, @wolf_collar, @pet_wolf_a, 15 );

Пример использования

if ( i0 < 75 ) {
    CreatePet( talker, @dragonflute_of_star, @hatchling_of_star, 35 );
} else {
    CreatePet( talker, @dragonflute_of_twilight, @hatchling_of_twilight, 35 );
}

CreateSubPledgeNPC🟢 высокая

создать суб-подразделение клана

Создаёт суб-подразделение (royal guard / knight) для клана игрока. Клан берётся у переданного
существа. Операция асинхронная: L2NPC собирает atomic-job, сервер (AtomicCreateSubPledge::Do →
CDB::RequestCreateSubPledgeByNpc) вызывает создание суб-юнита в БД. По сигнатуре серверной
функции третий её параметр имеет тип enum PledgeType — это и есть nType. Сразу возвращает ноль;
фактический результат приходит отдельным событием. Если у существа нет клана, задача не создаётся.

Сигнатура

CreateSubPledge( CSharedCreatureData c, int nType, int nParam, string sName )

Параметры

c (CSharedCreatureData) — существо, для клана которого создаётся суб-подразделение.
nType (int) — тип суб-подразделения (enum PledgeType, подтверждено сигнатурой серверной функции):
    100 royal guard 1, 200 royal guard 2, 1001/1002 knight 1/2, 2001/2002 knight 3/4.
nParam (int) — доп. параметр создания, передаётся в БД-запрос создания суб-юнита (пакет БД opcode 247).
sName (string) — название суб-подразделения (до 24 символов).

Пример

CreateSubPledge(talker, i0, i1, s0);

CreateSubJobNPC🟢 высокая

создать суб-класс (вторую профессию)

Заводит игроку суб-класс — вторую профессию, на которую он сможет переключаться. Первый
аргумент — сам игрок, второй — какую профессию открыть (её class_id). Результат приходит не
сразу: в ответ на добавление суб-класса игроку прилетает событие SUBJOB_CREATED, в котором и
проверяют, удалось ли (например, не превышен ли лимит суб-классов, подходит ли класс). В
условиях перед вызовом обычно смотрят текущую профессию игрока и уже имеющиеся суб-классы,
чтобы не открыть запрещённую или дублирующую комбинацию.

Сигнатура

CreateSubJob( CSharedCreatureData c, int nClassId )

Параметры

c (CSharedCreatureData) — существо, которому создаётся суб-класс (вторая профессия).
nClassId (int) — id класса создаваемой профессии (occupation из [class_pch];
    в вызовах @berserker и числа 2, 12, 13, 14, 16, 17, 20, 21, 23, 24 — это class_id профессии).

Пример

CreateSubJob( talker, @berserker );

Пример использования

    if ( i0 != 12 && i0 != 94 && i2 != 12 && i2 != 94 && i4 != 12 && i4 != 94 && i6 == -1 && ( IsInCategory( @third_class_group, i0 ) || IsInCategory( @fourth_class_group, i0 ) ) ) {
        CreateSubJob( talker, 12 );
    }

Связанное событие: ответ сервера приходит событием SUBJOB_CREATED (см. NASC_HANDLERS).

CreateAcademyNPC🟢 высокая

создать клановую академию

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

Сигнатура

CreateAcademy( CSharedCreatureData c, string sName )

Параметры

c (CSharedCreatureData) — существо, для клана которого создаётся академия.
sName (string) — название академии (до 24 символов).

Пример

CreateAcademy(talker, s0);

CreatePVPMatchNPC🟢 высокая

инициировать PvP-матч

Создаёт/запускает PvP-матч в слоте с заданным номером. Номер должен быть от 0 до 8
(иначе движок пишет ошибку в лог и ничего не делает). Отправляет серверу команду
на создание матча этого слота. Ничего не возвращает.

Сигнатура

CreatePVPMatch( int nMatchSlot )

Параметры

nMatchSlot (int) — индекс слота матча, 0..8 (иначе движок пишет ошибку и ничего не делает).

Пример

CreatePVPMatch( i0 );
CreatePVPMatch(nType);

CreateBingoBoardNPC🟢 высокая

создать игровое поле бинго

Создаёт игроку квадратное поле бинго (мини-игра) со стороной nBoardSize. По декомпилю
L2NPC (User::CreateBingoBoard_5B4CEC) второй аргумент — длина стороны поля: движок строит
nBoardSize×nBoardSize клеток и отвергает ЧЁТНЫЕ значения (сторона обязана быть нечётной);
в вызовах передают 3 → поле 3×3 (9 клеток). Если игрок не найден или сторона чётная —
возвращает ноль.

Сигнатура

CreateBingoBoard( CSharedCreatureData c, int nBoardSize )

Параметры

c (CSharedCreatureData) — игрок, которому создаётся поле бинго.
nBoardSize (int) — длина стороны квадратного поля (нечётная; поле nBoardSize²);
    в вызовах 3 (поле 3×3). Чётные значения движок отвергает.

Пример

CreateBingoBoard(talker, 3);

ПОИСК И ПОЛУЧЕНИЕ СУЩЕСТВ (Target-finding)

75 функций

GetCreatureFromIndexGLOBAL🟢 высокая

существо по сессионному индексу

Возвращает существо по его сессионному индексу nIndex — временному слоту существа в памяти сервера, который действует, пока существо «живо» в мире. Аргумент один: nIndex (int, без namespace; −1 = нет). Принадлежит gg; если индекс невалиден, возвращается «пустое» существо, поэтому результат проверяют через IsNullCreature либо предварительно сверяют сам индекс с −1.

Сигнатура

GetCreatureFromIndex( int nIndex )

Параметры

nIndex (int) — сессионный индекс существа (−1 = нет).

Пример

c0 = GetCreatureFromIndex( i0 );

Пример использования

c1 = GetCreatureFromIndex( i1 );
if ( IsNullCreature( c1 ) == 0 ) { SendScriptEvent( c1, GetIndexFromCreature( myself.sm ), 0 ); }

GetCreatureFromIDGLOBAL🟢 высокая

существо по постоянному ID

Возвращает существо по его постоянному ID объекта nID — тому же, что лежит в поле существа id. Аргумент один: nID (int, без namespace). Принадлежит gg; ID надёжнее индекса и удобен для хранения в списках и «комнатах» инстансов, а при промахе функция отдаёт «пустое» существо (проверять IsNullCreature).

Сигнатура

GetCreatureFromID( int nID )

Параметры

nID (int) — постоянный ID существа (creature.id).

Пример

c0 = GetCreatureFromID(GetGlobalMap(@gm_cartia_adolf));

Пример использования

c0 = GetCreatureFromID( room0.GetMemberID( i0 ) );
if ( HaveMemo( c0, @in_the_dimension_rift ) ) {
    SetMemoStateEx( c0, @in_the_dimension_rift, 1, -1 );
}

GetCreatureExFromIndexGLOBAL🟢 высокая

расширенные данные существа по индексу

По числовому индексу существа возвращает его «расширенный» объект (CSharedCreatureDataEx) —
надстройку над обычным объектом существа с дополнительными полями, которых нет в базовом.
Полезна, когда на руках только индекс, а нужен доступ к расширенным характеристикам. Парная
к GetCreatureEx, которая делает то же самое, но исходит из уже готового базового объекта, а
не из индекса. При неверном индексе возвращает пустой результат.

Сигнатура

GetCreatureExFromIndex( int nSMIndex )

Параметры

    nSMIndex (int) — числовой индекс существа, по которому берут его расширенный объект.

Пример (иллюстративный):

    GetCreatureExFromIndex( nSMIndex );

GetCreatureExGLOBAL🟢 высокая

расширенные данные по готовому объекту

По уже имеющемуся обычному объекту существа возвращает его «расширенный» объект
(CSharedCreatureDataEx) — надстройку с дополнительными полями поверх базового. То же, что
GetCreatureExFromIndex, только отправная точка — не числовой индекс, а сам объект существа
(например talker). При пустом объекте возвращает пустой результат.

Сигнатура

GetCreatureEx( CSharedCreatureData c )

Параметры

    c (CSharedCreatureData) — обычный объект существа, по которому берут его расширенный объект.

Пример (иллюстративный):

    GetCreatureEx( talker );

Spawn2MAKER🟢 высокая

заспавнить особей с авто-респавном

Создаёт заданное число особей данного дефайна. Аргументы: nCount (int) — сколько заспавнить; nRespawnTime (int) — период авто-респавна (ноль выключает); nRespawnRand (int) — случайный разброс к периоду. Если время респавна ноль, авто-возрождения нет, иначе после смерти особь возродится через указанное время с разбросом. Вызывается на дефайне ([CNpcSpawnDefineEx]).
Связанное событие: у мейкера — ON_NPC_CREATED/ON_NPC_DELETED; у нового NPC — CREATED (см. NASC_HANDLERS).

Сигнатура

Spawn2( int nCount, int nRespawnTime, int nRespawnRand )

Параметры

nCount       (int) — сколько особей заспавнить.
nRespawnTime (int) — период авто-респавна (ноль выключает авто-возрождение).
nRespawnRand (int) — случайный разброс, добавляемый к периоду респавна.

Пример

def0.Spawn2(i2, 0, 0);

SpawnExMAKER🟢 высокая

заспавнить в явной позиции с восстановлением состояния

Спавнит особей в явной позиции и восстанавливает их состояние из записи базы; применяется при загрузке мира. Аргументы: nCount (int) — сколько заспавнить; nMode (int) — режим; x, y, z (int) — координаты; nHeading (int) — направление (65536 = 360°); nHp, nMp (int) — жизнь и мана; nDbValue (int) — сохранённое значение. Вызывается на дефайне ([CNpcSpawnDefineEx]).

Сигнатура

SpawnEx( int nCount, int nMode, int nX, int nY, int nZ, int nHeading, int nHp, int nMp, int nDbValue )

Параметры

nCount   (int) — сколько особей заспавнить
nMode    (int) — режим спавна
nX       (int) — координата X точки спавна
nY       (int) — координата Y точки спавна
nZ       (int) — координата Z точки спавна
nHeading (int) — направление (65536 = 360°)
nHp      (int) — текущее значение здоровья (HP) особи
nMp      (int) — текущее значение маны (MP) особи
nDbValue (int) — сохранённое в базе значение, восстанавливаемое для особи

Пример

loaded_def.SpawnEx(1, 0, record0.x, record0.y, record0.z, 0, record0.hp, record0.mp, record0.db_value);

SpawnMAKER🟢 высокая

заспавнить особей (упрощённый)

Создаёт заданное число особей данного дефайна. Аргументы: nCount (int) — сколько заспавнить; nRespawnTime (int) — период респавна. Вызывается на дефайне ([CNpcSpawnDefineEx]). Явных вызовов в собранных скриптах не выявлено.

Сигнатура

Spawn( int nCount, int nRespawnTime )

Параметры

nCount       (int) — сколько особей заспавнить
nRespawnTime (int) — период респавна

Пример

def0.Spawn(1, 0);

GetNpcMakerGLOBAL🟢 высокая

найти мейкер по имени

Обычный NPC так дотягивается до мейкера, находя его по имени. Аргумент sName (string) — имя мейкера; вызывается на глобальном объекте gg. Результат проверяют на пустоту через IsNull. Возвращает объект [CNpcMakerEx].

Сигнатура

GetNpcMaker( string pwsName )

Параметры

pwsName (string) — имя мейкера, по которому его ищут

Пример

maker0 = GetNpcMaker( s0 );

Пример использования

maker0 = GetNpcMaker( evilate_maker1 );
if ( IsNull( maker0 ) == 0 ) { SendMakerScriptEvent( maker0, 1000, 0, 0 ); }

GetMyMakerNPC🟢 высокая

вернуть собственный мейкер NPC

Возвращает мейкер, который породил этого NPC, — прямую ссылку на своего создателя.
Аргументов нет, вызывается на myself. В отличие от GetNpcMaker (ищет мейкер по имени),
здесь имя знать не нужно: NPC получает именно свой спавнер. Удобно, чтобы отчитаться
создателю (счётчики волн, эстафета спавна). Если у NPC нет привязанного мейкера, вернёт
пусто — результат проверяют через IsNull.

Сигнатура

GetMyMaker(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

maker0 = myself.GetMyMaker();
if ( IsNull( maker0 ) == 0 ) { SendMakerScriptEvent( maker0, 1001, 0, 0 ); }

IsTournamentEnableGLOBAL🟢 высокая

включён ли турнир

Отвечает, идёт ли сейчас турнир вообще: возвращает @TRUE, если турнир открыт (можно
регистрироваться, показывать расписание, пускать наблюдателей), и @FALSE, если он
закрыт. Этой проверкой скрипт-ворота решают, стоит ли вообще открывать турнирное меню
и предлагать регистрацию: пока функция даёт @FALSE, все турнирные действия надо гасить.
Без аргументов, только чтение.

Сигнатура

IsTournamentEnable(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if (IsTournamentEnable() == @TRUE)

IsTournamentGroupStageGLOBAL🟢 высокая

идёт ли групповая стадия турнира

Различает две фазы турнира: возвращает @TRUE во время группового этапа и @FALSE, когда
идут финалы (плей-офф). От ответа зависит, как регистрировать игрока: на групповом этапе
регистрация автоматическая на текущий матч группы, а в финалах игрок должен ввести код
своего матча (см. AddTournament — там второй аргумент выбирается именно по этой проверке).
Без аргументов, только чтение.

Сигнатура

IsTournamentGroupStage(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if (IsTournamentGroupStage() == @TRUE)

IsInCategoryNPC🟢 высокая

проверка принадлежности к категории

Проверяет, входит ли значение nValue (обычно класс или профессия существа) в категорию nCategory из словаря [category_pch]. Аргументы: nCategory (int, namespace [category_pch]) и nValue (int, без namespace); принадлежит myself, возвращает 1 (входит) или 0. Главные применения — отличать «своих» суммонов, петов и сервиторов от живых игроков и сортировать цели по роли (боец, лекарь).

Сигнатура

IsInCategory( int nCategory, int nValue )

Параметры

nCategory (int) — какая категория проверяется.
    значения — из словаря [category_pch]
nValue (int) — проверяемое значение (обычно .class_id / .occupation существа).

Пример

if ( IsInCategory( @second_class_group, talker.occupation ) ) {

Пример использования

if ( IsInCategory( @summon_npc_group, target.class_id ) != 0 ) {
    AddAttackDesire( target.master, @AMT_MOVE_TO_TARGET, 500 );
}

FindRandomUserNPC🟢 высокая

асинхронный выбор случайного игрока

Асинхронно просит движок выбрать случайного игрока в зоне по фильтрам и сама ничего не возвращает (тип void). Четыре аргумента (без namespace) — фильтры отбора: nInCombat (только в бою), nNotInPeaceZone (не в мирной зоне), nNotInOlympiad (не на Олимпиаде), nInParty (только в группе); принадлежит myself. Выбранный игрок приходит позже в обработчик события FIND_RANDOM_USER, где он лежит в параметре talker — типовой приём «запрос теперь, ответ в обработчике».
Связанное событие: найденный игрок приходит событием FIND_RANDOM_USER(talker) (см. NASC_HANDLERS).

Сигнатура

FindRandomUser( int nInCombat, int nNotInPeaceZone, int nNotInOlympiad, int nInParty )

Параметры

nInCombat (int) — 1 = только игроки в бою, 0 = без этого фильтра.
nNotInPeaceZone (int) — 1 = исключать игроков в мирной зоне, 0 = без фильтра.
nNotInOlympiad (int) — 1 = исключать игроков на Олимпиаде, 0 = без фильтра.
nInParty (int) — 1 = только игроки в группе, 0 = без фильтра.

Пример

FindRandomUser(0, 0, 0, 0);
FindRandomUser( 1, 1, 1, 1 );

Пример использования

if (GetGlobalMap(99) == 1) {
    FindRandomUser(1, 1, 1, 1);
    AddTimerEx(1227, 300000);
}

DespawnNPC🟢 высокая

снять всех NPC дефайна

Снимает (удаляет) всех NPC данного дефайна. Аргументов не принимает; вызывается на дефайне ([CNpcSpawnDefineEx]).

Сигнатура

Despawn(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

Despawn();

Пример использования

if ( private == myself.boss ) {
    Despawn( );
}

Maker_GetNpcCountNPC🟢 высокая

счётчик собратьев

Говорит, сколько NPC сейчас порождено этим мейкером — удобно для логики «я последний из волны?». Аргументов не принимает; вызывается на myself ([CNPC]). Возвращает int.

Сигнатура

Maker_GetNpcCount(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if ( script_event_arg1 == @SCE_ANTARAS_USE_FEAR && Maker_GetNpcCount( ) < 150 ) {

Пример использования

if ( Maker_GetNpcCount( ) == 1 ) {
    CreateOnePrivateEx( @first_orc, "first_orc", 0, 0, 21036, -107690, -3038, 0, 0, 0, 0 );
}

Maker_FindNpcByKeyNPC🟢 высокая

найти собрата по ключу

Ищет собрата, порождённого тем же мейкером, по его ключу — обычно это третий параметр спавна, sm.param3. Аргумент nKey (int) — ключ искомого NPC; вызывается на myself ([CNPC]). Результат проверяют как существо. Возвращает объект [CSharedCreatureData].

Сигнатура

Maker_FindNpcByKey( int nKey )

Параметры

nKey (int) — ключ искомого NPC (обычно третий параметр спавна, `sm`.param3).

Пример

c0 = Maker_FindNpcByKey( i0 );
c0 = Maker_FindNpcByKey( myself.sm.param3 );

Пример использования

c0 = Maker_FindNpcByKey( i0 );
if ( c0 ) {
    AddAttackDesire( c0, @AMT_MOVE_TO_TARGET, 100000 );
}

SoundEffectNPC🟢 высокая

короткий звук игроку

Проигрывает игроку короткий звук по имени клиентского ресурса. Принимает слушателя
и строку-имя звука; вызывается у NPC (myself), ничего не возвращает. Главное
применение — звуки этапов квеста: взятие квеста, промежуточный шаг, получение
предмета и завершение.

Сигнатура

SoundEffect( CSharedCreatureData c, string sSoundName )

Параметры

c (CSharedCreatureData) — слушатель (игрок), которому проигрывают звук.
sSoundName (string) — имя клиентского звукового ресурса (напр. "Itemsound.quest_middle").

Пример

SoundEffect( c1, "Itemsound.quest_middle" );

EffectMusicNPC🟢 высокая

фоновая музыка

Включает фоновую музыку в радиусе вокруг источника — в примерах это боевые темы боссов.
По декомпилю L2NPC (CNPC::EffectMusic_48943C) второй аргумент — это дистанция рассылки:
строка ошибки движка гласит «nDist<=0 or nDist>16384», то есть радиус слышимости, который
обязан быть в диапазоне 1..16384 (музыка уходит клиентам в этом радиусе, пакет opcode 70).
Вызывается у NPC, ничего не возвращает.

Сигнатура

EffectMusic( CSharedCreatureData c, int nDist, string sTrack )

Параметры

c (CSharedCreatureData) — источник музыки (обычно сам NPC через `sm`).
nDist (int) — радиус слышимости музыки, 1..16384 (движок отвергает 0 и >16384; в вызовах 7000).
sTrack (string) — имя музыкального трека (напр. "BS01_A", "SSQ_Dawn_01").

Пример

EffectMusic(myself.sm, 7000, "BS01_A");

Пример использования

if ( GetSSQWinner( ) == 2 ) {
    EffectMusic( myself.sm, 0, "SSQ_Dawn_01" );
}

VoiceEffectNPC🟢 высокая

голосовая озвучка с громкостью

Проигрывает голосовую озвучку — обычный голос с заданной громкостью, например
подсказки обучения. Принимает слушателя, файл озвучки и громкость; вызывается у NPC,
ничего не возвращает.

Сигнатура

VoiceEffect( CSharedCreatureData c, string sFileName, int nVolume )

Параметры

c (CSharedCreatureData) — слушатель (игрок), которому проигрывают голосовую озвучку.
sFileName (string) — файл голосовой озвучки (напр. "tutorial_voice_026").
nVolume (int) — громкость воспроизведения (в вызовах 0 или 1000).

Пример

VoiceEffect(talker, "tutorial_voice_026", 1000);

Пример использования

if ( GetMemoStateEx( talker, @tutorial_quest, 1 ) == 3 && timer_id >= 1000000 ) {
    VoiceEffect( talker, "tutorial_voice_010d", 0 );
}

VoiceNPCEffectNPC🟢 высокая

реплика NPC

Проигрывает голосовую реплику NPC. Принимает слушателя, файл озвучки и числовой id
режима (в вызовах всегда ноль); вызывается у NPC, ничего не возвращает. Третий
аргумент достоверно не раскрыт.

Сигнатура

VoiceNPCEffect( CSharedCreatureData cCreature, string pwsFileName, int nVoiceNPCEffectId )

Параметры

cCreature (CSharedCreatureData) — слушатель (игрок), которому проигрывается реплика NPC
pwsFileName (string) — файл голосовой озвучки NPC
nVoiceNPCEffectId (int) — id режима озвучки (в вызовах всегда ноль, смысл не раскрыт)

Пример

VoiceNPCEffect(h0.creature, s0, 0);

StartScenePlayerNPC🟢 высокая

кат-сцена одному игроку

Запускает у игрока заскриптованный ролик (кат-сцену) по её идентификатору. Принимает
зрителя и числовой id сцены; вызывается у NPC, ничего не возвращает. Идентификатор
встречается и сырым числом, и под именованными константами (имя сцены босса, номер
сцены и т. п.), объявленными в самом классе скрипта.
Связанное событие: по завершении сцены — SCENE_STOPPED (см. NASC_HANDLERS).

Сигнатура

StartScenePlayer( CSharedCreatureData c, int nSceneId )

Параметры

c (CSharedCreatureData) — зритель (игрок), которому запускают кат-сцену.
nSceneId (int) — идентификатор запускаемой кат-сцены (сырое число или именованная константа сцены).

Пример

StartScenePlayer(talker, 9);

StartScenePlayerAroundNPC🟢 высокая

кат-сцена всем вокруг точки

Запускает кат-сцену всем игрокам рядом с точкой — в пределах радиуса и диапазона
высот. Принимает зрителя, id сцены, радиус и нижнюю/верхнюю границы высоты;
вызывается у NPC, ничего не возвращает.
Связанное событие: по завершении сцены — SCENE_STOPPED (см. NASC_HANDLERS).

Сигнатура

StartScenePlayerAround( CSharedCreatureData c, int nSceneId, int nRadius, int nLowZ, int nHighZ )

Параметры

c (CSharedCreatureData) — точка отсчёта (обычно myself.sm) для показа сцены окружающим.
nSceneId (int) — идентификатор запускаемой кат-сцены.
nRadius (int) — радиус охвата по горизонтали, в пределах которого игрокам показывается сцена.
nLowZ (int) — нижняя граница высоты охвата (координата Z).
nHighZ (int) — верхняя граница высоты охвата (координата Z).

Пример

StartScenePlayerAround(myself.sm, 1, 4000, 1100, 3100);
StartScenePlayerAround(myself.sm, 7, 8000, -11972, -11772);
StartScenePlayerAround(myself.sm, 6, 8000, -11972, -11772);
StartScenePlayerAround(myself.sm, 5, 8000, -11972, -11772);

Пример использования

if (myself.i_ai1 == 4) {
    StartScenePlayerAround(myself.sm, 27, 8000, FloatToInt(myself.sm.z - 1000), FloatToInt(myself.sm.z + 1000));
}

StartScenePlayerToPartyNPC🟢 высокая

кат-сцена всей группе

Запускает кат-сцену всей группе (пати) игрока. Принимает зрителя и id сцены;
вызывается у NPC, ничего не возвращает.
Связанное событие: по завершении сцены — SCENE_STOPPED (см. NASC_HANDLERS).

Сигнатура

StartScenePlayerToParty( CSharedCreatureData c, int nSceneId )

Параметры

    c (CSharedCreatureData) — инициатор, по чьей группе (пати) запускается кат-сцена.
    nSceneId (int) — идентификатор запускаемой кат-сцены.

Пример (иллюстративный):

    StartScenePlayerToParty( talker, nSceneId );

PlaySceneNPC🟢 высокая

проиграть кат-сцену игроку

Проигрывает игроку кат-сцену с указанным индексом (клиентский id сцены). Вызывается
у NPC, ничего не возвращает. Требует ненулевого игрока и неотрицательного индекса
сцены (иначе движок пишет ошибку в лог). Это рабочая презентационная команда, а не
«устаревшая»: просто отправляет клиенту команду запуска сцены.

Сигнатура

PlayScene( CSharedCreatureData c, int nSceneIndex )

Параметры

    c (CSharedCreatureData) — игрок, которому проигрывается кат-сцена.
    nSceneIndex (int) — индекс кат-сцены (клиентский id, >= 0).

Пример (иллюстративный):

    PlayScene( talker, nSceneIndex );

SpecialCameraNPC🟢 высокая

кинематографичная камера на цель

Включает всем игрокам вокруг цели кинематографичную (постановочную) камеру, наведённую
на эту цель, — картинка на время отрывается от персонажа и показывает сцену со стороны.
По одному вызову виден лишь один ракурс; целый ролик (облёт босса, эффектное появление)
собирают из череды таких вызовов подряд по таймеру. Саму камеру рисует клиент: сервер лишь
передаёт ему числа облёта как есть. Ведущие поля понятны (дистанция, углы, тайминги), а
остальные — тонкая настройка облёта, которую интерпретирует клиент. Вызывается у NPC, ничего
не возвращает.

Сигнатура

SpecialCamera( CSharedCreatureData c, int nDist, int nYaw, int nPitch, int nTime, int nDuration, int nTurn, int nRise, int nParam8, int nParam9, int nParam10, int nParam11 )

Параметры

c (CSharedCreatureData) — цель, на которую смотрит камера (обычно сам босс, myself.sm).
nDist (int) — насколько далеко камера отстоит от цели (в вызовах 500, 700, 1700).
nYaw (int) — поворот камеры вокруг цели по горизонтали (небольшие числа-градусы: 10, 13, 88).
nPitch (int) — наклон камеры по вертикали (выше/ниже линии цели: 0, 4, -19).
nTime (int) — за сколько миллисекунд камера плавно доедет до заданного положения (в вызовах 0, 300, 5000, 6000).
nDuration (int) — сколько миллисекунд держится этот ракурс (в вызовах 5000, 10000, 15000).
nTurn (int) — числовое поле хода камеры на участке (доворот/движение; в вызовах 250, 10000, 20000). Точный смысл не подтверждён.
nRise (int) — числовое поле хода камеры на участке (в вызовах 0, 20). Точный смысл не подтверждён.
nParam8 (int) — настроечное поле камеры для клиента (в вызовах 0, -20).
nParam9 (int) — настроечное поле камеры для клиента (в вызовах 0, 1).
nParam10 (int) — настроечное поле камеры для клиента (в вызовах 0, 1).
nParam11 (int) — настроечное поле камеры для клиента (в вызовах 0, 1).

Пример

SpecialCamera(myself.sm, 500, 88, 4, 5000, 5000, 10000, 0, 0, 1, 0, 1);

Пример использования

if ( timer_id == 1117 ) {
    SpecialCamera( myself.sm, 1700, 10, 0, 300, 15000, 250, 20, -20, 1, 1, 0 );
}

SpecialCamera3NPC🟢 высокая

расширенная камера

Ещё один вариант постановочной камеры из той же семьи, что SpecialCamera, — с тем же
набором из одиннадцати числовых настроек ракурса и таймингов. Отличается поведением
камеры на участке (по вызовам видно другое сочетание чисел), но назначение и способ
применения те же: показать всем вокруг цели сцену со стороны, а из череды вызовов
собрать ролик. Картинку рисует клиент: сервер передаёт числа облёта как есть. Вызывается
у NPC, ничего не возвращает.

Сигнатура

SpecialCamera3( CSharedCreatureData c, int nDist, int nYaw, int nPitch, int nTime, int nDuration, int nTurn, int nRise, int nParam8, int nParam9, int nParam10, int nParam11 )

Параметры

c (CSharedCreatureData) — цель, на которую смотрит камера (обычно сам босс).
nDist (int) — насколько далеко камера отстоит от цели (в вызовах 250, 300).
nYaw (int) — поворот камеры вокруг цели по горизонтали (в вызовах 180, 220).
nPitch (int) — наклон камеры по вертикали (в вызовах 0, 20).
nTime (int) — за сколько миллисекунд камера доедет до заданного положения (в вызовах 0, 3000).
nDuration (int) — сколько миллисекунд держится ракурс (в вызовах 5000).
nTurn (int) — числовое поле хода камеры на участке (в вызовах 10000). Точный смысл не подтверждён.
nRise (int) — числовое поле хода камеры на участке (в вызовах 0). Точный смысл не подтверждён.
nParam8 (int) — настроечное поле камеры для клиента (в вызовах 0, 6).
nParam9 (int) — настроечное поле камеры для клиента (в вызовах 1).
nParam10 (int) — настроечное поле камеры для клиента (в вызовах 1).
nParam11 (int) — настроечное поле камеры для клиента (в вызовах 1).

Пример использования

if ( timer_id == 2002 ) {
    SpecialCamera3( myself.sm, 0, 180, 80, 4000, 5000, 6000, 0, 0, 1, 1, 1 );
    AddTimerEx( 2003, 6000 );
}

SpecialCameraExNPC🟢 высокая

камера с двумя целями

Постановочная камера с двумя целями: одна задаёт точку, откуда смотрит камера, вторая —
на кого она направлена. Удобна, когда сцену надо показать в связке двух существ (например,
взгляд от одного персонажа к другому). Дальше идут девять числовых полей облёта — те же
настройки ракурса и таймингов, что у обычной SpecialCamera; картинку рисует клиент, сервер
передаёт числа как есть. Вызывается у NPC, ничего не возвращает.

Сигнатура

SpecialCameraEx( CSharedCreatureData cFrom, CSharedCreatureData cTo, int nDist, int nYaw, int nPitch, int nTime, int nDuration, int nParam7, int nParam8, int nParam9, int nParam10 )

Параметры

    cFrom (CSharedCreatureData) — существо, от которого ведётся взгляд (точка съёмки).
    cTo (CSharedCreatureData) — существо, на которое направлена камера.
    nDist (int) — насколько далеко камера отстоит от цели.
    nYaw (int) — поворот камеры по горизонтали.
    nPitch (int) — наклон камеры по вертикали.
    nTime (int) — за сколько миллисекунд камера доедет до заданного положения.
    nDuration (int) — сколько миллисекунд держится ракурс.
    nParam7 (int) — настроечное поле камеры для клиента.
    nParam8 (int) — настроечное поле камеры для клиента.
    nParam9 (int) — настроечное поле камеры для клиента.
    nParam10 (int) — настроечное поле камеры для клиента.

Пример (иллюстративный):

    SpecialCameraEx( talker, talker, nDist, nYaw, nPitch, nTime, nDuration, nParam7, nParam8, nParam9, nParam10 );

SpecialCameraZLimitNPC🟢 высокая

камера с ограничением по высоте

Та же постановочная камера, что SpecialCamera, но с двумя дополнительными числами —
нижней и верхней границей по высоте (координата Z). Ими камеру удерживают в заданном
диапазоне высот, чтобы она не ныряла под землю и не улетала слишком высоко на неровной
местности. Остальные поля — обычные настройки ракурса и таймингов; картинку рисует
клиент, сервер передаёт числа как есть. Вызывается у NPC, ничего не возвращает.

Сигнатура

SpecialCameraZLimit( CSharedCreatureData c, int nDist, int nYaw, int nPitch, int nTime, int nDuration, int nTurn, int nRise, int nParam8, int nParam9, int nParam10, int nParam11, int nLowZ, int nHighZ )

Параметры

    c (CSharedCreatureData) — цель, на которую смотрит камера (обычно сам босс).
    nDist (int) — насколько далеко камера отстоит от цели.
    nYaw (int) — поворот камеры по горизонтали.
    nPitch (int) — наклон камеры по вертикали.
    nTime (int) — за сколько миллисекунд камера доедет до заданного положения.
    nDuration (int) — сколько миллисекунд держится ракурс.
    nTurn (int) — числовое поле хода камеры на участке. Точный смысл не подтверждён.
    nRise (int) — числовое поле хода камеры на участке. Точный смысл не подтверждён.
    nParam8 (int) — настроечное поле камеры для клиента.
    nParam9 (int) — настроечное поле камеры для клиента.
    nParam10 (int) — настроечное поле камеры для клиента.
    nParam11 (int) — настроечное поле камеры для клиента.
    nLowZ (int) — нижняя граница высоты: ниже этого уровня камеру не опускать.
    nHighZ (int) — верхняя граница высоты: выше этого уровня камеру не поднимать.

Пример (иллюстративный):

    SpecialCameraZLimit( talker, nDist, nYaw, nPitch, nTime, nDuration, nTurn, nRise, nParam8, nParam9, nParam10, nParam11, nLowZ, nHighZ );

EarthQuakeByNPCNPC🟢 высокая

тряска экрана вокруг цели

Трясёт экран зрителям вокруг цели — для драматичных моментов в боях с боссами. Саму тряску
рендерит клиент: сервер передаёт ему шесть чисел как есть. Первые два — сила и
длительность, остальные четыре — клиентские поля эффекта (в вызовах 1/1/1/0). Вызывается
у NPC, ничего не возвращает.

Сигнатура

EarthQuakeByNPC( CSharedCreatureData c, int nIntensity, int nDuration, int nParam3, int nParam4, int nParam5, int nParam6 )

Параметры

c (CSharedCreatureData) — эпицентр тряски (часто сам NPC, myself.sm).
nIntensity (int) — сила тряски экрана (в вызовах 40, 50).
nDuration (int) — длительность тряски (в вызовах 4, 10).
nParam3 (int) — поле клиентского эффекта тряски (opcode 59). [need_client]
nParam4 (int) — поле клиентского эффекта тряски (opcode 59). [need_client]
nParam5 (int) — поле клиентского эффекта тряски (opcode 59). [need_client]
nParam6 (int) — поле клиентского эффекта тряски (opcode 59). [need_client]

Пример

EarthQuakeByNPC(myself.sm, 50, 4, 1, 1, 1, 0);

Пример использования

if ( timer_id == 2006 ) {
    EarthQuakeByNPC( myself.sm, 40, 10, 1, 0, 0, 0 );
    EffectMusic( myself.sm, 6000, "BS02_A" );
}

EarthQuakeToPartyNPC🟢 высокая

тряска экрана для группы

Трясёт экран всем участникам одной группы (пати) — где бы они ни находились, тряску
получают именно члены указанной группы, а не все вокруг какой-то точки. Применяется для
драматичных моментов внутри инстанса/комнаты, где действие идёт на группу. Саму тряску
рисует клиент. Ничего не возвращает.

Сигнатура

EarthQuakeToParty( int nPartyId, int nIntensity, int nDuration, int nParam3 )

Параметры

nPartyId (int) — номер группы (пати), которой трясти экран (обычно room0.party_id — группа текущей комнаты/инстанса).
nIntensity (int) — сила тряски: чем больше, тем заметнее качает картинку (в вызовах 10, 20).
nDuration (int) — длительность тряски (в вызовах 10).
nParam3 (int) — дополнительная настройка эффекта тряски для клиента (в вызовах 1).

Пример

EarthQuakeToParty( room0.party_id, 20, 10, 1 );
EarthQuakeToParty( room0.party_id, 10, 10, 1 );

RegisterAsOlympiadOperatorNPC🟢 высокая

объявить NPC распорядителем Олимпиады

Помечает данного NPC как распорядителя Олимпиады — через него идёт регистрация и просмотр
боёв. Без аргументов, вызывается у myself один раз в обработчике создания.

Сигнатура

RegisterAsOlympiadOperator(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

RegisterAsOlympiadOperator();

GetOlympiadModeNPC🟢 высокая

идёт ли сейчас приём на Олимпиаду

Главный гейт распорядителя: возвращает [bool_pch] (@TRUE/@FALSE) — идёт ли сейчас
приём/период Олимпиады. Без аргументов, у myself; почти вся логика диалога обёрнута в
проверку == @TRUE.

Сигнатура

GetOlympiadMode(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if (GetOlympiadMode() == @TRUE)

Пример использования

if (GetOlympiadMode() == @TRUE)
{
    AddClassFreeOlympiad(talker);
}

GetOlympiadStepNPC🟢 высокая

текущая фаза цикла Олимпиады

Возвращает целым числом текущую фазу цикла Олимпиады. Без аргументов, у myself,
только чтение.

Сигнатура

GetOlympiadStep(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

FHTML_SetInt(fhtml0, "olympiad_week", GetOlympiadStep());

GetOlympiadSeasonNPC🟢 высокая

номер сезона

Возвращает целым числом номер текущего сезона Олимпиады. Без аргументов, у myself,
только чтение.

Сигнатура

GetOlympiadSeason(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

FHTML_SetInt(fhtml0, "olympiad_round", GetOlympiadSeason());

GetOlympiadSeasonElapsedTimeNPC🟢 высокая

сколько прошло в сезоне

Возвращает целым числом, сколько времени уже отсчитано с начала текущего сезона
Олимпиады — то есть насколько давно идёт нынешний период. Числом обычно проверяют,
достаточно ли прошло, чтобы разрешить то или иное действие (например, показать итоги
или пустить в определённый режим). Без аргументов, у myself, только чтение.

Единица измерения — секунды: возвращается разница между текущим временем и временем старта
сезона (0, если сезон ещё не начат).

Сигнатура

GetOlympiadSeasonElapsedTime(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

GetOlympiadSeasonElapsedTime( );

GetOlympiadPlayerCountNPC🟢 высокая

сколько игроков зарегистрировано

Возвращает целым числом точное количество игроков, зарегистрированных на Олимпиаду в
данный момент (сумма всех, кто встал в очереди на бои). Годится для вывода в диалоге
«сейчас записано столько-то». На заметку: в штатных скриптах эту цифру намеренно не
показывают игрокам (строку вывода закомментировали), чтобы точное число участников не
провоцировало массовый одновременный «залив» на регистрацию. Без аргументов, у myself,
только чтение.

Сигнатура

GetOlympiadPlayerCount(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

FHTML_SetInt(fhtml0, "olympiad_participant", GetOlympiadPlayerCount());

GetOlympiadWaitingCountNPC🟢 высокая

очередь классовых боёв

Возвращает целым числом, сколько игроков ждёт в очереди классовых (classed) боёв.
Без аргументов, у myself, только чтение.

Сигнатура

GetOlympiadWaitingCount(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

i0 = GetOlympiadWaitingCount();

Пример использования

i0 = GetOlympiadWaitingCount( );
if ( i0 < 100 ) {
    FHTML_SetStr( fhtml0, "WaitingCount", MakeFString( 1000504, "100", _blank, _blank, _blank, _blank ) );
} else {
    FHTML_SetStr( fhtml0, "WaitingCount", MakeFString( 1000505, "100", _blank, _blank, _blank, _blank ) );
}

GetClassFreeOlympiadWaitingCountNPC🟢 высокая

очередь свободных боёв

Возвращает целым числом размер очереди свободных (free) боёв. Без аргументов,
у myself, только чтение.

Сигнатура

GetClassFreeOlympiadWaitingCount(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

i0 = GetClassFreeOlympiadWaitingCount();

Пример использования

i0 = GetClassFreeOlympiadWaitingCount( );
if ( i0 < 100 ) {
    FHTML_SetStr( fhtml0, "ClassFreeWaitingCount", MakeFString( 1000504, "100", _blank, _blank, _blank, _blank ) );
} else {
    FHTML_SetStr( fhtml0, "ClassFreeWaitingCount", MakeFString( 1000505, "100", _blank, _blank, _blank, _blank ) );
}

GetTeamOlympiadWaitingCountNPC🟢 высокая

очередь командных боёв

Возвращает целым числом размер очереди командных боёв (3v3). Без аргументов,
у myself, только чтение.

Сигнатура

GetTeamOlympiadWaitingCount(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

i0 = GetTeamOlympiadWaitingCount();

Пример использования

i0 = GetTeamOlympiadWaitingCount();
if (i0 < 100) {
    FHTML_SetStr(fhtml0, "TeamWaitingCount", MakeFString(1000504, "100", _blank, _blank, _blank, _blank));
} else {
    FHTML_SetStr(fhtml0, "WaitingCount", MakeFString(1000505, "100", _blank, _blank, _blank, _blank));
}

GetOlympiadFieldIdNPC🟢 высокая

идентификатор арены

Возвращает целым числом идентификатор арены (поля) Олимпиады, к которой привязан этот
NPC. Число обычно сохраняют в переменную и потом подставляют в функции по конкретной
арене — например, чтобы узнать имена бойцов на ней (GetPlayer1ForOlympiadField /
GetPlayer2ForOlympiadField принимают именно этот id). Без аргументов, у myself,
только чтение.

Сигнатура

GetOlympiadFieldId(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

myself.i_ai0 = GetOlympiadFieldId();

IsOlympiadRegisteredNPC🟢 высокая

записан ли игрок на бой

Проверяет, зарегистрирован ли уже игрок на матч; возвращает целое число (булево).
Принимает игрока (talker, тип CSharedCreatureData), вызывается у myself.

Сигнатура

IsOlympiadRegistered( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, чью регистрацию на матч проверяют

Пример

if (IsOlympiadRegistered(talker) == @FALSE)

Пример использования

if (IsOlympiadRegistered(talker) == @FALSE)
{
    ShowPage(talker, "sf_antonius_proximo005.htm");
}
else
{
    ShowPage(talker, "sf_antonius_proximo007.htm"); // Вы уже зарегистрированы, хотите отменить?
}

AddOlympiadNPC🟢 высокая

записать в классовый бой 1v1

Регистрирует игрока в классовый матч один на один (classed). Принимает игрока (talker,
тип CSharedCreatureData), у myself; перед вызовом логика проверяет режим Олимпиады,
отсутствие записи, уровень и профессию.

Сигнатура

AddOlympiad( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, которого регистрируют на классовый матч один на один

Пример

AddOlympiad(talker);

Пример использования

if ( GetOlympiadPoint( talker ) > 0 ) {
    AddOlympiad( talker );
} else {
    ShowPage( talker, "olympiad_operator010i.htm" );
}

AddClassFreeOlympiadNPC🟢 высокая

записать в свободный бой 1v1

Регистрирует игрока в свободный матч один на один без учёта класса. Принимает игрока
(talker, тип CSharedCreatureData), у myself; те же предварительные проверки, что и
у прочих Add.

Сигнатура

AddClassFreeOlympiad( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, которого регистрируют на свободный матч без учёта класса

Пример

AddClassFreeOlympiad(talker);

Пример использования

if ( GetOlympiadPoint( talker ) > 0 ) {
    AddClassFreeOlympiad( talker );
} else {
    ShowPage( talker, "olympiad_operator010i.htm" );
}

AddBo3OlympiadNPC🟢 высокая

записать в бой до двух побед

Регистрирует игрока в матч best-of-3 (до двух побед). Принимает игрока (talker,
тип CSharedCreatureData), у myself.

Сигнатура

AddBo3Olympiad( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, которого регистрируют на матч best-of-3

Пример

AddBo3Olympiad(talker);

AddTeamOlympiadNPC🟢 высокая

записать в командный бой 3v3

Регистрирует игрока в командный матч три на три. Принимает игрока (talker,
тип CSharedCreatureData), у myself.

Сигнатура

AddTeamOlympiad( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, которого регистрируют на командный матч три на три

Пример

AddTeamOlympiad(talker);

Пример использования

if ( GetOlympiadPoint( talker ) > 0 ) {
    AddTeamOlympiad( talker );
} else {
    ShowPage( talker, "olympiad_operator010i.htm" );
}

RemoveOlympiadNPC🟢 высокая

отменить регистрацию

Отменяет регистрацию игрока на матч (пункт меню «Cancel Registration»). Принимает игрока
(talker, тип CSharedCreatureData), у myself.

Сигнатура

RemoveOlympiad( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, чью регистрацию на матч отменяют

Пример

RemoveOlympiad(talker);

EscapeOlympiadNPC🟢 высокая

покинуть/выйти

Заставляет игрока покинуть Олимпиаду (выход). Принимает игрока (talker,
тип CSharedCreatureData), у myself.

Сигнатура

EscapeOlympiad( CSharedCreatureData cCreature )

Параметры

    cCreature (CSharedCreatureData) — игрок, которого выводят с Олимпиады

Пример (иллюстративный):

    EscapeOlympiad( talker );

ShowOlympiadMatchListNPC🟢 высокая

открыть список текущих матчей

Открывает игроку список текущих боёв (пункт меню «Watch Match»). Принимает игрока
(talker, тип CSharedCreatureData), у myself.

Сигнатура

ShowOlympiadMatchList( CSharedCreatureData pCreatureShared )

Параметры

pCreatureShared (CSharedCreatureData) — игрок, которому показывают список текущих боёв

Пример

ShowOlympiadMatchList(talker);

Пример использования

if ( ask == -1 && reply == 1 ) {
    ShowOlympiadMatchList( talker );
}

ObserveOlympiadNPC🟢 высокая

отправить зрителем на арену

Отправляет игрока наблюдателем на выбранную арену. Принимает игрока (talker,
тип CSharedCreatureData) и идентификатор арены nFieldId, у myself.

Сигнатура

ObserveOlympiad( CSharedCreatureData cCreature, int nFieldId )

Параметры

cCreature (CSharedCreatureData) — игрок, которого отправляют наблюдателем.
nFieldId  (int) — идентификатор арены для наблюдения. В вызовах приходит из reply меню
                  (номер выбранной арены из HTML-списка боёв).

Пример

ObserveOlympiad( talker, reply );

Пример использования

if (ask == -130) {
    ObserveOlympiad( talker, reply );
}

GetPlayer1ForOlympiadFieldNPC🟢 высокая

первый боец арены (имя)

Возвращает строкой имя первого из двух бойцов, дерущихся на указанной арене. Нужна,
чтобы вывести список текущих поединков наблюдателю — имя вставляют прямо в текст
диалога рядом с именем соперника (его даёт парная GetPlayer2ForOlympiadField). Если
на арене боя нет, вернётся пустая строка. Принимает идентификатор арены (его берут из
GetOlympiadFieldId либо перебирают по номерам арен), у myself.

Сигнатура

GetPlayer1ForOlympiadField( int field_id )

Параметры

field_id (int) — идентификатор арены, чьего первого бойца запрашивают

Пример

s0 = "&$1718;" + "&nbsp;&nbsp;&nbsp;" + GetPlayer1ForOlympiadField(i0) + "&nbsp;" + GetPlayer2ForOlympiadField(i0);

GetPlayer1ForOlympiadFieldExNPC🟢 высокая

первый боец арены (объект)

Возвращает первого бойца указанной арены объектом существа (CSharedCreatureData).
Принимает идентификатор арены nFieldId, у myself.

Сигнатура

GetPlayer1ForOlympiadFieldEx( int field_id )

Параметры

field_id (int) — идентификатор арены, чьего первого бойца запрашивают (как объект существа)

Пример

c0 = GetPlayer1ForOlympiadFieldEx(event_id);

GetPlayer2ForOlympiadFieldNPC🟢 высокая

второй боец арены (имя)

Возвращает строкой имя второго из двух бойцов на указанной арене — соперника того, чьё
имя даёт GetPlayer1ForOlympiadField. В паре с ней используется для строки поединка
«боец1 : боец2» в списке текущих боёв для наблюдателя. Если на арене боя нет, вернётся
пустая строка. Принимает идентификатор арены (из GetOlympiadFieldId либо перебором по
номерам арен), у myself.

Сигнатура

GetPlayer2ForOlympiadField( int field_id )

Параметры

field_id (int) — идентификатор арены, чьего второго бойца запрашивают

Пример

s0 = "&$1718;" + "&nbsp;&nbsp;&nbsp;" + GetPlayer1ForOlympiadField(i0) + "&nbsp;" + GetPlayer2ForOlympiadField(i0);

GetPlayer2ForOlympiadFieldExNPC🟢 высокая

второй боец арены (объект)

Возвращает второго бойца указанной арены объектом существа (CSharedCreatureData).
Принимает идентификатор арены nFieldId, у myself.

Сигнатура

GetPlayer2ForOlympiadFieldEx( int field_id )

Параметры

field_id (int) — идентификатор арены, чьего второго бойца запрашивают (как объект существа)

Пример

c1 = GetPlayer2ForOlympiadFieldEx(event_id);

GetOlympiadPointNPC🟢 высокая

текущие очки игрока

Возвращает целым числом текущие очки игрока на Олимпиаде. Принимает игрока (talker,
тип CSharedCreatureData), у myself.

Сигнатура

GetOlympiadPoint( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, чьи текущие очки Олимпиады запрашивают

Пример

if (GetOlympiadPoint(c0) > 0)

Пример использования

if ( GetOlympiadPoint( talker ) > 0 ) {
    AddClassFreeOlympiad( talker );
} else {
    ShowPage( talker, "olympiad_operator010i.htm" );
}

GetPreviousOlympiadPointNPC🟢 высокая

очки прошлого периода

Возвращает целым числом очки игрока за прошлый период Олимпиады. Принимает игрока
(talker, тип CSharedCreatureData), у myself.

Сигнатура

GetPreviousOlympiadPoint( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, чьи очки за прошлый период Олимпиады запрашивают

Пример

/* if (GetPreviousOlympiadPoint(talker) < 50)

Пример использования

if (GetPreviousOlympiadPoint(talker) == 0 || GetOlympiadTradePoint(talker) == 0)
{
    ShowPage(talker, "olympiad_operator_basic014.htm");
}
else
{
    ShowPage(talker, "olympiad_operator_basic013.htm");
}

GetOlympiadWinCountNPC🟢 высокая

число побед

Возвращает целым числом количество побед игрока на Олимпиаде. Принимает игрока
(talker, тип CSharedCreatureData), у myself.

Сигнатура

GetOlympiadWinCount( CSharedCreatureData c )

Параметры

    c (CSharedCreatureData) — игрок, чьё количество побед на Олимпиаде запрашивают

Пример (иллюстративный):

    GetOlympiadWinCount( talker );

GetOlympiadTradePointNPC🟢 высокая

обменные очки игрока

Возвращает целым числом «обменные» очки игрока — валюту на награды. Принимает игрока
(talker, тип CSharedCreatureData), у myself.

Сигнатура

GetOlympiadTradePoint( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, чьи обменные очки запрашивают

Пример

i0 = GetOlympiadTradePoint( talker );

Пример использования

if ( GetOlympiadTradePoint( talker ) > 0 ) {
    DeleteOlympiadTradePoint( talker, GetOlympiadTradePoint( talker ) );
}

AddOlympiadTradePointNPC🟢 высокая

начислить обменные очки

Начисляет игроку обменные очки Олимпиады — ту валюту, на которую потом берут награды.
Второй аргумент это просто сколько очков добавить (обычное число, не константа). Прямая
пара к DeleteOlympiadTradePoint (списание) и к GetOlympiadTradePoint (текущий остаток):
одна начисляет, другая снимает, третья показывает баланс. Принимает игрока и количество
очков, у myself.

Сигнатура

AddOlympiadTradePoint( CSharedCreatureData cCreature, int nPoint )

Параметры

    cCreature (CSharedCreatureData) — игрок, которому начисляют обменные очки
    nPoint    (int) — сколько обменных очков добавить (обычное число, не enum)

Пример (иллюстративный):

    AddOlympiadTradePoint( talker, nPoint );

DeleteOlympiadTradePointNPC🟢 высокая

списать обменные очки

Списывает у игрока обменные очки Олимпиады (валюту на награды) — пара к
AddOlympiadTradePoint. Второй аргумент это сколько снять; на практике туда передают
GetOlympiadTradePoint(talker), то есть обнуляют весь остаток разом (обычно перед выдачей
награды за все накопленные очки). Разумно предварять проверкой GetOlympiadTradePoint(talker)
> 0, чтобы не списывать с пустого счёта. Принимает игрока и количество очков, у myself.

Сигнатура

DeleteOlympiadTradePoint( CSharedCreatureData cCreature, int nPoint )

Параметры

cCreature (CSharedCreatureData) — игрок, у которого списывают обменные очки
nPoint    (int) — сколько обменных очков снять (обычно GetOlympiadTradePoint(talker) — списать всё; не enum)

Пример

DeleteOlympiadTradePoint( talker, i0 );
DeleteOlympiadTradePoint( talker, GetOlympiadTradePoint( talker ) );

Пример использования

    if ( GetOlympiadTradePoint( talker ) > 0 ) {
        DeleteOlympiadTradePoint( talker, GetOlympiadTradePoint( talker ) );
    }

Связанное событие: ответ сервера приходит событием DELETE_OLYMPIAD_TRADE_POINT_RETURNED (см. NASC_HANDLERS).

DeletePreviousOlympiadPointNPC🟢 высокая

списать очки прошлого периода

Списывает у игрока очки, накопленные за прошлый (уже завершившийся) период Олимпиады —
их отдельно от текущих обменных очков обменивают на награду по итогам периода. Второй
аргумент это сколько снять; на практике передают GetPreviousOlympiadPoint(talker),
то есть забирают весь прошлый остаток разом при выдаче награды. Принимает игрока и
количество очков, у myself.

Сигнатура

DeletePreviousOlympiadPoint( CSharedCreatureData cCreature, int nPoint )

Параметры

cCreature (CSharedCreatureData) — игрок, у которого списывают очки прошлого периода
nPoint    (int) — сколько очков прошлого периода снять (обычно GetPreviousOlympiadPoint(talker) — списать всё; не enum)

Пример

    DeletePreviousOlympiadPoint(talker, GetPreviousOlympiadPoint(talker));

Связанное событие: ответ сервера приходит событием DELETE_PREVIOUS_OLYMPIAD_POINT_RETURNED (см. NASC_HANDLERS).

GetNameByOlympiadRankOrderNPC🟢 высокая

имя N-го в рейтинге класса

Возвращает строкой имя бойца, стоящего на N-м месте в рейтинге («зале славы») выбранного
класса. Первый аргумент — какой класс смотрим (в диалогах его берут из выбора игрока,
state/reply), второй — номер строки рейтинга (1, 2, 3, …). Функцией заполняют таблицу
рейтинга: в цикле перебирают места и на каждом достают имя, очки (GetPointByOlympiadRankOrder)
и ранг (GetRankByOlympiadRankOrder). Когда места кончаются, GetRankByOlympiadRankOrder на
этом номере вернёт 0 — по этому и обрывают перебор. У myself.

Сигнатура

GetNameByOlympiadRankOrder( int nClassId, int nOrder )

Параметры

nClassId (int) — класс, по рейтингу которого ищут бойца (обычно из выбора игрока в диалоге)
nOrder (int) — номер места в рейтинге класса (1 — первое место и т. д.)

Пример

FHTML_SetStr(fhtml0, "Name" + i0, GetNameByOlympiadRankOrder(state, i0));

GetPointByOlympiadRankOrderNPC🟢 высокая

очки N-го в рейтинге класса

Возвращает целым числом очки бойца, стоящего на N-м месте в рейтинге выбранного класса.
Полностью парная к GetNameByOlympiadRankOrder и GetRankByOlympiadRankOrder — те же два
аргумента и тот же способ применения: в цикле по местам достают имя, очки и ранг, чтобы
заполнить таблицу рейтинга. Первый аргумент — какой класс смотрим (в диалогах из выбора
игрока), второй — номер места. У myself.

Сигнатура

GetPointByOlympiadRankOrder( int nClassId, int nOrder )

Параметры

    nClassId (int) — класс, по рейтингу которого ищут бойца (обычно из выбора игрока в диалоге)
    nOrder (int) — номер места в рейтинге класса (1 — первое место и т. д.)

Пример (иллюстративный):

    GetPointByOlympiadRankOrder( nClassId, nOrder );

GetRankByOlympiadRankOrderNPC🟢 высокая

ранг N-го в рейтинге класса

Возвращает целым числом ранг бойца, стоящего на N-м месте в рейтинге выбранного класса.
Двойное назначение: с одной стороны даёт значение ранга для строки таблицы, с другой —
служит признаком конца списка. Пока на данном месте кто-то есть, вернётся ранг > 0;
как только места кончились, вернётся 0 — по этому нулю и прерывают перебор мест. Пара к
GetNameByOlympiadRankOrder и GetPointByOlympiadRankOrder, аргументы те же: первый — какой
класс смотрим (в диалогах из выбора игрока), второй — номер места. У myself.

Сигнатура

GetRankByOlympiadRankOrder( int nClassId, int nOrder )

Параметры

nClassId (int) — класс, по рейтингу которого ищут бойца (обычно из выбора игрока в диалоге)
nOrder (int) — номер места в рейтинге класса (1 — первое место и т. д.)

Пример

if (GetRankByOlympiadRankOrder(state, i0) > 0)

Пример использования

if (GetRankByOlympiadRankOrder(reply, i0) == 0) {
    break;
}

GetOlympiadTeamIdNPC🟢 высокая

id команды игрока

Возвращает целым числом номер команды, за которую игрок выступает в командном (3v3)
бою Олимпиады. Нужен, чтобы отличать своих от чужих на арене: номер игрока сравнивают
с номером команды, закреплённым за конкретной стороной поля, и так решают, друг это или
противник. Вне командного боя осмысленной команды у игрока нет. Принимает игрока,
у myself.

Сигнатура

GetOlympiadTeamId( CSharedCreatureData c )

Параметры

c (CSharedCreatureData) — игрок (боец), чей номер команды запрашивают

Пример

if (GetOlympiadTeamId(talker) == myself.i_ai1)

AddTournamentNPC🟢 высокая

регистрация на турнирный матч

Регистрирует игрока на конкретный турнирный матч (турнир — параллельная Олимпиаде
подсистема). Принимает игрока (talker) и код регистрации, у myself. Второй
аргумент — это НЕ «тип/категория», а код целевого матча, и он зависит от стадии:

- На групповом этапе (когда IsTournamentGroupStage() == @TRUE) передают ноль —
это авто-регистрация на текущий матч группы: AddTournament(talker, 0).
- В финалах (стадия не групповая) игрок вводит код матча в диалоге «Enter Code»,
и этот код (пришедший как reply) передают вторым аргументом:
AddTournament(talker, reply).

Перед регистрацией проверяют, что турнир вообще идёт — IsTournamentEnable() == @TRUE.
Родственные: IsTournamentGroupStage (группа/финалы), ShowTournamentMatchList
(окно матчей для просмотра), GetTournamentNpcFlagId, AddBo3Olympiad
(регистрация на Олимпиаду «до трёх побед»).

Сигнатура

AddTournament( CSharedCreatureData c, int nRegisterCode )

Параметры

c (CSharedCreatureData) — игрок, которого регистрируют
nRegisterCode (int) — код целевого матча: 0 = групповой авто-вход; в финалах — код, введённый игроком

Пример использования

if ( IsTournamentEnable() == @TRUE ) {
    if ( IsTournamentGroupStage() == @TRUE ) { AddTournament( talker, 0 ); }
}
// финалы, пункт «Registration to Match (Enter Code)»:
if ( IsTournamentGroupStage() == @FALSE ) { AddTournament( talker, reply ); }

ObserveTournamentNPC🟢 высокая

наблюдать турнирный бой

Отправляет игрока наблюдателем на турнирную арену. Принимает игрока (talker,
тип CSharedCreatureData) и идентификатор арены nFieldId, у myself.

Сигнатура

ObserveTournament( CSharedCreatureData c, int nFieldId )

Параметры

    c (CSharedCreatureData) — игрок, которого отправляют наблюдателем на турнирную арену
    nFieldId (int) — идентификатор турнирной арены для наблюдения

Пример (иллюстративный):

    ObserveTournament( talker, nFieldId );

ShowTournamentMatchListNPC🟢 высокая

список турнирных матчей

Открывает игроку список текущих турнирных боёв. Принимает игрока (talker,
тип CSharedCreatureData), у myself.

Сигнатура

ShowTournamentMatchList( CSharedCreatureData c )

Параметры

c (CSharedCreatureData) — игрок, которому показывают список текущих турнирных боёв

Пример

ShowTournamentMatchList(talker);

GetTournamentNpcFlagIdNPC🟢 высокая

флаг-id турнирного NPC

Возвращает целым числом флаг-идентификатор турнирного NPC. Принимает игрока (talker,
тип CSharedCreatureData), у myself.

Сигнатура

GetTournamentNpcFlagId( CSharedCreatureData c )

Параметры

c (CSharedCreatureData) — игрок, для которого запрашивают флаг-идентификатор турнирного NPC

Пример

GetTournamentNpcFlagId( talker );

GetSpawnDefineMAKER🟢 высокая

достать дефайн по индексу

Возвращает спавн-дефайн мейкера по индексу (от нуля до числа дефайнов минус один). Аргумент nIndex (int) — номер дефайна; вызывается на myself ([CNpcMakerEx]). Результат проверяют на пустоту через IsNull. Возвращает объект [CNpcSpawnDefineEx].

Сигнатура

GetSpawnDefine( int nIndex )

Параметры

nIndex (int) — индекс спавн-дефайна (от нуля до числа дефайнов минус один).

Пример

def0 = GetSpawnDefine(i0);

Пример использования

def0 = GetSpawnDefine( i0 );
if ( IsNull( def0 ) == 0 ) {
    def0.Despawn( );
}

GetSpawnDefineByNickMAKER🟢 высокая

достать дефайн по нику

Возвращает спавн-дефайн мейкера по его нику (поле name дефайна). Аргумент sNick (string) — ник искомого дефайна; вызывается на myself ([CNpcMakerEx]). Результат проверяют на пустоту через IsNull. Возвращает объект [CNpcSpawnDefineEx].

Сигнатура

GetSpawnDefineByNick( string sNick )

Параметры

sNick (string) — ник (имя) искомого спавн-дефайна.

Пример

def0 = GetSpawnDefineByNick(manager_npc_name);

AtomicIncreaseTotalMAKER🟢 высокая

атомарная бронь слотов

Атомарно увеличивает плановое количество спавнов мейкера (total) на заданное число (под блокировкой, с ограничением диапазона [0, максимум]). Это защита от гонки: пока один обработчик не закончил бронь, другой не влезет. Возвращает НЕ единицу, а текущее значение total после операции (ноль означает, что прибавка вышла за границы либо дедупликация пропустила инкремент); скрипты используют результат как истинностный флаг «можно спавнить». Аргументы: def ([CNpcSpawnDefineEx]) — дефайн, чей план увеличиваем; nCount (int) — величина прибавки (часто весь total или одна штука); третий аргумент — НЕ «шаг», а флаг уникальности: при значении 1 включается дедупликация, и каждый дефайн учитывается только один раз (защита от двойного счёта), при 0 прибавка идёт всегда. Вызывается на myself ([CNpcMakerEx]).

Сигнатура

AtomicIncreaseTotal( CNpcSpawnDefineEx def, int nCount, int bUnique )

Параметры

def (CNpcSpawnDefineEx) — дефайн, чей плановый total увеличиваем.
nCount (int) — величина прибавки к плановому количеству (часто весь total или 1).
bUnique (int) — флаг уникальности: 1 = считать дефайн один раз (дедуп), 0 = прибавлять всегда.

Пример

if (AtomicIncreaseTotal(def0, i1, 1))

Пример использования

if (AtomicIncreaseTotal(def0, def0.total, 1)) {
    def0.Spawn2(def0.total, 0, 0);
}

DoRespawnMAKER🟢 высокая

выполнить отложенные респавны

Выполняет накопленные отложенные респавны мейкера; обычно дёргается по таймеру. Аргументов не принимает; вызывается на myself ([CNpcMakerEx]).

Сигнатура

DoRespawn(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

DoRespawn();

Пример использования

if (myself.i_ai0 == 1) {
    DoRespawn();
    AddTimerEx(5001, 1000);
}

ResetRespawnMAKER🟢 высокая

сбросить очередь респавнов

Сбрасывает (очищает) очередь отложенных респавнов мейкера. Аргументов не принимает; вызывается на myself ([CNpcMakerEx]).

Сигнатура

ResetRespawn(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

ResetRespawn();

RegisterRespawnMAKER🟢 высокая

поставить респавн в очередь

Ставит в очередь отложенный респавн: столько-то особей дефайна через столько-то времени; обычно вызывается при удалении NPC. Аргументы: nRespawnTime (int) — задержка до респавна; nCount (int) — сколько возродить (везде единица); def ([CNpcSpawnDefineEx]) — какой дефайн возрождать. Вызывается на myself ([CNpcMakerEx]).

Сигнатура

RegisterRespawn( int nRespawnTime, int nCount, CNpcSpawnDefineEx def )

Параметры

nRespawnTime (int) — задержка до отложенного респавна (обычно deleted_def.respawn_time).
nCount (int) — сколько особей возродить (везде единица).
def (CNpcSpawnDefineEx) — спавн-дефайн, который нужно возродить.

Пример

RegisterRespawn( i4, 1, deleted_def );
RegisterRespawn(deleted_def.respawn_time, 1, deleted_def);

Пример использования

if (myself.i_ai0 == 1 && deleted_def.respawn_time != 0) {
    RegisterRespawn(deleted_def.respawn_time, 1, deleted_def);
}

RegisterOlympiadFieldEventExMAKER🟢 высокая

регистрация мейкера на события арены

Подписывает мейкер (спавнер) на события олимпийской арены, чтобы он получал уведомления
о жизни поля — смене фазы, подготовке боя, смене этапа — и по ним расставлял/убирал бойцов
и декорации. Вызывают один раз при инициализации мейкера, дальше он реагирует на события
арены. Без аргументов, вызывается у мейкера.

Сигнатура

RegisterOlympiadFieldEventEx(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

    RegisterOlympiadFieldEventEx();

Связанное событие: подписывает мейкера на события олимпийской арены — ON_OLYMPIAD_FIELD_CHANGED (смена фазы), ON_OLYMPIAD_GAME_PREPARED (бой подготовлен), ON_OLYMPIAD_FIELD_STEP_CHANGED_EVENT (смена этапа поля) (см. NASC_HANDLERS).

Телепортация и позиция (Teleport / Position)

25 функций

GetRandomPosInCreatureGLOBAL🟢 высокая

случайная точка вокруг существа

Возвращает случайную позицию (объект с полями x/y/z) вокруг существа c на расстоянии от nMinDistance до nMaxDistance. Это типичный способ выбрать точку рядом с игроком для спавна, телепорта или разлёта помощников. Принадлежит глобальному объекту; принимает существо c (CSharedCreatureData), nMinDistance (int) и nMaxDistance (int), возвращает CPosition.

Сигнатура

GetRandomPosInCreature( CSharedCreatureData cCreature, int nMinDistance, int nMaxDistance )

Параметры

cCreature (CSharedCreatureData) — вокруг кого.
nMinDistance (int) — мин. радиус.
nMaxDistance (int) — макс. радиус.

Пример

pos0 = GetRandomPosInCreature(c0, 10, 40);

GetRandomPosInPosGLOBAL🟢 высокая

случайная точка вокруг точки

Возвращает случайную позицию вокруг точки x, y в кольце радиусов от nMinDistance до
nMaxDistance (берёт случайный радиус и угол). Высоту Z функция НЕ задаёт вручную — всегда
прижимает её к рельефу (геодате). Флаг bIsFloating идёт в проверку видимости/проходимости:
единица разрешает «парящие»/воздушные точки (для летающих NPC, над водой/пустотой), ноль
требует нормально достижимую землю. Делает до пяти попыток найти валидную точку; если все
провалились — возвращает исходную точку без изменений. Возвращает CPosition.

Сигнатура

GetRandomPosInPos( int nX, int nY, int nZ, int bIsFloating, int nMinDistance, int nMaxDistance )

Параметры

nX (int) — координата X центра, вокруг которого ищется случайная позиция
nY (int) — координата Y центра, вокруг которого ищется случайная позиция
nZ (int) — координата Z центра, вокруг которого ищется случайная позиция
bIsFloating (int) — флаг учёта «парящей» (воздушной) высоты при выборе позиции
nMinDistance (int) — минимальный радиус кольца, в котором выбирается случайная позиция
nMaxDistance (int) — максимальный радиус кольца, в котором выбирается случайная позиция

Пример

pos0 = GetRandomPosInPos(-209282, -53031, -12295, @FALSE, 20, 350);

GetRandomPosInTerritoryGLOBAL🟢 высокая

случайная точка внутри территории

Возвращает случайную точку внутри именованной территории; nIsFlying задаёт, должна ли позиция быть летающей. Принадлежит глобальному объекту; принимает sTerritoryName (string) и nIsFlying (int), возвращает CPosition.

Сигнатура

GetRandomPosInTerritory( string pwsTerritoryName, int nIsFlying )

Параметры

pwsTerritoryName (string) — имя территории, внутри которой выбирается случайная точка
nIsFlying (int) — флаг, должна ли возвращаемая позиция быть летающей (воздушной)

Пример

pos0 = GetRandomPosInTerritory(TRR_STAR, 0);

GetRandomPosInTerritory2GLOBAL🟢 высокая

случайная точка внутри именованной территории

Выбирает случайную точку внутри именованной территории — удобно, чтобы разбросать спавн или
задать блуждание, не прописывая координаты вручную. Территория задаётся по имени и должна быть
объявлена в npcpos.txt; если её не найти, функция ничего не возвращает и пишет об этом в лог.
nIsFlying говорит, брать ли точку «в воздухе» (для летающих существ) или на земле. Третий
аргумент — строка-метка, которую движок называет «именем AI»: она используется ТОЛЬКО в
сообщении лога при ненайденной территории и на сам выбор точки НЕ влияет. Возвращает готовую
позицию (CPosition), из которой затем берут x/y/z.

Сигнатура

GetRandomPosInTerritory2( string pwsTerritoryName, int nIsFlying, string pwsAiName )

Параметры

    pwsTerritoryName (string) — имя территории (объявлена в npcpos.txt), внутри которой берут случайную точку.
    nIsFlying (int) — брать точку в воздухе (для летающих, 1) или на земле (0).
    pwsAiName (string) — метка для лога (имя вызывающего AI); участвует только в сообщении об ошибке, на выбор точки не влияет.


Пример (иллюстративный):

    GetRandomPosInTerritory2( "", nIsFlying, "" );

InstantTeleportNPC🟢 высокая

мгновенный перенос существа в точку

Мгновенно переносит существо c в заданную точку игрового мира. Принимает существо
(CSharedCreatureData) и три целочисленные координаты x, y, z; namespace у аргументов
нет, возвращаемого значения нет. Самый частый телепорт: увести игрока или его
саммона (через attacker.master) из боя или зоны, доставить к месту события;
сработает на кого угодно — talker, attacker, любое существо.

Сигнатура

InstantTeleport( CSharedCreatureData cCreature, int x, int y, int z )

Параметры

cCreature (CSharedCreatureData) — кого телепортировать.
x (int) — координата X назначения.
y (int) — координата Y.
z (int) — координата Z.

Пример

InstantTeleport( myself.sm, i0, i1, i2 );

Пример использования

if (GetPathfindFailCount() > 10 && speller == myself.top_desire_target && FloatToInt(myself.sm.hp) != FloatToInt(myself.sm.max_hp)) {
    InstantTeleport(myself.sm, FloatToInt(speller.x), FloatToInt(speller.y), FloatToInt(speller.z));
}

InstantTeleportInMyTerritoryNPC🟢 высокая

массовый перенос по территории NPC

Массовый телепорт: переносит всех существ, находящихся на закреплённой за NPC
территории, в точку nPosX, nPosY, nPosZ с разбросом в радиусе nRadius вокруг точки
назначения. Все четыре аргумента целочисленные, namespace нет, значения не
возвращает. Так рейд-боссы собирают или, наоборот, выкидывают игроков из зоны при
сбросе боя.

Сигнатура

InstantTeleportInMyTerritory( int nPosX, int nPosY, int nPosZ, int nRadius )

Параметры

nPosX (int) — X точки назначения.
nPosY (int) — Y точки назначения.
nPosZ (int) — Z точки назначения.
nRadius (int) — радиус разброса/область (уточняется).

Пример

InstantTeleportInMyTerritory(f8_x, f8_y, f8_z, 500);

Пример использования

if ( myself.sm.db_value == 0 && myself.sm.alive == 1 ) {
    InstantTeleportInMyTerritory( 80464, 152294, -3534, 100 );
}

InstantTeleportInMyTerritory2NPC🟢 высокая

вариант массового переноса по территории

Второй вариант «сбора» существ по территории NPC: разом переносит всех, кто сейчас на
закреплённой за NPC территории, в точку (x, y, z), раскидывая их не в одну клетку, а с
разбросом в пределах nRadius вокруг неё, чтобы толпа не слиплась в одну точку. Часто
вызывается в связке через switch — каждому случаю своя точка назначения, так игроков
переставляют между фазами боя или площадками. Ничего не возвращает. От версии без «2»
отличается только тонкостью подбора конечной точки (проверка проходимости); для скриптера
поведение и все четыре аргумента одинаковы.

Сигнатура

InstantTeleportInMyTerritory2( int nPosX, int nPosY, int nPosZ, int nRadius )

Параметры

nPosX (int) — X точки, куда собрать существ.
nPosY (int) — Y точки назначения.
nPosZ (int) — Z точки назначения.
nRadius (int) — радиус разброса вокруг точки: в пределах него существ раскидывает, чтобы не слиплись.

Пример

InstantTeleportInMyTerritory2(-19480, 187344, -5600, 200);

InstantRandomTeleportInMyTerritoryNPC🟢 высокая

телепорт NPC в случайную точку территории

Телепортирует NPC в случайную точку его территории без указания координат — движок
выбирает её сам. Аргументов нет, возвращаемого значения нет. Используется для
«дёрганья» моба по зоне.

Сигнатура

InstantRandomTeleportInMyTerritory(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

InstantRandomTeleportInMyTerritory();

Пример использования

if ( DBPosCheck == 1 && reply == 1 && InMyTerritory( myself.sm ) == 0 ) {
    InstantRandomTeleportInMyTerritory( );
}

TeleportToNPC🟢 высокая

подтянуть одно существо к другому

Телепортирует существо pTarget1 к позиции существа pTarget2 — подтягивает одного к
другому без указания явных координат. Принимает два существа (CSharedCreatureData),
namespace нет, значения не возвращает. Удобно собрать цель к якорю.

Сигнатура

TeleportTo( CSharedCreatureData pTarget1, CSharedCreatureData pTarget2 )

Параметры

pTarget1 (CSharedCreatureData) — кого перемещаем.
pTarget2 (CSharedCreatureData) — к кому (точка назначения = его позиция).

Пример

TeleportTo(myself.sm, myself.c_ai0);
TeleportTo( attacker, attacker.master );
TeleportTo(attacker.master, attacker.master);

TeleportToUserNPC🟢 высокая

перенос существа к игроку

Разновидность TeleportTo, нацеленная на перенос существа c1 к игроку c2 (например,
призвать NPC или питомца к хозяину). Принимает два существа (CSharedCreatureData),
namespace нет, значения не возвращает. Точное различие с TeleportTo не подтверждено.

Сигнатура

TeleportToUser( CSharedCreatureData c, CSharedCreatureData cUser )

Параметры

c (CSharedCreatureData) — кого перемещаем.
cUser (CSharedCreatureData) — к какому игроку (точка назначения = его позиция).

Пример

    TeleportToUser(talker, c0);

Связанное событие: ответ сервера приходит событием TELEPORT_TO_USER_RES (см. NASC_HANDLERS).

TeleportNPC🟢 высокая

классический телепорт-гейткипер с меню назначений

Классический телепорт-гейткипер городов: показывает игроку список назначений
telPosList (тип CTelPosList) с подписями и переносит по выбору. По декомпилю L2NPC
(CNPC::Teleport_4885D0) окно уходит на сервер пакетом opcode 7 формата "cdddSSSSdSd":
после служебных полей идут четыре строки-подписи окна, id предмета-валюты и её
отображаемое имя. Первая строка-подпись — заголовок/имя лавки (ShopName), остальные три
обычно пусты; предпоследний аргумент — валюта оплаты из [item_pch] (в вызовах @adena=57),
последний — её название для показа ("Adena"). Значения не возвращает. Есть расширение
TeleportFStr с локализованными NPC-string подписями.

Сигнатура

Teleport( CSharedCreatureData c, CTelPosList telPosList, string sTitle, string sLabel2, string sLabel3, string sLabel4, int nCurrencyItemId, string sCurrencyName )

Параметры

c (CSharedCreatureData) — игрок.
telPosList (CTelPosList) — список назначений.
sTitle (string) — заголовок/имя окна телепорта (ShopName).
sLabel2 (string) — дополнительная подпись окна (обычно "" / _blank).
sLabel3 (string) — дополнительная подпись окна (обычно "" / _blank).
sLabel4 (string) — дополнительная подпись окна (обычно "" / _blank).
nCurrencyItemId (int) — предмет-валюта оплаты (в вызовах @adena = 57).
    значения — из словаря [item_pch]
sCurrencyName (string) — отображаемое имя валюты ("Adena").

Пример

Teleport( talker, PositionPrimeHours, ShopName, _blank, _blank, _blank, @adena, "Adena" );
Teleport( talker, Position1, ShopName, _blank, _blank, _blank, 57, _blank );
Teleport( talker, Position2, ShopName, _blank, _blank, _blank, 57, _blank );
Teleport( talker, PositionPrimeHours, ShopName, "", "", "", 57, "Adena" );

Пример использования

if ( reply == 3 ) {
    Teleport( talker, Position3, ShopName, "", "", "", 57, MakeFString( 1000308, "", "", "", "", "" ) );
}

TeamInstantTeleportNPC🟢 высокая

телепорт команды события на координаты арены

Телепортирует команду события (по nEventId и nTeamId) в точку x, y, z — для PvP и
событийных арен, чтобы развести команды по стартовым позициям. Все пять аргументов
целочисленные, namespace нет; возвращает результат (число перенесённых или код). Есть
строгая версия TeamInstantTeleportWithConditions с проверками и исключением
неподходящих участников.

Сигнатура

TeamInstantTeleport( int nEventId, int nTeamId, int nX, int nY, int nZ )

Параметры

nEventId (int) — id события.
nTeamId (int) — id команды.
nX (int) — координата X точки, куда телепортируется команда
nY (int) — координата Y точки, куда телепортируется команда
nZ (int) — координата Z точки, куда телепортируется команда

Пример

TeamInstantTeleport(my_Event, 1, 147574, 46717, -3400);
TeamInstantTeleport(my_Event, 1, Return_X, Return_Y, Return_Z );
TeamInstantTeleport(my_Event, 2, Return_X, Return_Y, Return_Z );
TeamInstantTeleport(my_Event, 2, 151496, 46717, -3400);

Пример использования

if ( TeamEventGetStatus( my_Event ) == @TEAMEVENT_STATUS_BATTLE ) { // если евент в режиме боя и игроки на арене
    TeamInstantTeleport( my_Event, 1, Return_X, Return_Y, Return_Z );
    TeamInstantTeleport( my_Event, 2, Return_X, Return_Y, Return_Z );
    InstantTeleportInMyTerritory( Return_X, Return_Y, Return_Z, 50 );
}

TeleportPartyNPC🟢 высокая

телепорт целой группы (party)

Телепортирует членов группы (party) в точку x, y, z. По декомпилю L2NPC собирает atomic-job
и шлёт серверу пакет opcode 14; обработчик (L2Server: AtomicTeleportParty::Do_44BF5C) берёт
позицию лидера партии и перебирает всех членов. Пятый аргумент — фильтр по расстоянию от
лидера: если 0 — телепортируются ВСЕ члены; если больше нуля — только те, кто находится в
пределах этого расстояния от лидера (по прямой). Шестой аргумент — private id, который сервер
проставляет каждому телепортируемому члену (CCreature::SetPrivateID). Возвращает 1.

Сигнатура

TeleportParty( int nPartyId, int x, int y, int z, int nMaxDistFromLeader, int nPrivateId )

Параметры

nPartyId (int) — id телепортируемой группы (party0.id).
x (int) — координата X точки назначения.
y (int) — координата Y точки назначения.
z (int) — координата Z точки назначения.
nMaxDistFromLeader (int) — 0 = телепортировать всех членов; >0 = только членов в пределах
    этого расстояния от лидера партии (в вызовах 0).
nPrivateId (int) — private id, присваиваемый каждому телепортируемому члену (в вызовах 0).

Пример

TeleportParty( party0.id, 113600, -126170, -3512, 0, 0 );

InstantTeleportWithItemNPC🟢 высокая

платный телепорт со списанием предмета

Телепорт за плату: переносит существо c в точку x, y, z, списывая nCount штук
предмета nItemClassId. Принимает существо, три целочисленные координаты, идентификатор
предмета-платы [item_pch] и количество (int64); значения не возвращает. Платный
телепортёр.

Сигнатура

InstantTeleportWithItem( CSharedCreatureData c, int x, int y, int z, int nItemClassId, int64 nCount )

Параметры

c (CSharedCreatureData) — кого телепортировать.
x (int) — координата X точки назначения.
y (int) — координата Y точки назначения.
z (int) — координата Z точки назначения.
nItemClassId (int) — предмет-плата за телепорт.
    значения — из словаря [item_pch]
nCount (int64) — количество списываемого предмета-платы.

Пример

InstantTeleportWithItem(talker, -80684, 149770, -3043, ItemNeeded, 1);
InstantTeleportWithItem(talker, -80749, 149834, -3043, ItemNeeded, 1);

Пример использования

if (OwnItemCount( talker, ItemNeeded ) != 0) {
    InstantTeleportWithItem(talker, -80684, 149770, -3043, ItemNeeded, 1);
    return;
} else {
    ShowPage(talker, fnNoItem);
}

SetTeleportPosOnLostNPC🟢 высокая

точка возврата NPC при потере цели

Задаёт точку x, y, z, куда NPC телепортируется, потеряв цель (при сбросе агро или
выходе за пределы). Принимает три целочисленные координаты, namespace нет, значения
не возвращает. Аналог возврата на точку спауна — настройка поведения при leash.

Сигнатура

SetTeleportPosOnLost( int x, int y, int z )

Параметры

x (int) — координата X точки возврата при потере цели.
y (int) — координата Y точки возврата при потере цели.
z (int) — координата Z точки возврата при потере цели.

Пример

SetTeleportPosOnLost( b03_x1, b03_y1, b03_z1 );
SetTeleportPosOnLost( b03_x2, b03_y2, b03_z2 );
SetTeleportPosOnLost( b03_x3, b03_y3, b03_z3 );
SetTeleportPosOnLost( b03_x4, b03_y4, b03_z4 );

Пример использования

if ( myself.i_ai0 == 1 && InMyTerritory( myself.sm ) == 0 ) {
    SetTeleportPosOnLost( b03_x1, b03_y1, b03_z1 );
    InstantTeleport( myself.sm, b03_x1, b03_y1, b03_z1 );
}

DistFromMeNPC🟢 высокая

расстояние от NPC до существа

Возвращает расстояние от этого NPC до существа c. Это основной инструмент проверки дальности — подпустить или отойти, в радиусе ли каста, не убежала ли цель; результат сравнивают с порогами (меньше трёхсот, не больше полутора тысяч и так далее). Принимает существо c (CSharedCreatureData), возвращает float.

Сигнатура

DistFromMe( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — до кого мерим расстояние.

Пример

f0 = DistFromMe( myself.c_ai1 );
f0 = DistFromMe( c0 );
f0 = DistFromMe(myself.c_quest0);

Пример использования

if ( IsNullCreature( myself.boss ) == 0 && DistFromMe( myself.boss ) > 500 && myself.boss.alive != 0 && myself.p_state != 3 ) {
    InstantTeleport( myself.sm, FloatToInt( myself.boss.x ), FloatToInt( myself.boss.y ), FloatToInt( myself.boss.z ) );
}

PointDistFromMeNPC🟢 высокая

расстояние от NPC до точки

Возвращает расстояние от NPC до произвольной точки x, y, z, а не до существа. Удобно для проверки близости к якорю или зоне, когда в этой точке нет существа. Принимает три float-координаты, возвращает float.

Сигнатура

PointDistFromMe( float x, float y, float z )

Параметры

x (float) — координата X точки, до которой измеряется расстояние от NPC.
y (float) — координата Y точки, до которой измеряется расстояние от NPC.
z (float) — координата Z точки, до которой измеряется расстояние от NPC.

Пример

i6 = FloatToInt( PointDistFromMe( i7, i8, i9 ) );

Пример использования

if (PointDistFromMe(myself.start_x, myself.start_y, myself.start_z) > 10000)
{
    InstantTeleport(myself.sm, myself.start_x, myself.start_y, myself.start_z);
}

StaticObjectDistFromMeNPC🟢 высокая

расстояние до статического объекта

Возвращает расстояние от NPC до статического объекта — двери, осадного флага, артефакта (объект типа CSharedStaticObjectData). Применяется в логике у дверей и тронов. Принимает obj (CSharedStaticObjectData), возвращает float.

Сигнатура

StaticObjectDistFromMe( CSharedStaticObjectData obj )

Параметры

obj (CSharedStaticObjectData) — статический объект (дверь/флаг/артефакт).

Пример

if ( StaticObjectDistFromMe( so0 ) >= 2500 ) {

Пример использования

if ( StaticObjectDistFromMe( so0 ) >= 2500 ) { SayFStr( 1110074, _blank, _blank, _blank, _blank, _blank ); } else
{
    if ( Skill_InReuseDelay( DDMagic ) ) { SayFStr( 1010551, _blank, _blank, _blank, _blank, _blank );  }
    if ( Skill_GetConsumeMP( DDMagic ) < myself.sm.mp && Skill_GetConsumeHP( DDMagic ) < myself.sm.hp && Skill_InReuseDelay( DDMagic ) == 0 ) {
        AddUseSkillDesireExByAction(i0, DDMagic, 0, reply, ask, 1000000, 0, action_id);
    }
}

GetAngleFromTargetNPC🟢 высокая

угол на существо относительно NPC

Возвращает угол на существо c относительно ориентации NPC в клиентских единицах (65536 = 360°). По нему ИИ определяет сектор — спереди, сбоку или сзади: например, диапазон примерно 36864..61440 (202°…337°) означает, что цель сзади-сбоку, что нужно для позиционных умений вроде удара в спину. Принимает существо c (CSharedCreatureData), возвращает int.

Сигнатура

GetAngleFromTarget( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — относительно кого угол.

Пример

i0 = GetAngleFromTarget(creature);

GetDirectionNPC🟢 высокая

направление от NPC к существу

Возвращает направление (heading) от NPC к существу c в клиентских единицах поворота. Используется, чтобы развернуть кого-то лицом в нужную сторону или задать ориентацию при спавне помощников. Принимает существо c (CSharedCreatureData), возвращает int.

Сигнатура

GetDirection( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — на кого направление.

Пример

i0 = GetDirection(myself.sm);
i1 = GetDirection( myself.sm );

GetDirectionToTargetNPC🟢 высокая

направление от NPC к существу

Возвращает направление (heading) от NPC к существу c в клиентских единицах поворота, как и GetDirection; точное различие двух вариантов не подтверждено (вероятно, этот относится к текущей цели агро). Принимает существо c (CSharedCreatureData), возвращает int.

Сигнатура

GetDirectionToTarget( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, направление (heading) к которому возвращается

Пример

CreateOnePrivateEx( @event_its_pig, "ai_event_its_pig", 0, 0, FloatToInt( myself.sm.x ), FloatToInt( myself.sm.y ), FloatToInt( myself.sm.z ), (GetDirectionToTarget( myself.sm ) * 182), myself.i_ai0, 0, 0 );

FindNeighborHeroNPC🟢 высокая

поиск героя поблизости

Ищет в радиусе nDist персонажа со статусом Hero и возвращает его (или null) для особой реакции NPC на присутствие героев поблизости. Результат обычно проверяют через IsNull. Принимает nDist (int), возвращает существо (CSharedCreatureData).

Сигнатура

FindNeighborHero( int nDist )

Параметры

nDist (int) — радиус поиска.

Пример

c3 = FindNeighborHero(4000);

Пример использования

c3 = FindNeighborHero( 4000 );
if ( IsNullCreature( c3 ) == 0 ) {
    BroadcastOnScreenMsgFStr( myself.sm, 4000, 1, 0, 0, 0, 0, 0, 3000, 0, 1000519, c3.name, _blank, _blank, _blank, _blank );
}

InstantTeleportMPCCNPC🟢 высокая

телепортировать всех членов канала

Телепортирует членов командного канала (MPCC) существа к точке x, y, z, распределяя их вокруг
неё. По обработчику L2Server (NpcInstantTeleportMPCC → CMultiPartyCommandChannel::TeleportMPCCToLocation)
сервер: берёт членов канала, раскладывает точки высадки в пределах радиуса разброса вокруг цели,
для каждого проверяет геоданные и подбирает уровень земли (FindGround с +200 по Z, случайный
разброс ±60), и если член уже находится в пределах радиуса — не двигает его. Четвёртый аргумент —
радиус разброса (сравнивается как радиус² с квадратом дистанции; в вызовах 1000/3000). Пятый и
шестой настраивают раскладку точек высадки; при заданной задержке (int64 > 0) телепорт выполняется
отложенно. Возврата нет.

Сигнатура

InstantTeleportMPCC( CSharedCreatureData c, int x, int y, int z, int nRadius, int nLayoutParam1, int nLayoutParam2, int nPrivateId, int64 nDelay )

Параметры

c (CSharedCreatureData) — существо, по чьему командному каналу телепортируют членов.
x (int) — координата X целевой точки.
y (int) — координата Y целевой точки.
z (int) — координата Z целевой точки.
nRadius (int) — радиус разброса вокруг цели: члены раскидываются в его пределах, уже находящиеся
    внутри — не двигаются (в вызовах 1000, 3000).
nLayoutParam1 (int) — параметр раскладки точек высадки (в вызовах 0, 100, 200).
nLayoutParam2 (int) — параметр раскладки точек высадки (в вызовах 200, 300, 500).
nPrivateId (int) — private id, проставляемый телепортируемым членам (в вызовах 0, 57, 3865).
nDelay (int64) — задержка телепортации: >0 включает отложенный телепорт (в вызовах 0 — мгновенно).

Пример

InstantTeleportMPCC( talker, TelPosX, TelPosY, TelPosZ, 3000, 100, 200, 0, 0 );
InstantTeleportMPCC( talker, 179700, 113800, -7709, 1000, 200, 500, 3865, 0 );
InstantTeleportMPCC(talker, TelPosX, TelPosY, TelPosZ, 1000, 100, 200, 0, 0);
InstantTeleportMPCC( talker, 16342, 209557, -9352, 3000, 0, 300, 57, 0 );

InstantTeleportInMyTerritoryWithConditionNPC🟢 высокая

условный телепорт в пределах территории

Массово перемещает существ, находящихся на территории этого NPC, в заданную точку.
Двигаются не все подряд, а отобранные по принадлежности к группе: пара (nType, nCondition)
задаёт фильтр. Кандидат перемещается, только если он в той же инстанс-зоне, что и NPC,
стоит внутри территории NPC и попадает в её диапазон высот. Ничего не возвращает;
применяется в боевых/командных зонах (башни, залы), чтобы разом собрать или, наоборот,
выставить группу игроков. Точка приземления — (x, y) со случайным разбросом в пределах
nRadius (земля подбирается по рельефу).

Сигнатура

InstantTeleportInMyTerritoryWithCondition( int x, int y, int z, int nRadius, int nType, int nCondition )

Параметры

x (int) — координата X целевой точки.
y (int) — координата Y целевой точки.
z (int) — координата Z целевой точки (используется как опорная высота при поиске земли).
nRadius (int) — радиус случайного разброса вокруг точки (в вызовах 200).
nType (int) — режим отбора по группе (какой смысл имеет nCondition):
    1     — переместить ТОЛЬКО членов группы с id = nCondition;
    2     — переместить всех на территории, КРОМЕ членов группы с id = nCondition;
    иное  — переместить всех подряд, nCondition не учитывается.
nCondition (int) — id группы (party id), с которым сверяется принадлежность каждого
    кандидата. В примере это myself.i_quest0, куда заранее записан id группы игрока
    (myself.i_quest0 = party0.id).

Пример

InstantTeleportInMyTerritoryWithCondition( 16110, 243841, 11616, 200, 2, myself.i_quest0 );

// (из c_tower_combat_manager: заранее myself.i_quest0 = party0.id — id группы вошедшего;
//  nType=2 → перекинуть в точку всех на территории, кроме этой группы)

RenewSpawnedPosNPC🟢 высокая

пересчитать позицию спавна

Пересчитывает (обновляет) позицию спавна, например при воскрешении. Принимает
координаты x, y, z, обычно взятые из текущего положения самого NPC. Ничего не
возвращает.

Сигнатура

RenewSpawnedPos( int x, int y, int z )

Параметры

x (int) — новая координата X позиции спавна.
y (int) — новая координата Y позиции спавна.
z (int) — новая координата Z позиции спавна.

Пример

RenewSpawnedPos(FloatToInt(myself.sm.x), FloatToInt(myself.sm.y), FloatToInt(myself.sm.z));

Пример использования

if (timer_id == 7777 && type == 1) {
    RenewSpawnedPos(FloatToInt(myself.sm.x), FloatToInt(myself.sm.y), FloatToInt(myself.sm.z));
} else
if (timer_id == 7787) {
    Despawn();
}

ИНСТАНСЫ И КОМНАТЫ (InstantZone / Room)

14 функций

CreateRoomInfoListGLOBAL🟢 высокая

сформировать список комнат для интерфейса

Создаёт именованный контейнер комнат (список RoomInfoList) в глобальной таблице.
Первый аргумент — имя списка, второй — ёмкость (сколько комнат). Возвращает единицу,
если список создан, и ноль, если список с таким именем уже существует (см. пример —
именно поэтому проверяют результат на ноль). Дальше комнаты адресуют через локальные
слоты обработчика (room0, rlist0 и т. п.).

Сигнатура

CreateRoomInfoList( string sListName, int nCapacity )

Параметры

sListName (string) — имя создаваемого списка комнат
nCapacity (int) — ёмкость списка (число комнат)

Пример

i0 = CreateRoomInfoList(LevelName, 9);

Пример использования

i0 = CreateRoomInfoList(LevelName, 9);
if (i0 == 0) {
}

InstantZone_GetNpcMakerGLOBAL🟢 высокая

найти мейкер внутри инстанса

Находит мейкер внутри инстанса по идентификатору зоны и его имени. Вызывается
глобально (gg); аргументы — идентификатор зоны (от InstantZone_GetId /
GetInZoneID) и имя мейкера; возвращает объект мейкера. Результат проверяют на
пустоту и далее шлют ему событие.

Сигнатура

InstantZone_GetNpcMaker( int nInstZoneId, string sMakerName )

Параметры

nInstZoneId (int) — идентификатор зоны, внутри которой ищут мейкера (InstantZone_GetId()/GetInZoneID())
sMakerName  (string) — имя искомого мейкера

Пример

maker0 = InstantZone_GetNpcMaker( i0, s0 );

Пример использования

maker0 = InstantZone_GetNpcMaker( InstantZone_GetId( ), "godard32_1713_103m1" );
if ( IsNull( maker0 ) == @FALSE ) { SendMakerScriptEvent( maker0, @SPAWN_ALL_INSTANT, 0, 0 ); }

GetRoomInfoListGLOBAL🟢 высокая

список комнат уровня

Возвращает список «комнат» уровня по его имени. Вызывается глобально (gg);
единственный аргумент — имя уровня; комната — это запись о группе, занявшей слот
или копию. Из списка берут комнату по индексу, читают её поля (идентификатор
группы, число участников, время, атомарное состояние) и перебирают участников;
подробнее об объекте комнаты сказано в файле объектов.

Сигнатура

GetRoomInfoList( string sLevelName )

Параметры

sLevelName (string) — имя уровня, список комнат которого запрашивают

Пример

rlist0 = GetRoomInfoList(LevelName);

Пример использования

rlist0 = GetRoomInfoList( LevelName );
if( IsNull( rlist0 ) ) {
    AddTimerEx( timer_id, 10000 );
    return;
}

InstantZone_EnterNPC🟢 высокая

отправить игрока в новый инстанс

Отправляет существо в новый инстанс заданного типа. Вызывается у NPC (myself);
аргументы — само существо (talker), тип зоны и тип входа из [manual_pch]
(@eIZ_ET_*), задающий, кого втягивать: только сам игрок, всю его группу или весь
командный канал (то есть рейд). Тип зоны бывает сырым числом, именованной
константой или берётся прямо из поля игрока — «тот тип, что он уже использует»;
последнее нужно для повторного входа в свою же зону и встречается чаще всего.
Ничего не возвращает.
Связанное событие: ответ приходит событием INSTANT_ZONE_ENTER_RETURNED (см. NASC_HANDLERS).

Сигнатура

InstantZone_Enter( CSharedCreatureData c, int nZoneType, int nEnterType )

Параметры

c (CSharedCreatureData) — кто входит (talker).
nZoneType (int) — тип инстанс-зоны (сырое число, именованная константа или поле игрока — «его тип»).
nEnterType (int) — кого втянуть в инстанс (manual_pch):
    @eIZ_ET_ONLY_ME (0) — только сам игрок; @eIZ_ET_ALL_PARTY (1) — вся его группа;
    @eIZ_ET_COMMAND_CHANNEL (2) — весь командный канал (рейд).

Пример

InstantZone_Enter(talker, i0, @eIZ_ET_ONLY_ME);

Пример использования

if ( zone_type > -1 && enter_type > -1 ) {
    InstantZone_Enter( talker, zone_type, enter_type );
}

InstantZone_LeaveNPC🟢 высокая

вывести игрока из инстанса

Выводит указанное существо из инстанса. Вызывается у NPC (myself); единственный
аргумент — само существо. Ничего не возвращает.

Сигнатура

InstantZone_Leave( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, которое выводят из инстанса

Пример

InstantZone_Leave(c0);

Пример использования

if ( ask == 23000 && reply == 1 ) {
    InstantZone_Leave( talker ); 
}

InstantZone_FinishNPC🟢 высокая

закрыть инстанс

Завершает (закрывает) текущий инстанс с задержкой в секундах. Вызывается у NPC
(myself); единственный аргумент — задержка перед закрытием (в скриптах 0/5/10/15),
которую дают, чтобы игроки успели выйти или прочитать сообщение. Ничего не
возвращает.

Сигнатура

InstantZone_Finish( int nDelay )

Параметры

nDelay (int) — задержка перед закрытием инстанса в секундах

Пример

InstantZone_Finish(5);

Пример использования

if ( InzoneRestriction == 1 || InzoneFinish == 1 ) {
    InstantZone_Finish( 5 );
}

InstantZone_GetIdNPC🟢 высокая

идентификатор текущего инстанса

Возвращает идентификатор текущего инстанса. Вызывается у NPC (myself), без
аргументов; полученный идентификатор затем передают в управление дверями инстанса,
в спавн NPC внутри копии и в поиск мейкера зоны.

Сигнатура

InstantZone_GetId(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

i0 = InstantZone_GetId();
i2 = InstantZone_GetId();
i1 = InstantZone_GetId();
i4 = InstantZone_GetId( );

Пример использования

i2 = InstantZone_GetId( );
if ( c0.instant_zone_id == i2 ) {
    AddMoveToDesire( FloatToInt( c0.x ), FloatToInt( c0.y ), FloatToInt( c0.z ), 100000000 ); 
}

InstantZone_GetDurationNPC🟢 высокая

длительность зоны

Активирует учёт времени жизни текущей инстанс-зоны — включает её таймер длительности.
Несмотря на имя, значения не возвращает (void): в скрипте вызывается для запуска отсчёта зоны,
после чего ставится собственный таймер (AddTimerEx).

Сигнатура

InstantZone_GetDuration(  )

Параметры

(нет — функция вызывается без аргументов)

Пример использования

if (myself.sm.flag != 2) {
    InstantZone_GetDuration();
    AddTimerEx(1002, 60 * 1000);
}

InstantZone_AddExtraDurationNPC🟢 высокая

продлить зону

Продлевает время жизни текущей инстанс-зоны на nExtraSec секунд. Применяется, например, чтобы
дать группе дополнительное время за убийство босса (в скриптах — +600 или +1200 c).

Сигнатура

InstantZone_AddExtraDuration( int nExtraSec )

Параметры

nExtraSec (int) — дополнительное время существования инстанс-зоны, секунд (в вызовах 1200).

Пример использования

if ( InstantZone_ID >= 131 && InstantZone_ID <= 132 ) {
    InstantZone_AddExtraDuration( 1200 );
}

InstantZone_MarkRestrictionNPC🟢 высокая

пометить ограничение зоны

Проставляет игроку/группе пометку об использовании текущей инстанс-зоны — ограничение на
повторный вход, действующее до сброса инстанса. Вызывается, когда для зоны включён режим
ограничения повторного входа.

Сигнатура

InstantZone_MarkRestriction(  )

Параметры

(нет — функция вызывается без аргументов)

Пример использования

if ( InzoneRestriction == 1 ) {
    InstantZone_MarkRestriction( );
}

InstantZone_SendMakerEventNPC🟢 высокая

рассылка события мейкерам инстанс-зоны

Рассылает событие мейкерам (спавнерам) конкретной инстанс-зоны. По декомпилю L2NPC
(CNPC::InstantZone_SendMakerEvent → CNpcMakerDB::InstantZoneEvent_53BB8C) движок находит
мейкера по типу зоны и кластеру, затем для каждого мейкера с совпавшим кодом события
вызывает NpcMakerEx::OnInstantZoneEvent. Прямых вызовов в скриптах нет, но семантика
параметров видна из кода и строк ошибок движка («inzone type… clusterID… event…»).

Сигнатура

InstantZone_SendMakerEvent( int nInzoneType, int nClusterId, int nInzoneId, int nEvent, int nEventArg )

Параметры

    nInzoneType (int) — тип инстанс-зоны (ищется в БД мейкеров; в логе «inzone type»).
    nClusterId (int) — id кластера мейкеров (в логе «clusterID»).
    nInzoneId (int) — id конкретной копии инстанса, которой адресовано событие.
    nEvent (int) — код события для мейкеров; спец-значения: -1 = удалить мейкера зоны,
        -2 = создать мейкера зоны; иначе — код события, рассылаемого совпавшим мейкерам.
    nEventArg (int) — данные/аргумент события, передаётся мейкеру в OnInstantZoneEvent.

Пример (иллюстративный):

    InstantZone_SendMakerEvent( nInzoneType, nClusterId, nInzoneId, nEvent, nEventArg );

InstantZone_GetTypeIdNPC🟢 высокая

тип используемой зоны

Возвращает тип (type id) текущей инстанс-зоны — числовой идентификатор её РАЗНОВИДНОСТИ
из данных инстансов (какой это данж/зал по своему шаблону, а не отдельный экземпляр). Без
аргументов — по инстансу, в котором находится этот NPC. Если NPC не в инстанс-зоне,
возвращает 0. Обычно результат сравнивают с именованной константой типа зоны, чтобы
разветвить поведение под конкретный инстанс.

Типы зон именуются константами @..._IZ_ID_* (значения — в manual_pch нужной хроники). В нашей
хронике, например: @SSQ2_IZ_ID_AZIT_OF_DAWN=113, @SSQ2_IZ_ID_TEMPLE_OF_SILENCE=151,
@SSQ2_IZ_ID_LIB=156, @SSQ2_IZ_ID_HOME_OF_ELCADIA=158, @MDE_IZ_ID=159, @MDE_IZ_ID_HELL=196,
@SSQ25_IZ_ID_HOME_OF_ELCADIA=197. Набор id зависит от хроники и её данных инстансов.

ВНИМАНИЕ: не путать тип зоны (@..._IZ_ID_*) с типом ВХОДА @eIZ_ET_* (ONLY_ME=0, ALL_PARTY=1,
COMMAND_CHANNEL=2) — последний задаёт, кого пускать при входе (аргумент InstantZone_Enter),
и к возвращаемому здесь значению отношения не имеет.

Сигнатура

InstantZone_GetTypeId(  )

Параметры

(нет — функция вызывается без аргументов)

Возвращает

    int — type id разновидности инстанс-зоны (см. @..._IZ_ID_*), либо 0 вне инстанса.


Пример (иллюстративный):

    if ( InstantZone_GetTypeId( ) == @MDE_IZ_ID_HELL ) {
        // ветка поведения для конкретного инстанса
    }

SharedInstantZone_EnterNPC🟢 высокая

вход в инстант-зону по координатам

Запускает вход игрока в инстант-зону и инициирует загрузку подземелья. Принимает
получателя (talker), тип зоны, тип входа и координаты точки входа x, y, z.
Ничего не возвращает.
Связанное событие: ответ приходит событием INSTANT_ZONE_ENTER_RETURNED (см. NASC_HANDLERS).

Сигнатура

SharedInstantZone_Enter( CSharedCreatureData c, int nZoneType, int nEnterType, int x, int y, int z )

Параметры

c (CSharedCreatureData) — существо-получатель входа (talker).
nZoneType (int) — тип инстант-зоны.
nEnterType (int) — кого втянуть в инстанс (manual_pch): @eIZ_ET_ONLY_ME (0) — только игрок,
    @eIZ_ET_ALL_PARTY (1) — вся группа, @eIZ_ET_COMMAND_CHANNEL (2) — весь командный канал.
x (int) — координата X точки входа.
y (int) — координата Y точки входа.
z (int) — координата Z точки входа.

Пример

SharedInstantZone_Enter(talker, nInZoneTypeId, nEnterType, 212866, 179998, -15480);
SharedInstantZone_Enter(talker, nInZoneTypeId, nEnterType, x_start, y_start, z_start);

GetInZoneIDMAKER🟢 высокая

идентификатор зоны мейкера

Возвращает идентификатор зоны, в которой создан мейкер. Вызывается со стороны
мейкера (при удалении NPC), без аргументов; играет ту же роль адреса зоны, что и
InstantZone_GetId.

Сигнатура

GetInZoneID(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

i0 = GetInZoneID( );
i2 = GetInZoneID( );

ДВЕРИ, ВОРОТА И ЗОНЫ (Doors / Gates / Areas)

8 функций

Castle_GateOpenClose2GLOBAL🟢 высокая

открыть или закрыть именованные ворота

Открывает или закрывает именованные ворота или двери замка либо крепости. Первым
аргументом идёт имя двери (строка из параметров скрипта, вроде имени створки или секции
стены), вторым — состояние из словаря [manual_pch]: @CGOC_OPEN=0 означает «открыть», а
@CGOC_CLOSE=1 — «закрыть». Здесь легко ошибиться: ноль открывает, единица закрывает, не
наоборот. Глобальная функция на gg, возвращает int.

Сигнатура

Castle_GateOpenClose2( string sDoorName, int nOpenClose )

Параметры

sDoorName  (string) — имя двери/ворот из данных мира.
nOpenClose (int) — состояние [manual_pch]: @CGOC_OPEN=0 (открыть), @CGOC_CLOSE=1 (закрыть).

Пример

Castle_GateOpenClose2( DoorName1, 0 );

Castle_GateOpenCloseExGLOBAL🟢 высокая

открыть или закрыть ворота внутри инстанса

Расширенная форма предыдущей функции для дверей внутри инстанса. Первые два аргумента те
же — имя двери и состояние из словаря [manual_pch] (@CGOC_OPEN=0 открыть,
@CGOC_CLOSE=1 закрыть), а третьим идёт идентификатор инстанс-зоны, чтобы адресовать
дверь внутри конкретного инстанса. Глобальная функция на gg, возвращает int.

Сигнатура

Castle_GateOpenCloseEx( string sDoorName, int nOpenClose, int nInstZoneId )

Параметры

sDoorName   (string) — имя двери, которой управляют
nOpenClose  (int) — состояние [manual_pch]: @CGOC_OPEN=0 (открыть), @CGOC_CLOSE=1 (закрыть)
nInstZoneId (int) — идентификатор инстанс-зоны, в которой адресуют дверь (InstantZone_GetId())

Пример

Castle_GateOpenCloseEx(DoorName, @CGOC_OPEN, i2);

Пример использования

if ( arena == 4 ) {
    Castle_GateOpenCloseEx( "olympiad_door_301", 0, InstantZone_GetId( ) );
    Castle_GateOpenCloseEx( "olympiad_door_302", 0, InstantZone_GetId( ) );
}

Area_SetOnOffGLOBAL🟢 высокая

включить или выключить именованную область

Включает или выключает именованную область мира. Это зоны-эффекты — территории, которые
дают баф или дебаф, например лечение, усиление или вредные эффекты, а также запрет входа.
Первым аргументом идёт имя зоны из параметров скрипта, вторым — состояние: единица
включает, ноль выключает. Глобальная функция на gg, возвращает int.

Сигнатура

Area_SetOnOff( string sAreaName, int nOnOff )

Параметры

sAreaName (string) — имя зоны-области (из параметров скрипта), которую включают или выключают
nOnOff    (int) — состояние зоны: 1 включает (@AS_ON), 0 выключает

Пример

Area_SetOnOff( areadata_heal1, 0 );

Area_SetOnOffExGLOBAL🟢 высокая

включить или выключить область (расширенная форма)

Расширенная форма управления именованной областью. Первые два аргумента те же — имя зоны
и состояние (единица включает, ноль выключает), а третьим идёт дополнительный параметр.
Глобальная функция на gg, возвращает int.

Сигнатура

Area_SetOnOffEx( string sAreaName, int nOnOff, int nInstZoneId )

Параметры

sAreaName   (string) — имя зоны, которой управляют
nOnOff      (int) — состояние зоны: 1 включает (@AS_ON), 0 выключает
nInstZoneId (int) — идентификатор инстанс-зоны для адресации (InstantZone_GetId())

Пример

Area_SetOnOffEx(AREA_effect_1s_01, @AS_ON, i0);

Пример использования

if ( IsSameString( areadata, "extended_door_trap_area_default" ) == 0 ) {
    Area_SetOnOffEx( areadata, 1, InstantZone_GetId( ) ); 
}

Area_SetBannedTerritoryOnOffGLOBAL🟢 высокая

включить или выключить запретную территорию

Управляет запретной территорией — областью, вход в которую блокируется. Именованная area
содержит список суб-территорий; функция включает/выключает запрет для КОНКРЕТНОЙ суб-территории
по её индексу. По обработчику L2Server (NpcAreaSetBannedTerritoryOnOff → CArea::SetBannedTerritoryOnOff)
третий аргумент — индекс суб-территории в списке area: сервер берёт территорию с этим номером
и переключает её состояние; если индекс выходит за число территорий — ничего не делает.
Глобальная функция на gg, возвращает int.

Сигнатура

Area_SetBannedTerritoryOnOff( string sTerritoryName, int nOnOff, int nTerritoryIndex, int nInstZoneId )

Параметры

sTerritoryName (string) — имя area (набора запретных территорий), которой управляют.
nOnOff         (int) — состояние: 1 включает запрет, 0 снимает.
nTerritoryIndex (int) — индекс суб-территории внутри area (0-based; в вызовах 0, 2, 3, 4;
                      сервер переключает территорию с этим номером, при выходе за границы — no-op).
nInstZoneId    (int) — идентификатор инстанс-зоны (InstantZone_GetId()).

Пример

Area_SetBannedTerritoryOnOff(s0, i1, 0, InstantZone_GetId());

InzoneDoorBreakableGLOBAL🟢 высокая

сделать дверь инстанса ломаемой или неломаемой

Делает именованную дверь инстанс-зоны ломаемой: первым аргументом идёт имя двери,
вторым — идентификатор инстанс-зоны, где эта дверь находится (в вызовах InstantZone_GetId()).
Имя двери валидируется (неверное → ошибка в лог). По декомпилю — тонкий форвардер (опкод 188),
флага «ломаемая/нет» у функции нет. Глобальная функция на gg.

Сигнатура

InzoneDoorBreakable( string sDoorName, int nInstZoneId )

Параметры

sDoorName   (string) — имя двери инстанса, которую делают ломаемой.
nInstZoneId (int) — идентификатор инстанс-зоны, где находится дверь (InstantZone_GetId()).

Пример

InzoneDoorBreakable("gate_of_fortress", InstantZone_GetId());

SetDoorHpLevelNPC🟢 высокая

задать уровень прочности двери

Задаёт «уровень HP» двери в инстанс-зоне: первым аргументом идёт имя двери, вторым —
уровень прочности. Идентификатор текущей инстанс-зоны движок подставляет сам. Отправляет
серверу соответствующую команду. Ничего не возвращает.

Сигнатура

SetDoorHpLevel( string sDoorName, int nHpLevel )

Параметры

sDoorName (string) — имя двери инстанса, для которой задают прочность.
nHpLevel (int) — уровень прочности («HP-уровень») двери.

Пример

SetDoorHpLevel(WallName1, i1);

GetDoorHpLevelNPC🟢 высокая

запросить уровень прочности двери

Запрашивает «уровень HP» двери в инстанс-зоне. Это АСИНХРОННЫЙ запрос (как
IsToggleSkillOnOff): сама функция ничего не возвращает — движок отправляет серверу запрос,
а результат приходит отдельным событием; первый аргумент (адресат) — кому предназначен
ответ, второй — имя двери. Идентификатор инстанс-зоны движок подставляет сам.

Сигнатура

GetDoorHpLevel( CSharedCreatureData c, string sDoorName )

Параметры

c (CSharedCreatureData) — адресат запроса, которому возвращают результат (событием).
sDoorName (string) — имя двери инстанса, прочность которой запрашивают.

Пример

GetDoorHpLevel(talker, WallName1);

ПОЛЕВОЙ ЦИКЛ ТЕРРИТОРИИ (FieldCycle)

7 функций

GetStep_FieldCycleGLOBAL🟢 высокая

чтение текущей фазы цикла

Отдаёт текущую фазу (Step) цикла. Принимает идентификатор цикла nFieldId (параметр класса),
вызывается у глобального объекта gg. Возвращает дискретный номер стадии, который обычно
сравнивают с числом, чтобы решить, что делать дальше.

Сигнатура

GetStep_FieldCycle( int nFieldId )

Параметры

nFieldId (int) — идентификатор цикла (параметр класса), текущую фазу которого запрашивают.

Пример

i1 = GetStep_FieldCycle(3);

Пример использования

i0 = GetStep_FieldCycle( FieldCycle2 );
if ( i0 >= Threshold_Level_Min2 && i0 <= Threshold_Level_Max2 ) {
}

GetPoint_FieldCycleGLOBAL🟢 высокая

чтение накопленного прогресса

Отдаёт текущий прогресс (Point) цикла — счётчик внутри фазы. Принимает идентификатор цикла
nFieldId, вызывается у глобального объекта gg. Возвращает накопленное число очков, которое
сравнивают с порогом перехода.

Сигнатура

GetPoint_FieldCycle( int nFieldId )

Параметры

nFieldId (int) — идентификатор цикла, прогресс которого запрашивают

Пример

i1 = GetPoint_FieldCycle(FieldCycle);

Пример использования

i1 = GetPoint_FieldCycle( FieldCycle );
if ( i0 < Threshold_Min || i0 > Threshold_Max || i1 < Point_Min || i1 > Point_Max ) {
    created_npc.Despawn( );
}

AddPoint_FieldCycleGLOBAL🟢 высокая

накопление прогресса

Добавляет nPoint очков прогресса в цикл nFieldId; nReason — код причины (сырое число, чаще
единица за убийство игроком), c — за кого начисление (последний атакующий или сам менеджер
myself.sm). Вызывается у глобального объекта gg. По достижении порога обычно следует
переключение фазы.

Сигнатура

AddPoint_FieldCycle( int nFieldId, int nPoint, int nReason, CSharedCreatureData cCreature )

Параметры

nFieldId (int) — идентификатор цикла, в который начисляют очки прогресса
nPoint (int) — количество начисляемых очков прогресса
nReason (int) — код причины начисления (сырое число, чаще 1 за убийство игроком)
cCreature (CSharedCreatureData) — существо, за которое начисляют очки (последний атакующий или сам менеджер)

Пример

AddPoint_FieldCycle(1, 5 * 20, 4, talker);

Пример использования

if (i0 == 1) {
    AddPoint_FieldCycle(FieldCycle_ID, FieldCycle_point, 1, myself.sm);
}

SetStep_FieldCycleGLOBAL🟢 высокая

переключение фазы с инициатором

Переводит цикл nFieldId в новую фазу nStep и рассылает событие всем подписанным NPC и
мейкерам — именно так они узнают, что пора менять поведение. Принимает код причины nReason
(сырое число) и инициатора-существо c, вызывается у глобального объекта gg.

Сигнатура

SetStep_FieldCycle( int nFieldId, int nStep, int nReason, CSharedCreatureData cCreature )

Параметры

nFieldId (int) — идентификатор цикла, который переводят в новую фазу
nStep (int) — номер новой фазы цикла
nReason (int) — код причины смены фазы (сырое число)
cCreature (CSharedCreatureData) — существо-инициатор смены фазы

Пример

SetStep_FieldCycle( FieldCycle, 5, 1, c0 );

Пример использования

    if ( i0 == 0 ) {
        SetStep_FieldCycle( RaceCycleID, 1, 8, myself.sm );
    }

Связанное событие: смена фазы рассылает подписчикам ON_FIELD_CYCLE_CHANGED_EVENT(event_id, state, i1); истечение таймера фазы приходит как FIELD_CYCLE_STEP_EXPIRED. Подписка — RegisterFieldCycleEventEx / RegisterAsFieldCycleManager (см. NASC_HANDLERS).

SetStepWithoutActor_FieldCycleGLOBAL🟢 высокая

переключение фазы без инициатора

Парная форма переключения фазы для случая, когда инициатор-существо неизвестно и его не
передают. Принимает идентификатор цикла nFieldId, новую фазу nStep и код причины nReason,
вызывается у глобального объекта gg. Типичная связка: если игрок есть — зовут обычную форму,
иначе форму без актёра.

Сигнатура

SetStepWithoutActor_FieldCycle( int nFieldId, int nStep, int nReason )

Параметры

nFieldId (int) — идентификатор цикла, фазу которого переключают
nStep (int) — новая фаза цикла
nReason (int) — код причины переключения

Пример

    SetStepWithoutActor_FieldCycle( 1, 9, 5 );
    SetStepWithoutActor_FieldCycle( FieldCycle, 5, 1 );
    SetStepWithoutActor_FieldCycle(FieldCycle, 1, 1);
    SetStepWithoutActor_FieldCycle(FieldCycle, 8, 5);

Связанное событие: как и SetStep_FieldCycle, смена фазы рассылает подписчикам ON_FIELD_CYCLE_CHANGED_EVENT; истечение таймера фазы — FIELD_CYCLE_STEP_EXPIRED (см. NASC_HANDLERS).

RegisterAsFieldCycleManagerNPC🟢 высокая

пометка NPC менеджером цикла

Помечает NPC менеджером цикла, давая ему право менять фазу и прогресс. Аргументов нет,
вызывается у NPC (myself), обычно в обработчике создания. Сами события смены фазы — это
«фаза сменилась» и «истёк таймер фазы»; они приходят подписчикам и описаны в файле событий.

Сигнатура

RegisterAsFieldCycleManager(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

    RegisterAsFieldCycleManager();

Связанное событие: менеджер получает события цикла — ON_FIELD_CYCLE_CHANGED_EVENT (смена фазы) и FIELD_CYCLE_STEP_EXPIRED (истёк таймер фазы). Точечная подписка на конкретный цикл — RegisterFieldCycleEventEx (см. NASC_HANDLERS).

RegisterFieldCycleEventExMAKER🟢 высокая

подписка мейкера на события цикла

Подписывает мейкера на события цикла nFieldId: после вызова он получает уведомления о смене
фазы. Вызывается у мейкера (myself), обычно на старте. Возвращаемое значение служебное;
смысл вызова — оформление подписки.

Сигнатура

RegisterFieldCycleEventEx( int nFieldId )

Параметры

nFieldId (int) — идентификатор цикла, на события которого подписывают мейкера.

Пример

RegisterFieldCycleEventEx( 1 );
RegisterFieldCycleEventEx( FieldCycle );
RegisterFieldCycleEventEx( FieldCycle_ID );

Пример использования

    if ( FieldCycle != -1 ) {
        RegisterFieldCycleEventEx( FieldCycle );
    }

Связанное событие: после подписки мейкер получает события цикла — ON_FIELD_CYCLE_CHANGED_EVENT (смена фазы) и FIELD_CYCLE_STEP_EXPIRED (истёк таймер фазы). Фазу меняют SetStep_FieldCycle / SetStepWithoutActor_FieldCycle (см. NASC_HANDLERS).

РЕЧЬ И ОБЪЯВЛЕНИЯ (Say / Chat)

11 функций

AnnounceGLOBAL🟢 высокая

глобальное объявление литеральным текстом

Глобальное объявление от глобального объекта gg, а не от конкретного NPC,
литеральным текстом. Принимает один аргумент sMessage (string) без namespace. Ничего
не возвращает (void).

Сигнатура

Announce( string pStr1 )

Параметры

pStr1 (string) — текст глобального объявления

Пример

Announce("DV");

Пример использования

if ( is_debug ) {
    Announce( "Follower_frintessa: Summoning final form. Start sequence" );
}

AnnounceFStrGLOBAL🟢 высокая

глобальное объявление NPC-string'ом

Глобальное объявление от глобального объекта gg локализованной NPC-string с
параметрами. Принимает nNpcStringId (int) — id строки — и до пяти подстановок p1..p5
(string), без namespace. Ничего не возвращает (void).

Сигнатура

AnnounceFStr( int nArg1, string pStr1, string pStr2, string pStr3, string pStr4, string pStr5 )

Параметры

nArg1 (int) — идентификатор локализованной NPC-string для глобального объявления
pStr1 (string) — первая строковая подстановка в NPC-string (неиспользуемую передают как `_blank`)
pStr2 (string) — вторая строковая подстановка в NPC-string (неиспользуемую передают как `_blank`)
pStr3 (string) — третья строковая подстановка в NPC-string (неиспользуемую передают как `_blank`)
pStr4 (string) — четвёртая строковая подстановка в NPC-string (неиспользуемую передают как `_blank`)
pStr5 (string) — пятая строковая подстановка в NPC-string (неиспользуемую передают как `_blank`)

Пример

AnnounceFStr(1100030, "", "", "", "", "");

Пример использования

if ( IsNullCreature( last_attacker ) == @FALSE ) {
    AnnounceFStr( 3603428, "Antharas", last_attacker.name, _blank, _blank, _blank );
}

SayNPC🟢 высокая

ближняя реплика NPC

NPC произносит реплику (всплывающий текст над головой), видимую локально игрокам
поблизости. Принимает один аргумент sText (string) без namespace; чаще всего внутрь
передают MakeFString(...) с id NPC-string, литеральные строки идут в отладочных
сообщениях. Возвращает int.

Сигнатура

Say( string sText )

Параметры

sText (string) — текст (часто MakeFString(npcStringId, ...)).

Пример

Say( "Amendment. There is not a master" );

Пример использования

if ( c0.is_pc == 1 ) {
    Say( MakeFString( 9858, c0.name, _blank, _blank, _blank, _blank ) );
}

SayFStrNPC🟢 высокая

ближняя реплика NPC-string'ом

То же, что Say(MakeFString(id, p1..p5)), но одним вызовом: произносит локализованную
NPC-string nNpcStringId (int), подставляя до пяти строковых параметров p1..p5
(string), без namespace; неиспользуемые передают как _blank/«». Текст строки по
этому id лежит в fstring.txt хроники. Возвращает int.

Сигнатура

SayFStr( int nArg1, string pStr1, string pStr2, string pStr3, string pStr4, string pStr5 )

Параметры

nArg1 (int) — id локализованной строки клиента.
pStr1 (string) — первая строковая подстановка в локализованную NPC-string (неиспользуемую передают как `_blank`)
pStr2 (string) — вторая строковая подстановка в локализованную NPC-string (неиспользуемую передают как `_blank`)
pStr3 (string) — третья строковая подстановка в локализованную NPC-string (неиспользуемую передают как `_blank`)
pStr4 (string) — четвёртая строковая подстановка в локализованную NPC-string (неиспользуемую передают как `_blank`)
pStr5 (string) — пятая строковая подстановка в локализованную NPC-string (неиспользуемую передают как `_blank`)

Пример

SayFStr(18455, "", "", "", "", "");

Пример использования

if ( c0.is_pc == @TRUE ) {
    SayFStr( 9858, c0.name, _blank, _blank, _blank, _blank ); 
}

SayIntNPC🟢 высокая

реплика числом (отладка)

Произносит репликой NPC числовое значение — отладочный способ вывести число, аналог
Say для чисел. Принимает один аргумент nValue (int64) без namespace. Возвращает int.

Сигнатура

SayInt( int64 nValue )

Параметры

nValue (int64) — число для вывода.

Пример

SayInt(1);

SayFloatNPC🟢 высокая

реплика дробным числом (отладка)

Как SayInt, но для дробного числа: отладочный вывод float репликой NPC. Принимает
один аргумент fValue (float) без namespace. Ничего не возвращает (void).

Сигнатура

SayFloat( float fValue )

Параметры

    fValue (float) — дробное число для вывода.

Пример (иллюстративный):

    SayFloat( 0.0 );

ShoutNPC🟢 высокая

крик NPC на район

Как Say, но с большим радиусом — «крик», слышимый на районе (shout-канал), а не
только вплотную; так боссы объявляют о фазах боя и событиях. Принимает один аргумент
sText (string) без namespace, часто MakeFString(...). Возвращает int.

Сигнатура

Shout( string sText )

Параметры

sText (string) — текст (часто MakeFString(...)).

Пример

Shout( "I'm coming..." );

Пример использования

if ( ShoutMsg1 > 0 ) {
    Shout( MakeFString( ShoutMsg1, _blank, _blank, _blank, _blank, _blank ) );
}

ShoutFStrNPC🟢 высокая

крик NPC-string'ом

«Крик» NPC-string'ом — связка Shout и MakeFString в одном вызове, с радиусом крика.
Принимает nNpcStringId (int) — id локализованной строки (текст по этому id лежит
в fstring.txt хроники) — и до пяти подстановок p1..p5 (string), без namespace.
Возвращает int.

Сигнатура

ShoutFStr( int nNpcStringId, string pStr1, string pStr2, string pStr3, string pStr4, string pStr5 )

Параметры

nNpcStringId (int) — id локализованной строки.
pStr1 (string) — первая строковая подстановка в локализованную NPC-string крика (неиспользуемую передают как `_blank`)
pStr2 (string) — вторая строковая подстановка в локализованную NPC-string крика (неиспользуемую передают как `_blank`)
pStr3 (string) — третья строковая подстановка в локализованную NPC-string крика (неиспользуемую передают как `_blank`)
pStr4 (string) — четвёртая строковая подстановка в локализованную NPC-string крика (неиспользуемую передают как `_blank`)
pStr5 (string) — пятая строковая подстановка в локализованную NPC-string крика (неиспользуемую передают как `_blank`)

Пример

ShoutFStr( 99601, "", "", "", "", "" );

Пример использования

if ( msg_dying > 0 ) {
    ShoutFStr( msg_dying, _blank, _blank, _blank, _blank, _blank ); 
}

ShoutExNPC🟢 высокая

крик с заданным радиусом слышимости

Расширенный вариант крика с явным радиусом слышимости. Текст и радиус уходят на игровой
сервер пакетом opcode 100; обработчик (L2Server: NpcShout → CNPC::Shout_720900) использует
второй аргумент как радиус рассылки крика окружающим (BroadcastToNeighborRect). Движок
ограничивает радиус сверху значением 16384: если передано 0 или больше 16384, берётся 16384.
В вызове = 1500. Ничего не возвращает.

Сигнатура

ShoutEx( string sText, int nRange )

Параметры

sText (string) — текст крика NPC (часто MakeFString(...)).
nRange (int) — радиус слышимости крика в единицах мира (0 или >16384 → движок берёт 16384; в вызове 1500).

Пример

ShoutEx(MakeFString(1000380, "", "", "", "", ""), 1500);

Пример использования

if ( ShoutMsg == 1 ) {
    ShoutEx( MakeFString( 1000457, _blank, _blank, _blank, _blank, _blank ), 11500 );
}

ShoutFStrExNPC🟢 высокая

крик NPC-string'ом с доп. числовым параметром

То же, что ShoutEx («крик» в облачке над NPC, который видят игроки вокруг), только текст
берётся не готовой строкой, а по id локализованной NPC-string, и в неё сразу подставляются
до пяти строковых кусочков. Первый аргумент — id фразы, дальше пять слотов подстановки (в
шаблоне фразы это места-заполнители; неиспользуемые слоты заполняют _blank), последний
аргумент — радиус слышимости в единицах игрового мира: чем он больше, тем дальше от NPC
игроки увидят крик. В вызовах стоит 11500 (крик на большую область вокруг арены) или 3000
(ближний крик у путевой точки). Слишком большой радиус движок подрезает до предела 16384.
Ничего не возвращает. Удобна, когда фраза уже лежит в таблице локализации и её не хочется
собирать вручную через MakeFString.

Сигнатура

ShoutFStrEx( int nNpcStringId, string pStr1, string pStr2, string pStr3, string pStr4, string pStr5, int nRectOffset )

Параметры

nNpcStringId (int) — id локализованной NPC-string, которую крикнет NPC
pStr1 (string) — 1-я подстановка в шаблон фразы (неиспользуемую передают как `_blank`)
pStr2 (string) — 2-я подстановка (неиспользуемую передают как `_blank`)
pStr3 (string) — 3-я подстановка (неиспользуемую передают как `_blank`)
pStr4 (string) — 4-я подстановка (неиспользуемую передают как `_blank`)
pStr5 (string) — 5-я подстановка (неиспользуемую передают как `_blank`)
nRectOffset (int) — радиус слышимости крика в единицах мира: насколько далеко вокруг NPC
    игроки увидят фразу (в вызовах 11500 и 3000; слишком большой движок ограничивает до 16384)

Пример

ShoutFStrEx(1000457, _blank, _blank, _blank, _blank, _blank, 11500);

Пример использования

if ( myself.i_ai1 >= myself.i_ai2 ) { // достигли конца маршрута
    ShoutFStrEx( 12000008, _blank, _blank, _blank, _blank, _blank, 3000 );
    RemoveAllDesire( );
    Despawn( );
    return;
}

GlobalAnnounceNPC🟢 высокая

объявление от лица NPC

Делает объявление от лица NPC с указанием типа канала и текстом — для важных
оповещений (события, осады). Принимает nAnnounceType (int) — тип/канал объявления
(таблица не подтверждена) — и sMessage (string), без namespace. Ничего не возвращает
(void).

Сигнатура

GlobalAnnounce( int nAnnounceType, string sAnnounceMessage )

Параметры

    nAnnounceType (int) — тип/канал объявления (таблица не подтверждена).
    sAnnounceMessage (string) — текст объявления.


Пример (иллюстративный):

    GlobalAnnounce( nAnnounceType, "" );

Диалоги, меню, сообщения (Dialogs / Messages)

12 функций

ShowOnScreenMsgStrGLOBAL🟢 высокая

текст по центру экрана, готовой строкой

Выводит существу c крупный кат-сценовый текст по центру экрана (а не в чат), родственно BroadcastOnScreenMsg*, но адресно одному c. Числовые аргументы между c и строкой задают позицию, тип эффекта, время показа и затухание; sText — сама строка.

Сигнатура

    ShowOnScreenMsgStr( CSharedCreatureData cCreature, int nMsgPosType, int nParam1, int nFontSize, int nParam2, int nParam3, int nEffect, int nTime, int nFade, string sMsg )

Параметры (те же поля пакета ExShowScreenMessage, что у BroadcastOnScreenMsgStr, но без радиуса —
адресно одному существу; подтверждено исходником движка, тип сообщения = 1 «произвольный текст»):
    cCreature   (CSharedCreatureData) — существо, которому показывают экранный текст.
    nMsgPosType (int) — позиция сообщения на экране. В вызовах 2.
    nParam1     (int) — служебное поле пакета (в движке без имени). В вызовах 0.
    nFontSize   (int) — размер шрифта. В вызовах 0.
    nParam2     (int) — служебное поле пакета (в движке без имени). В вызовах 0.
    nParam3     (int) — служебное поле пакета (в движке без имени). В вызовах 0/1.
    nEffect     (int) — визуальный эффект появления текста. В вызовах 0/1.
    nTime       (int) — длительность показа, мс. В вызовах 1000/3000/10000.
    nFade       (int) — эффект затухания. В вызовах 0.
    sMsg        (string) — выводимая строка текста.

Пример

ShowOnScreenMsgStr( c3, 2, 0, 0, 0, 1, 0, 10000, 0, s0 );
ShowOnScreenMsgStr( myself.c_ai1, 2, 0, 0, 0, 1, 0, 1000, 0, " " );
ShowOnScreenMsgStr( attacker, 2, 0, 0, 0, 1, 0, 3000, 0, s0 );
ShowOnScreenMsgStr( talker, 2, 0, 0, 0, 1, 0, 3000, 0, "Exposure" );

Пример использования

if ( IsNullCreature( c3 ) == 0 ) {
    ShowOnScreenMsgStr( c3, 2, 0, 0, 0, 1, 0, 10000, 0, s0 );
}

ShowOnScreenMsgFStrGLOBAL🟢 высокая

текст по центру экрана, по id фразы

То же, что ShowOnScreenMsgStr, но текст задаётся id фразы с подстановками (p1..p5). Числовые аргументы задают позицию, тип эффекта, время показа и затухание.

Сигнатура

    ShowOnScreenMsgFStr( CSharedCreatureData cCreature, int nMsgPosType, int nParam1, int nFontSize, int nParam2, int nParam3, int nEffect, int nTime, int nFade, int nNpcStringId, string p1, string p2, string p3, string p4, string p5 )

Параметры (те же поля, что у ShowOnScreenMsgStr, но текст — не строка, а id фразы npcString
с подстановками p1..p5):
    cCreature    (CSharedCreatureData) — существо, которому показывают экранный текст.
    nMsgPosType  (int) — позиция сообщения на экране. В вызовах 2/5.
    nParam1      (int) — служебное поле пакета (в движке без имени). В вызовах 0.
    nFontSize    (int) — размер шрифта. В вызовах 0.
    nParam2      (int) — служебное поле пакета. В вызовах 0.
    nParam3      (int) — служебное поле пакета. В вызовах 0/1.
    nEffect      (int) — визуальный эффект появления текста. В вызовах 0/1.
    nTime        (int) — длительность показа, мс. В вызовах 4000/5000.
    nFade        (int) — эффект затухания. В вызовах 0.
    nNpcStringId (int) — id фразы (npcString), в которую подставляются p1..p5. В вызовах 36810804.
    p1..p5       (string) — подстановки в фразу по порядку; неиспользуемые передают _blank / "".

Пример

ShowOnScreenMsgFStr(target, 5, 0, 0, 0, 1, 0, 5000, 0, 36810804, _blank, _blank, _blank, _blank, _blank);

Пример использования

if ( myself.sm.param2 == 0 ) {
    ShowOnScreenMsgFStr( myself.c_ai0, 2, 0, 0, 0, 0, 1, 4000, 0, 1801149, "", "", "", "", "" );
}

AddChoiceNPC🟢 высокая

добавить пункт меню выбора (текст-строкой)

Добавляет один пункт в меню выбора диалога NPC: nCode — код, который вернётся при выборе пункта, pwsMsg — текст пункта (обычно MakeFString(fstringId, ...)). После набора пунктов меню показывают через ShowChoicePage.

Сигнатура

AddChoice( int nCode, string pwsMsg )

Параметры

nCode (int) — код, возвращаемый при выборе этого пункта меню
pwsMsg (string) — текст пункта меню

Пример

AddChoice( 0, MakeFString( 15501, _blank, _blank, _blank, _blank, _blank )  );

AddChoiceExNPC🟢 высокая

пункт меню выбора с цветом

То же, что AddChoice, плюс третий аргумент nColor — цвет текста пункта. nCode — код пункта, второй аргумент — текст (строка, обычно MakeFString).

Сигнатура

AddChoiceEx( int nCode, string pwsMsg, int nColor )

Параметры

nCode (int) — код, возвращаемый при выборе этого пункта меню
pwsMsg (string) — текст пункта меню
nColor (int) — цвет текста пункта

Пример

AddChoiceEx( 0, MakeFString( 23402, _blank, _blank, _blank, _blank, _blank ), @qcc_progress );

AddChoiceFStrExNPC🟢 высокая

пункт меню выбора по id фразы, с цветом

Добавляет пункт меню, где текст задаётся сразу id фразы nFstringId (без обёртки MakeFString): nCode — код пункта, nColor — цвет.

Сигнатура

AddChoiceFStrEx( int nCode, int nFstringId, int nColor )

Параметры

nCode (int) — код, возвращаемый при выборе этого пункта меню
nFstringId (int) — id фразы, задающей текст пункта
nColor (int) — цвет текста пункта

Пример

AddChoiceFStrEx(0, 17001551, @QCCE_START);

ShowChoicePageNPC🟢 высокая

показать собранное меню выбора

Выводит игроку cCreature ранее набранное (через AddChoice*) меню выбора. Второй аргумент nOption — режим/номер страницы меню.

Сигнатура

ShowChoicePage( CSharedCreatureData cCreature, int nOpton )

Параметры

cCreature (CSharedCreatureData) — игрок, которому выводят меню выбора
nOpton (int) — режим/номер страницы меню

Пример

ShowChoicePage( talker, 1 );
ShowChoicePage( talker, 0 );
ShowChoicePage(talker,0);

Пример использования

if ( _choiceN > 1 ) {
    ShowChoicePage( talker, 1 );
    return;
}

ShowSystemMessageNPC🟢 высокая

системное сообщение по номеру

Показывает существу c системное сообщение (жёлтая системная строка чата). nSysMsgNo — номер сообщения из клиентской таблицы системных сообщений.

Сигнатура

ShowSystemMessage( CSharedCreatureData cCreature, int nSysMsgNo )

Параметры

cCreature (CSharedCreatureData) — существо, которому показывают системное сообщение
nSysMsgNo (int) — номер системного сообщения из клиентской таблицы

Пример

if (GetInventoryInfo(talker, @IPT_CURRENT_QUEST_SCOUNT) >= (GetInventoryInfo(talker, @IPT_MAX_QUEST_SCOUNT) * 0.9) || GetInventoryInfo(talker, @IPT_CURRENT_WEIGHT) >= (GetInventoryInfo(talker, @IPT_MAX_CARRY_WEIGHT) * 0.9) || GetInventoryInfo(talker, @IPT_CURRENT_SLOT_COUNT) >= (GetInventoryInfo(talker, @IPT_MAX_SLOT_COUNT) * 0.9)) { ShowSystemMessage(talker, 3262); return; }

Пример использования

if ( GetInventoryInfo( talker, @IPT_CURRENT_SLOT_COUNT ) >= ( GetInventoryInfo( talker, @IPT_MAX_SLOT_COUNT ) * 0.800000 ) || GetInventoryInfo( talker, @IPT_CURRENT_WEIGHT ) >= ( GetInventoryInfo( talker, @IPT_MAX_CARRY_WEIGHT ) * 0.800000 ) ) {
    ShowSystemMessage( talker, 1118 );
    return;
}

ShowSystemMessage2NPC🟢 высокая

системное сообщение с подстановками

Показывает существу c системное сообщение nSysMsgNo, подставляя в его шаблон параметры: nParamCount — число подстановок, далее до восьми строк-значений (p1..p8).

Сигнатура

ShowSystemMessage2( CSharedCreatureData cCreature, int nSysMsgNo, int nParamCount, string pwsParam1, string pwsParam2, string pwsParam3, string pwsParam4, string pwsParam5, string pwsParam6, string pwsParam7, string pwsParam8 )

Параметры

cCreature (CSharedCreatureData) — существо, которому показывают системное сообщение
nSysMsgNo (int) — номер системного сообщения из клиентской таблицы
nParamCount (int) — число подставляемых параметров
pwsParam1 (string) — подстановка 1 в шаблон сообщения
pwsParam2 (string) — подстановка 2 в шаблон сообщения
pwsParam3 (string) — подстановка 3 в шаблон сообщения
pwsParam4 (string) — подстановка 4 в шаблон сообщения
pwsParam5 (string) — подстановка 5 в шаблон сообщения
pwsParam6 (string) — подстановка 6 в шаблон сообщения
pwsParam7 (string) — подстановка 7 в шаблон сообщения
pwsParam8 (string) — подстановка 8 в шаблон сообщения

Пример

ShowSystemMessage2(talker, 8373, 1, _blank, _blank, _blank, _blank, _blank, _blank, _blank, _blank);

ShowSystemMessageStrNPC🟢 высокая

системное сообщение готовой строкой

Выводит существу c уже готовую строку sText как системное сообщение (без шаблона из клиентской таблицы).

Сигнатура

ShowSystemMessageStr( CSharedCreatureData cCreature, string sText )

Параметры

cCreature (CSharedCreatureData) — существо, которому показывают системное сообщение
sText     (string) — готовая строка текста сообщения

Пример

ShowSystemMessageStr( talker, s0 );

Пример использования

if (creature.is_pc) {
    ShowSystemMessageStr(creature, MakeFString(1800294, myself.c_ai2.name, "", "", "", ""));
}

ShowSystemMessageFStrNPC🟢 высокая

системное сообщение по id фразы с подстановками

Показывает существу c системное сообщение nSysMsgNo, подставляя до пяти строк-значений (p1..p5) в шаблон фразы.

Сигнатура

ShowSystemMessageFStr( CSharedCreatureData cCreature, int nArg0, string pStr1, string pStr2, string pStr3, string pStr4, string pStr5 )

Параметры

cCreature (CSharedCreatureData) — существо, которому показывают системное сообщение
nArg0 (int) — номер системного сообщения из клиентской таблицы
pStr1 (string) — подстановка 1 в шаблон сообщения
pStr2 (string) — подстановка 2 в шаблон сообщения
pStr3 (string) — подстановка 3 в шаблон сообщения
pStr4 (string) — подстановка 4 в шаблон сообщения
pStr5 (string) — подстановка 5 в шаблон сообщения

Пример

ShowSystemMessageFStr(talker, 1800250, _blank, _blank, _blank, _blank, _blank);

WhisperNPC🟢 высокая

NPC шепчет лично игроку (готовой строкой)

NPC шепчет приватную строку sStr только адресату pTalker (в отличие от Say/Shout, которые слышат окружающие).

Сигнатура

Whisper( CSharedCreatureData pTalker, string sStr )

Параметры

pTalker (CSharedCreatureData) — адресат, которому NPC шепчет приватно
sStr (string) — шепчемая строка текста

Пример

Whisper(creature, "status " + s0);

WhisperFStrNPC🟢 высокая

NPC шепчет лично по id NPC-string

То же, что Whisper, но текст задаётся id NPC-string (nNpcStringId) с подстановками (p1..p5); адресат — c.

Сигнатура

WhisperFStr( CSharedCreatureData cCreature, int nNpcStringId, string pStr1, string pStr2, string pStr3, string pStr4, string pStr5 )

Параметры

cCreature (CSharedCreatureData) — адресат, которому NPC шепчет приватно
nNpcStringId (int) — id NPC-string, задающий текст шёпота
pStr1 (string) — подстановка 1 в шаблон текста
pStr2 (string) — подстановка 2 в шаблон текста
pStr3 (string) — подстановка 3 в шаблон текста
pStr4 (string) — подстановка 4 в шаблон текста
pStr5 (string) — подстановка 5 в шаблон текста

Пример

WhisperFStr( c0, 60018, _blank, _blank, _blank, _blank, _blank );

Пример использования

if ( myself.i_ai1 == 2 ) {
    WhisperFStr( c0, 60020, _blank, _blank, _blank, _blank, _blank );
    SendScriptEvent( myself.sm, 45702, 0 );
}

ДИАЛОГОВЫЕ HTML-ОКНА (FHTML)

7 функций

ShowPageNPC🟢 высокая

показать готовую html-страницу

Показывает игроку готовую HTML-страницу по имени .htm-файла без каких-либо
подстановок. Принимает кому показать (обычно talker) и имя html-файла; ничего не
возвращает. Самый частый способ выдать реплику или меню NPC; имя файла нередко хранят
в переменной.
Связанное событие: выбор пункта html-меню приходит событием MENU_SELECTED(talker, ask, reply) (см. NASC_HANDLERS).

Сигнатура

ShowPage( CSharedCreatureData cCreature, string pwsPage )

Параметры

cCreature (CSharedCreatureData) — кому показать (обычно talker).
pwsPage (string) — имя html-файла.

Пример

ShowPage( talker, fnHi );

Пример использования

if ( talker.level >= 46 && talker.level < 52 ) {
    ShowPage( talker, "reflect_weapon_c.htm" );
}

FHTML_SetFileNameNPC🟢 высокая

задать шаблон окна

Задаёт буферу окна html-шаблон, в который дальше будут подставляться значения. Это
первый шаг построения динамического окна. Принимает буфер окна (обычно fhtml0) и имя
html-шаблона; ничего не возвращает.

Сигнатура

FHTML_SetFileName( CFHTML fhtml, string sFileName )

Параметры

fhtml     (CFHTML) — буфер окна (обычно fhtml0).
sFileName (string) — имя html-шаблона.

Пример

FHTML_SetFileName(fhtml0, s0 );

Пример использования

if ( ask == -201 ) {
    FHTML_SetFileName( fhtml0, "map_agit_" + fnAgitMap + ".htm" );
    ShowFHTML( talker, fhtml0 );
}

FHTML_SetStrNPC🟢 высокая

подставить строку в шаблон

Подставляет в шаблон строковое значение на место плейсхолдера с заданным ключом.
Принимает буфер окна, имя плейсхолдера и подставляемую строку; ничего не возвращает.
Передача _blank очищает поле — этим часто пользуются, чтобы скрыть кнопку или блок.

Сигнатура

FHTML_SetStr( CFHTML fhtml, string sKey, string sValue )

Параметры

fhtml  (CFHTML) — буфер окна.
sKey   (string) — имя плейсхолдера.
sValue (string) — подставляемая строка.

Пример

FHTML_SetStr( fhtml0, "HP" + "Reset", _blank );

Пример использования

if ( IsNull( pledge0 ) == 0 ) {
    FHTML_SetStr( fhtml0, "pledge0", pledge0.name );
    FHTML_SetStr( fhtml0, "p_member_count0", IntToStr( i1 ) );
}

FHTML_SetIntNPC🟢 высокая

подставить целое число

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

Сигнатура

FHTML_SetInt( CFHTML fhtml, string sKey, int64 nValue )

Параметры

fhtml  (CFHTML) — буфер окна.
sKey   (string) — имя плейсхолдера.
nValue (int64) — подставляемое целочисленное значение для плейсхолдера

Пример

FHTML_SetInt( fhtml0, "quest_id", @black_swan );

Пример использования

if ( Agit_GetDecoLevel( decotype_hpregen ) == 0 ) {
    FHTML_SetInt( fhtml0, "HPDepth", 0 );
} else {
    FHTML_SetInt( fhtml0, "HPDepth", ( Agit_GetDecoLevel( decotype_hpregen ) * 20 ) );
}

FHTML_SetFloatNPC🟢 высокая

подставить дробное число

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

Сигнатура

FHTML_SetFloat( CFHTML fhtml, string sKey, float fValue )

Параметры

    fhtml  (CFHTML) — буфер диалогового окна (`fhtml0`), в который идёт подстановка
    sKey   (string) — имя плейсхолдера, на место которого подставляется значение
    fValue (float) — подставляемое дробное значение для плейсхолдера

Пример (иллюстративный):

    FHTML_SetFloat( fhtml0, "", 0.0 );

FHTML_SetFStrNPC🟢 высокая

подставить локализованную строку с параметрами

Подставляет на место плейсхолдера локализованную NPC-string по её идентификатору с
пятью строковыми параметрами — то же, что собрать строку из идентификатора и вставить
её, но в один вызов. Принимает буфер окна, имя плейсхолдера, id локализованной строки
и пять подстановок; ничего не возвращает. Для локализованных подписей и кнопок в окне.

Сигнатура

FHTML_SetFStr( CFHTML pfhtml, string pStr1, int nArg1, string pStr2, string pStr3, string pStr4, string pStr5, string pStr6 )

Параметры

pfhtml (CFHTML) — буфер окна.
pStr1 (string) — имя плейсхолдера.
nArg1 (int) — id локализованной строки.
pStr2 (string) — первая строковая подстановка в локализованную строку
pStr3 (string) — вторая строковая подстановка в локализованную строку
pStr4 (string) — третья строковая подстановка в локализованную строку
pStr5 (string) — четвёртая строковая подстановка в локализованную строку
pStr6 (string) — пятая строковая подстановка в локализованную строку

Пример

FHTML_SetFStr( fhtml0, "QuizString", 1010635, "", "", "", "", "" );

Пример использования

if (GetAbnormalLevel(talker, Skill_GetAbnormalType(buff1)) >= Skill_GetAbnormalLevel(buff1)) { FHTML_SetStr(fhtml0, "bypass_buff1", _blank); FHTML_SetFStr(fhtml0, "button_type1", 36810606, _blank, _blank, _blank, _blank, _blank); }
else { FHTML_SetStr(fhtml0, "bypass_buff1", "bypass -h menu_select?ask=-301&reply=1"); FHTML_SetFStr(fhtml0, "button_type1", 36810605, _blank, _blank, _blank, _blank, _blank); }

ShowFHTMLNPC🟢 высокая

показать собранное окно

Показывает игроку собранное окно из буфера — финальный шаг динамического окна после
задания шаблона и серии подстановок. Принимает кому показать и заполненный буфер окна;
ничего не возвращает.

Сигнатура

ShowFHTML( CSharedCreatureData cCreature, CFHTML fhtml )

Параметры

cCreature (CSharedCreatureData) — кому показать.
fhtml     (CFHTML) — заполненный буфер окна.

Пример

ShowFHTML( talker, fhtml0 );

Пример использования

if ( i8 != 4 ) {
    ShowFHTML( talker, fhtml0 );
} else {
    ShowPage( talker, "master_lv3_hef_07.htm" );
}

СОБЫТИЯ И РАССЫЛКИ (Events / Broadcast)

13 функций

SendScriptEventGLOBAL🟢 высокая

адресное событие конкретному существу

Отправляет скрипт-событие конкретному существу/NPC c адресно, а не
широковещательно. Принимает CSharedCreatureData c, int nEventId и int nParam (без
namespace), возвращает int (видимо, признак доставки/обработки). Используется для
связи «мастер → его миньоны».
Связанное событие: адресат ловит SCRIPT_EVENT; SendMakerScriptEvent → мейкер ON_SCRIPT_EVENT (см. NASC_HANDLERS).

Сигнатура

SendScriptEvent( CSharedCreatureData cCreature, int nEventId, int nParam )

Параметры

cCreature (CSharedCreatureData) — адресат события (в вызовах c0/c1/c4).
nEventId  (int) — код события: константа @SCE_* либо произвольное число, заданное скриптом
                  (не фиксированный enum; адресат ловит его в обработчике SCRIPT_EVENT).
nParam    (int) — данные (часто индекс существа из GetIndexFromCreature).

Пример

SendScriptEvent( c1, @SCE_MPCC_ID, i0 );

Пример использования

if ( myself.i_ai1 > 135 ) {
    SendScriptEvent( myself.c_ai2, 0, 0 );
}

SendScriptEventExGLOBAL🟢 высокая

адресное событие с двумя полями данных

Адресная версия события с двумя полями данных для конкретного существа. Принимает
CSharedCreatureData c, int nEventId, int nParam2 и int nParam3 (без namespace),
возвращает int.
Связанное событие: адресат ловит SCRIPT_EVENT; SendMakerScriptEvent → мейкер ON_SCRIPT_EVENT (см. NASC_HANDLERS).

Сигнатура

SendScriptEventEx( CSharedCreatureData cCreature, int nEventId, int nParam2, int nParam3 )

Параметры

cCreature (CSharedCreatureData) — существо-получатель события
nEventId  (int) — код события: @SCE_* либо произвольное число (не фиксированный enum)
nParam2   (int) — первое поле полезных данных события
nParam3   (int) — второе поле полезных данных события

Пример

SendScriptEventEx(c0, @AI_MONSTER_ELITE_START, GetIndexFromCreature(myself.sm), 0);

SendMakerScriptEventGLOBAL🟢 высокая

адресное событие спавнеру

Отправляет событие с двумя полями данных спавнеру (CNpcMakerEx), чтобы управлять
волнами спавна — например, запустить следующую волну. Принимает CNpcMakerEx maker,
int nEventId, int nParam2 и int nParam3 (без namespace), возвращает int. Для
территориальных войн существует родственная разновидность SendDominiSCRIPT_EVENT.

Сигнатура

SendMakerScriptEvent( CNpcMakerEx maker, int nEventId, int nParam2, int nParam3 )

Параметры

maker    (CNpcMakerEx) — спавнер-получатель события, управляющий волнами спавна
nEventId (int) — код события: @SCE_* либо произвольное число (не фиксированный enum)
nParam2  (int) — первое поле полезных данных события
nParam3  (int) — второе поле полезных данных события

Пример

SendMakerScriptEvent( maker0, 0, 0, 0 );

Пример использования

if ( IsNull( maker0 ) == 0 ) {
    SendMakerScriptEvent( maker0, 1001, 0, 0 );
}

BroadcastOnScreenMsgFStrGLOBAL🟢 высокая

экранное сообщение локализованной строкой

Выводит крупный текст прямо на экране (не в чате, а поверх картинки) всем игрокам
вокруг источника. Текст берётся по номеру готовой (локализованной) фразы nNpcStringId,
её места для подстановок заполняются строками sStr1..sStr5. Где именно появится надпись
(nMsgPosType), сколько будет висеть (nTime, мс) и с каким эффектом появления/затухания —
задаётся числовыми параметрами. Применяется для драматичных оповещений: появление
босса, смена фазы события. Ничего не возвращает.

Сигнатура

BroadcastOnScreenMsgFStr( CSharedCreatureData c, int nRange, int nMsgPosType, int nParam1, int nFontSize, int nParam2, int nParam3, int nEffect, int nTime, int nFade, int nNpcStringId, string sStr1, string sStr2, string sStr3, string sStr4, string sStr5 )

Параметры

c (CSharedCreatureData) — существо-источник; вокруг него отмеряется круг, чьи игроки увидят надпись
nRange (int) — радиус видимости в игровых единицах: насколько далеко от источника ещё показывается текст (максимум 16384; 0 — минимальный охват у самого источника)
nMsgPosType (int) — куда на экране поставить надпись (кодовое обозначение зоны экрана; в вызовах 1 и 2)
nParam1 (int) — служебное поле вывода (в вызовах 0)
nFontSize (int) — размер шрифта (0 — размер по умолчанию)
nParam2 (int) — служебное поле вывода (в вызовах 0)
nParam3 (int) — служебное поле вывода (в вызовах 0)
nEffect (int) — эффект появления надписи (0 — без эффекта, 1 — с эффектом)
nTime (int) — сколько времени держать надпись на экране, миллисекунды (в вызовах 3000 и 10000)
nFade (int) — плавное затухание при исчезновении (0 — выключено)
nNpcStringId (int) — номер готовой (локализованной) фразы, которую показать
sStr1 (string) — первая строковая подстановка в фразу (например, имя цели)
sStr2 (string) — вторая строковая подстановка
sStr3 (string) — третья строковая подстановка
sStr4 (string) — четвёртая строковая подстановка
sStr5 (string) — пятая строковая подстановка

Пример

BroadcastOnScreenMsgFStr(myself.sm, 8000, 2, 0, 0, 0, 0, 1, 10000, 0, 1100223, "", "", "", "", "");

Пример использования

if ( IsNullCreature( c3 ) == 0 ) {
    BroadcastOnScreenMsgFStr( myself.sm, 4000, 1, 0, 0, 0, 0, 0, 3000, 0, 1000519, c3.name, _blank, _blank, _blank, _blank );
}

BroadcastOnScreenMsgStrGLOBAL🟢 высокая

экранное сообщение произвольной строкой

Выводит крупный текст на экране игрокам в радиусе произвольной строкой. Функция —
тонкий форвардер: NPC-сервер проверяет радиус и пересылает поля главному серверу,
который строит клиентский пакет ExShowScreenMessage. Позиция, размер шрифта, эффект,
время показа и затухание задаются числовыми параметрами (подтверждено исходником движка).

Сигнатура

    BroadcastOnScreenMsgStr( CSharedCreatureData cCreature, int nRange, int nMsgPosType, int nParam1, int nFontSize, int nParam2, int nParam3, int nEffect, int nTime, int nFade, string sMsg )

Параметры (подтверждено исходником движка — обработчик экранного сообщения строит клиентский
пакет ExShowScreenMessage; тип сообщения фиксирован = 1 «произвольный текст»):
    cCreature   (CSharedCreatureData) — существо-источник; его id — получатель, а позиция — центр рассылки.
    nRange      (int) — радиус рассылки; проверяется на стороне NPC-сервера (0..16384). В вызовах 4000.
    nMsgPosType (int) — позиция сообщения на экране. В вызовах 2.
    nParam1     (int) — служебное поле пакета (в движке без собственного имени, nParam1). В вызовах 0.
    nFontSize   (int) — размер шрифта. В вызовах 0 (по умолчанию).
    nParam2     (int) — служебное поле пакета (в движке без собственного имени, nParam2). В вызовах 0.
    nParam3     (int) — служебное поле пакета (в движке без собственного имени, nParam3). В вызовах 0.
    nEffect     (int) — визуальный эффект появления текста. В вызовах 1.
    nTime       (int) — длительность показа на экране, мс. В вызовах 3000.
    nFade       (int) — эффект затухания (плавного исчезновения). В вызовах 0.
    sMsg        (string) — выводимый текст.

Пример

BroadcastOnScreenMsgStr( myself.sm, 4000, 2, 0, 0, 0, 0, 1, 3000, 0, MakeFString( 1000527, _blank, _blank, _blank, _blank, _blank ) );

BroadcastOnScreenNpcStringGLOBAL🟢 высокая

экранное сообщение по NPC-string

То же, что BroadcastOnScreenMsgFStr: крупный текст поверх экрана всем игрокам вокруг
источника, с той же раскладкой числовых полей (место надписи, эффект появления, время
показа, затухание). Разница только в источнике текста — здесь фраза берётся из набора
строк NPC по её номеру nNpcStringId, с подстановками sStr1..sStr5. Ничего не возвращает.

Сигнатура

BroadcastOnScreenNpcString( CSharedCreatureData c, int nRange, int nMsgPosType, int nParam1, int nFontSize, int nParam2, int nParam3, int nEffect, int nTime, int nFade, int nNpcStringId, string sStr1, string sStr2, string sStr3, string sStr4, string sStr5 )

Параметры

c (CSharedCreatureData) — существо-источник; вокруг него отмеряется круг, чьи игроки увидят надпись
nRange (int) — радиус видимости в игровых единицах: насколько далеко от источника ещё показывается текст (максимум 16384)
nMsgPosType (int) — куда на экране поставить надпись (кодовое обозначение зоны экрана; в вызовах 2)
nParam1 (int) — служебное поле вывода (в вызовах 0)
nFontSize (int) — размер шрифта (0 — размер по умолчанию)
nParam2 (int) — служебное поле вывода (в вызовах 0)
nParam3 (int) — служебное поле вывода (в вызовах 0)
nEffect (int) — эффект появления надписи (0 — без эффекта, 1 — с эффектом)
nTime (int) — сколько времени держать надпись на экране, миллисекунды (в вызовах 10000)
nFade (int) — плавное затухание при исчезновении (0 — выключено)
nNpcStringId (int) — номер строки NPC, которую показать
sStr1 (string) — первая строковая подстановка в фразу (например, имя игрока)
sStr2 (string) — вторая строковая подстановка
sStr3 (string) — третья строковая подстановка
sStr4 (string) — четвёртая строковая подстановка
sStr5 (string) — пятая строковая подстановка

Пример

BroadcastOnScreenNpcString( myself.sm, 16384, 2, 0, 0, 0, 0, 1, 10000, 0, 1100292, talker.name, _blank, _blank, _blank, _blank );

MakeAttackEventNPC🟢 высокая

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

Инициирует боевую реакцию NPC на существо c так, будто оно нанесло урон dDamage:
добавляет ненависть и запускает атаку. Принимает CSharedCreatureData c, float
dDamage и int nIsParty (без namespace), ничего не возвращает; при nIsParty=1 агро
распространяется на всю группу цели, при 0 — только на саму цель.

Сигнатура

MakeAttackEvent( CSharedCreatureData cCreature, float dDamage, int nIsParty )

Параметры

cCreature (CSharedCreatureData) — цель боевой реакции.
dDamage (float) — вес «урона»/ненависти.
nIsParty (int) — 1 = на всю пати цели, 0 = только на цель.

Пример

MakeAttackEvent(c1, 100, 0);

Пример использования

if ( i0 == 1 ) {
    MakeAttackEvent( h0.creature, 100, 0 );
}

BroadcastScriptEventNPC🟢 высокая

широковещательное событие в радиусе

Рассылает скрипт-событие nEventId с данными nParam всем NPC в радиусе nDist,
каждый получатель обрабатывает его в SCRIPT_EVENT. Принимает int nEventId, int
nParam и int nDist (без namespace), ничего не возвращает. Классика — позвать на
помощь: «на меня напали, цель — вот этот индекс».
Связанное событие: адресаты ловят SCRIPT_EVENT(script_event_arg1..3) (см. NASC_HANDLERS).

Сигнатура

BroadcastScriptEvent( int nParam1, int nParam2, int nDist )

Параметры

nParam1 (int) — id события (скрипт-константа).
nParam2 (int) — данные (часто GetIndexFromCreature(attacker)).
nDist (int) — радиус рассылки.

Пример

BroadcastScriptEvent( @NAVIT_DESPAWN2, 0, 500 );

Пример использования

if ( myself.top_desire_target == attacker ) {
    BroadcastScriptEvent( 10016, GetIndexFromCreature( attacker ), 300 );
}

BroadcastScriptEventExNPC🟢 высокая

широковещательное событие с двумя полями данных

Расширенная версия широковещательного события, несущая два поля данных nParam2 и
nParam3. Принимает int nEventId, int nParam2, int nParam3 и int nDist (без
namespace), ничего не возвращает.
Связанное событие: адресаты ловят SCRIPT_EVENT(script_event_arg1..3) (см. NASC_HANDLERS).

Сигнатура

BroadcastScriptEventEx( int nParam1, int nParam2, int nParam3, int nDist )

Параметры

nParam1 (int) — id события.
nParam2 (int) — данные 1.
nParam3 (int) — данные 2.
nDist (int) — радиус рассылки.

Пример

BroadcastScriptEventEx(@SCE_PHASE_END, 1, 0, 4000);

Пример использования

if ( i2 != NumberOfCircle ) {
    BroadcastScriptEventEx( i2, 30003, 0, 10000 );
}

BroadcastScriptEventCondNPC🟢 высокая

широковещательное событие с условием

Та же расширенная рассылка с двумя полями данных, дополнительно фильтрующая
получателей по условию (вероятно, по типу/состоянию NPC); точный смысл различий не
подтверждён. Принимает int nEventId, int nParam2, int nParam3 и int nDist (без
namespace), ничего не возвращает.
Связанное событие: адресаты ловят SCRIPT_EVENT(script_event_arg1..3) (см. NASC_HANDLERS).

Сигнатура

BroadcastScriptEventCond( int nParam1, int nParam2, int nParam3, int nDist )

Параметры

nParam1 (int) — идентификатор рассылаемого события (код события)
nParam2 (int) — первое поле полезных данных события
nParam3 (int) — второе поле полезных данных события
nDist (int) — радиус рассылки: дистанция, в пределах которой получают событие

Пример

BroadcastScriptEventCond(@SCE_BELETH_DESPAWN, 0, 0, 4000);

BroadcastSystemMessageNPC🟢 высокая

системное сообщение по id в радиусе

Рассылает системное сообщение по идентификатору nSysMsgId игрокам в радиусе nDist
(строка системного чата). Принимает CSharedCreatureData c, int nSysMsgId и int
nDist (без namespace), возвращает int.

Сигнатура

BroadcastSystemMessage( CSharedCreatureData cCreature, int nSysMsgId, int nDist )

Параметры

cCreature (CSharedCreatureData) — существо-источник, относительно которого определяется радиус рассылки
nSysMsgId (int) — идентификатор системного сообщения для показа
nDist     (int) — радиус рассылки: дистанция (0..16384), в пределах которой видят сообщение

Пример

BroadcastSystemMessage(myself.sm, 0, 6503);

Пример использования

if ( GetSSQSealOwner( 1 ) == 1 ) {
    BroadcastSystemMessage( myself.sm, 0, 1215 );
}

BroadcastSystemMessageStrNPC🟢 высокая

системное сообщение произвольной строкой

Показывает системное сообщение (строка в системном чате) с произвольным текстом
sText всем игрокам вокруг источника. Сообщение видят те, кто находится в пределах
радиуса nDist от существа-источника; за этим кругом текст не приходит. Текст обычно
готовят заранее — через MakeFString с подстановками — и передают уже собранной
строкой. Применяется для оповещений «на весь двор»: поздравлений, объявлений о ходе
события. Ничего не возвращает.

Сигнатура

BroadcastSystemMessageStr( CSharedCreatureData cCreature, int nDist, string sText )

Параметры

cCreature (CSharedCreatureData) — существо-источник; вокруг него отмеряется круг, чьи игроки получат сообщение
nDist     (int) — радиус слышимости в игровых единицах: насколько далеко от источника ещё видно сообщение (максимум 16384; 0 — минимальный охват у самого источника)
sText     (string) — готовый текст сообщения (произвольная строка либо результат MakeFString)

Пример

BroadcastSystemMessageStr(myself.sm, 8000, s0);
BroadcastSystemMessageStr(myself.sm, 0, "Wow! " + myself.master.name + " " + s1 + "!" );
BroadcastSystemMessageStr(myself.sm, 0, MakeFString(1900027, c0.name, "", "", "", ""));
BroadcastSystemMessageStr(myself.sm, 2000, MakeFString(1800881, "", "", "", "", ""));

Пример использования

if (i0 <= i1) {
    BroadcastSystemMessageStr(myself.sm, range_to_yell, MakeFString(yell_congratz01, myself.c_ai0.name, "", "", "", ""));
    BroadcastOnScreenMsgStr(myself.sm, range_to_yell, 5, 0, 1, 3, 1, 1, 5000, 0, MakeFString(yell_congratz01, myself.c_ai0.name, "", "", "", ""));
} else {
    BroadcastSystemMessageStr(myself.sm, range_to_yell, MakeFString(yell_congratz02, myself.c_ai0.name, "", "", "", ""));
    BroadcastOnScreenMsgStr(myself.sm, range_to_yell, 5, 0, 1, 3, 1, 1, 5000, 0, MakeFString(yell_congratz02, myself.c_ai0.name, "", "", "", ""));
}

BroadcastSystemMessageFStrNPC🟢 высокая

локализованное системное сообщение с параметрами

То же, что BroadcastSystemMessageStr, но текст берётся не произвольной строкой, а по
номеру готовой (уже переведённой) фразы nNpcStringId. В этой фразе есть места для
подстановок — их заполняют строками pStr1..pStr5 (имя цели, число и т.п.); лишние
оставляют пустыми. Сообщение показывается системной строкой всем игрокам в пределах
радиуса nDist от источника. Ничего не возвращает.

Сигнатура

BroadcastSystemMessageFStr( CSharedCreatureData cCreature, int nDist, int nNpcStringId, string pStr1, string pStr2, string pStr3, string pStr4, string pStr5 )

Параметры

cCreature (CSharedCreatureData) — существо-источник; вокруг него отмеряется круг, чьи игроки получат сообщение
nDist (int) — радиус слышимости в игровых единицах: насколько далеко от источника ещё видно сообщение (максимум 16384)
nNpcStringId (int) — номер готовой (локализованной) фразы, которую показать
pStr1 (string) — первая строковая подстановка в шаблон (вместо [p1])
pStr2 (string) — вторая строковая подстановка (вместо [p2])
pStr3 (string) — третья строковая подстановка (вместо [p3])
pStr4 (string) — четвёртая строковая подстановка (вместо [p4])
pStr5 (string) — пятая строковая подстановка (вместо [p5])

Пример

BroadcastSystemMessageFStr(myself.sm, 1500, Message_ID, "", "", "", "", "");
BroadcastSystemMessageFStr(myself.sm, 1500, 1100153, "", "", "", "", "");
BroadcastSystemMessageFStr(myself.sm, 1500, 1100139, "", "", "", "", "");
BroadcastSystemMessageFStr(myself.sm, 1500, i4, target.name, IntToStr(i5), "", "", "");

Пример использования

if ( NeedShoutSA ) {
    BroadcastSystemMessageFStr( myself.sm, 2500, i4, target.name, IntToStr( i5 ), _blank, _blank, _blank );
}

ГРУППЫ И КЛАНЫ (Party / Pledge)

24 функций

GetPartyGLOBAL🟢 высокая

объект группы существа

Возвращает объект группы (пати), в которой состоит существо c, либо пустой/null,
если существо не в группе (проверяют через IsNullParty). Принимает существо
CSharedCreatureData; функция глобального объекта gg. Возвращает CSharedPartyData.

Сигнатура

GetParty( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — чью пати получаем.

Пример

party0 = GetParty( c3 );

Пример использования

party0 = GetParty( target );
if ( IsNullParty( party0 ) ) {
    return;
} else {
    TeleportParty( party0.id, SibylPosX, SibylPosY, SibylPosZ, 300, ( part_type * RoomIndex ) );
}

Party_GetCountGLOBAL🟢 высокая

число членов группы

Возвращает число членов группы существа c; это базис обхода пати в цикле. Если
существо не в группе — обычно 0 или 1. Принимает существо CSharedCreatureData;
функция глобального объекта gg. Возвращает целое число.

Сигнатура

Party_GetCount( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — чья пати.

Пример

i1 = Party_GetCount( c1 );

Party_GetCreatureGLOBAL🟢 высокая

член группы по индексу

Возвращает члена группы существа c по индексу nIndex (отсчёт с нуля). В связке с
Party_GetCount даёт перебор всех сопартийцев — например, чтобы выдать награду или баф
всей группе. Принимает существо CSharedCreatureData и целочисленный индекс
(0..count-1); функция глобального объекта gg. Возвращает CSharedCreatureData.

Сигнатура

Party_GetCreature( CSharedCreatureData cCreature, int nIndex )

Параметры

cCreature (CSharedCreatureData) — чья пати.
nIndex    (int) — индекс члена (0..count-1).

Пример

c0 = Party_GetCreature( c1, i0 );

Пример использования

c1 = Party_GetCreature( talker, i2 );
if ( OwnItemCount( c1, @q_antique_brooch ) == 0 ) {
    GiveItem1( c1, @q_used_adm_to_grave, 1 );
}

Party_GetLeaderGLOBAL🟢 высокая

лидер группы по существу

Возвращает лидера группы, в которой состоит существо c. Удобна, когда на руках есть
игрок. Принимает существо CSharedCreatureData; функция глобального объекта gg.
Возвращает CSharedCreatureData.

Сигнатура

Party_GetLeader( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, по чьей группе ищется лидер

Пример

c0 = Party_GetLeader( c0 );
c0 = Party_GetLeader( talker );
c1 = Party_GetLeader(talker);

Пример использования

if ( Party_GetLeader( talker ) != talker ) {
    ShowPage( talker, "ssq_main_event_sibyl_q0505_04.htm" );
} else {
    ShowPage( talker, "ssq_main_event_sibyl_q0505_01.htm" );
}

GetTopDamageCreatureGLOBAL🟢 высокая

чемпион по урону (существо)

Возвращает отдельное существо, нанёсшее существу c (обычно рейд-боссу) наибольший
суммарный урон. Применяется при смерти босса для раздачи награды тому, кто бился
усерднее всех. Принимает существо CSharedCreatureData; функция глобального объекта
gg. Возвращает CSharedCreatureData.

Сигнатура

GetTopDamageCreature( CSharedCreatureData c )

Параметры

    c (CSharedCreatureData) — существо (обычно рейд-босс), для которого ищут нанёсшего наибольший урон

Пример (иллюстративный):

    GetTopDamageCreature( talker );

GetTopDamagePartyGLOBAL🟢 высокая

группа с наибольшим уроном

Возвращает группу (пати), нанёсшую существу c наибольший суммарный урон. Уровень
агрегации урона — отдельная группа; используется при раздаче награды за бой с боссом.
Принимает существо CSharedCreatureData; функция глобального объекта gg. Возвращает
CSharedPartyData.

Сигнатура

GetTopDamageParty( CSharedCreatureData c )

Параметры

    c (CSharedCreatureData) — существо, по урону которому определяется наиболее повредившая его группа

Пример (иллюстративный):

    GetTopDamageParty( talker );

GetTopDamageMpccGLOBAL🟢 высокая

командный канал с наибольшим уроном

Возвращает командный канал (MPCC — объединение нескольких групп), нанёсший существу c
наибольший суммарный урон. Старший уровень агрегации урона при раздаче награды за бой с
рейд-боссом. Принимает существо CSharedCreatureData; функция глобального объекта gg.
Возвращает CSharedGeneralObjectData.

Сигнатура

GetTopDamageMpcc( CSharedCreatureData c )

Параметры

    c (CSharedCreatureData) — существо, по урону которому определяется наиболее повредивший его командный канал (MPCC)


Пример (иллюстративный):

    GetTopDamageMpcc( talker );

GetLeaderOfPartyNPC🟢 высокая

лидер группы по объекту пати

Возвращает лидера группы по самому объекту пати p. Применяется, когда есть только
CSharedPartyData — например, полученная от GetTopDamageParty. Принимает объект пати
CSharedPartyData; функция NPC (myself). Возвращает CSharedCreatureData.

Сигнатура

GetLeaderOfParty( CSharedPartyData p )

Параметры

p (CSharedPartyData) — объект группы (пати), у которой берут лидера.

Пример

c0 = GetLeaderOfParty(lparty);

Пример использования

c1 = GetLeaderOfParty( party0 );
if ( IsNullCreature( c1 ) == 0 ) {
    Shout( MakeFString( 1010634, c1.name, IntToStr( i2 ), "", "", "" ) );
}

Party_GetMemberNPC🟢 высокая

член группы по числовым идентификаторам

Возвращает члена группы по числовым идентификаторам. По декомпилю L2NPC
(CNPC::Party_GetMember_4A79A8) первый аргумент — id группы (его младшие 20 бит
индексируют массив пати), второй — индекс члена, ограниченный движком диапазоном 0..9.
Дальше вызывает тот же код, что GetMemberOfParty. Функция NPC (myself). Возвращает
CSharedCreatureData.

Сигнатура

Party_GetMember( int nPartyId, int nIndex )

Параметры

nPartyId (int) — id группы (party0.id; в вызовах также myself.i_quest0 с сохранённым id).
nIndex (int) — индекс члена в группе, 0..9.

Пример

c0 = Party_GetMember(i2, i9);

Пример использования

c3 = Party_GetMember( myself.i_quest0, i8 );
if ( IsNullCreature( c3 ) == 0 ) {
    ShowOnScreenMsgStr( c3, 2, 0, 0, 0, 1, 0, 10000, 0, s0 );
}

GetMemberOfPartyNPC🟢 высокая

член группы по объекту пати и индексу

Возвращает члена группы p по индексу nIndex. Применяется, когда есть только объект
пати CSharedPartyData. Принимает объект пати CSharedPartyData и целочисленный индекс;
функция NPC (myself). Возвращает CSharedCreatureData.

Сигнатура

GetMemberOfParty( CSharedPartyData p, int nIndex )

Параметры

p (CSharedPartyData) — объект группы (пати), из которой берут члена.
nIndex (int) — индекс члена в группе.

Пример

c3 = GetMemberOfParty( party0, i8 );

Пример использования

target = GetMemberOfParty( lparty, i9 );
if ( HaveMemo( target, @relics_of_the_old_empire ) == 1 ) {
    random1_list.SetInfo( 0, target );
}

IsMemberOfPartyNPC🟢 высокая

проверка членства в группе

Проверяет, состоит ли существо c в группе p (возвращает 1 или 0). Служит для
логики «свой/чужой» в групповых сценах. Принимает существо CSharedCreatureData и объект
пати CSharedPartyData; функция NPC (myself). Возвращает целое число.

Сигнатура

IsMemberOfParty( CSharedCreatureData c, CSharedPartyData p )

Параметры

    c (CSharedCreatureData) — кого проверяем.
    p (CSharedPartyData) — в какой группе.

Пример (иллюстративный):

    IsMemberOfParty( talker, party0 );

GetPledgeNPC🟢 высокая

объект клана существа

Возвращает объект клана (pledge), в котором состоит существо c. Это отправная точка
всех клановых операций — казны, рангов, регистрации на войну. Принимает существо
CSharedCreatureData; функция NPC (myself). Возвращает CSharedPledgeData.

Сигнатура

GetPledge( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — чей клан.

Пример

pledge0 = GetPledge(talker);

Пример использования

pledge0 = GetPledge( last_attacker );
if ( IsNull( pledge0 ) == 1 ) { return; }

HavePledgePowerNPC🟢 высокая

проверка клановой привилегии

Проверяет, есть ли у игрока c клановая привилегия nPledgePower (возвращает 1 или
0). Привилегии задаются @-константами (@ppSetGate, @PP_OPEN_CASTLE_DOOR,
@ppRegisterWar, @PP_USE_AGIT_FUNC и т.п.). Так замковые и клановые NPC решают,
вправе ли игрок открыть дверь, зарегистрировать войну, управлять кланзалом. Принимает
существо CSharedCreatureData и целочисленный код привилегии; функция NPC (myself).
Возвращает целое число.

Сигнатура

HavePledgePower( CSharedCreatureData c, int nPledgePower )

Параметры

c (CSharedCreatureData) — игрок.
nPledgePower (int) — код проверяемой клановой привилегии (manual_pch; актуальная нумерация):
    1 @PP_JOIN приём в клан, 2 @PP_GIVE_NICKNAME/@ppGiveTitle титул, 3 @PP_VIEW_WAREHOUSE склад,
    4 @PP_MANAGE_GRADE ранги, 5 @PP_DECLARE_WAR война, 6 @PP_OUST_MEMBER изгнание,
    7 @PP_SET_CREST герб, 8 @PP_MANAGE_MASTER лидеры юнитов, 9 @PP_MANAGE_GROWTH/@ppSubPledgeMaster,
    10 @PP_SUMMON_AIRSHIP, 11 @PP_OPEN_AGIT_DOOR/@ppGateOpen двери кланзала, 12 @PP_USE_AGIT_FUNC/@ppDecoFunction,
    13 @PP_AGIT_AUCTION аукцион кланзала, 14 @PP_OUST_FROM_AGIT/@ppClanHallBanish, 15 @PP_CONTROL_AGIT_FUNC/@ppManage,
    16 @PP_OPEN_CASTLE_DOOR/@ppSetGate двери замка, 17 @PP_MANAGE_MANOR/@ppManor манор,
    18 @PP_REGISTER_CASTLE_WAR/@ppSiege осада, 19 @PP_USE_CASTLE_FUNC/@ppCastleShop, 20 @PP_OUST_FROM_CASTLE/@ppBanish,
    21 @PP_MANAGE_TAX/@ppTaxVault налог/казна, 22 @PP_MANAGE_MERCENARY наёмники, 23 @PP_CONTROL_CASTLE_FUNC/@ppSiegeDefend,
    24 @PP_USE_THRONE_OF_HERO трон. Номера сдвинуты в ранних хрониках (см. manual_pch, метки «IL»).

Пример

if (HavePledgePower(talker, @ppDecoFunction) && Castle_GetPledgeId() == talker.pledge_id && talker.pledge_id != 0)

Пример использования

if ( IsMyLord( talker ) || ( HavePledgePower( talker, @ppGateOpen ) && Castle_GetPledgeId( ) == talker.pledge_id && talker.pledge_id != 0 ) ) {
    ShowPage( talker, fnDoor );
} else {
    ShowPage( talker, fnNoAuthority );
}

GetPledgeMemberCountNPC🟢 высокая

число членов клана

Возвращает число членов клана, в котором состоит существо c. Используется в клановых
диалогах и условиях. Принимает существо CSharedCreatureData; функция NPC (myself).
Возвращает целое число.

Сигнатура

GetPledgeMemberCount( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, по чьему клану считают число членов

Пример

i0 = GetPledgeMemberCount(talker);

Пример использования

if ( GetPledgeMemberCount(talker) >= 40 ) { // orig >= 140
    UpdatePledgeNameValue( talker, -100000 );
    DeleteItem1( talker, item_lvup10 , num_item_lvup10 );
    PledgeLevelUp( talker, 10 );
    AddUseSkillDesire(talker, EffectSkill1, @ST_HEAL, @AMT_STAND, 1000000);
    ShowPage( talker, "pl_err_total_member.htm" );
}

GetPledgeMoneyNPC🟢 высокая

казна клана

По смыслу возвращает адену клановой казны существа c. ВАЖНО: в сборке NPC функция фактически ЗАГЛУШКА — при любом раскладе возвращает 0 (нет клана — 0; есть клан —
всё равно 0, денежное поле не читается). Реальную сумму казны знает только серверная часть
(L2Server), поэтому в AI-скриптах NPC на этот результат полагаться нельзя. Единицы — адена
(32-битное целое). Принимает существо CSharedCreatureData; функция NPC (myself).

Сигнатура

GetPledgeMoney( CSharedCreatureData cCreature )

Параметры

    cCreature (CSharedCreatureData) — существо, по чьему клану берут казну (клановые деньги)

Пример (иллюстративный):

    GetPledgeMoney( talker );

Pledge_GetCountNPC🟢 высокая

счётчик клана

Возвращает счётчик клана существа c (базовое сведение о клане). Используется в
клановых диалогах и условиях. Принимает существо CSharedCreatureData; функция NPC
(myself). Возвращает целое число.

Сигнатура

Pledge_GetCount( CSharedCreatureData cCreature )

Параметры

    cCreature (CSharedCreatureData) — существо, по чьему клану берут счётчик

Пример (иллюстративный):

    Pledge_GetCount( talker );

Pledge_GetLeaderNPC🟢 высокая

лидер клана

Возвращает лидера клана, в котором состоит существо c. Используется в клановых
диалогах и условиях. Принимает существо CSharedCreatureData; функция NPC (myself).
Возвращает CSharedCreatureData.

Сигнатура

Pledge_GetLeader( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, по чьему клану ищется лидер клана

Пример

c2 = Pledge_GetLeader( c1 );

Пример использования

c2 = Pledge_GetLeader( c1 );
if ( IsNullCreature( c2 ) == 0 ) {
    if ( HaveMemo( c2, @pursuit_of_clan_ambition ) == 1 && GetMemoState( c2, @pursuit_of_clan_ambition ) < 8511 && GetMemoState( c2, @pursuit_of_clan_ambition ) >= 8500 && DistFromMe( c2 ) <= 1500 ) {
        CreateOnePrivate( @imperial_coffer, "imperial_coffer", 0, 1 );
    }
}

HasSubPledgeNPC🟢 высокая

наличие суб-подразделения клана

Проверяет, есть ли у клана существа c суб-подразделение типа nType (рыцари, академия,
royal guard). Возвращает 1, если такой суб-юнит создан, иначе 0. По декомпилю берёт клан
существа (нет клана — 0), переводит тип во внутренний индекс (0..7) и проверяет соответствующий
бит в маске существующих суб-подразделений клана — то есть до восьми типов суб-юнитов. Точная
таблица «тип → индекс» лежит в данных движка. Принимает существо CSharedCreatureData и
целочисленный тип подразделения.

Сигнатура

HasSubPledge( CSharedCreatureData c, int nType )

Параметры

c (CSharedCreatureData) — существо, по чьему клану проверяется наличие суб-подразделения.
nType (int) — тип суб-подразделения (enum PledgeType, из manual_pch):
    -1 @ACADEMY академия, 100 @ROYAL_GUARD_1, 200 @ROYAL_GUARD_2,
    1001 knight 1, 1002 knight 2, 2001 knight 3, 2002 knight 4.

Пример

if (HasSubPledge(talker, @ROYAL_GUARD_1) == @TRUE)

Пример использования

if (HasSubPledge(talker, i0) == 1) {
    ShowPage(talker, "pl_err_fame.htm");
    return;
}

MPCC_GetPartyIDNPC🟢 высокая

ID партии в MPCC по индексу

По ключу mpcc_id и порядковому индексу party_index возвращает ID партии в многопартийном командном канале. Вызывается на объекте NPC.

Сигнатура

MPCC_GetPartyID( int nMpccId, int nPartyIndex )

Параметры

nMpccId (int) — идентификатор командного канала (mpcc_id).
nPartyIndex (int) — порядковый индекс партии в канале.

Пример

i1 = MPCC_GetPartyID( i0, 0 );

MPCC_GetMPCCIdNPC🟢 высокая

ID канала, где состоит игрок

Возвращает ID командного канала, в котором состоит существо. Вызывается на объекте NPC.

Сигнатура

MPCC_GetMPCCId( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, чей командный канал запрашивается

Пример

i0 = MPCC_GetMPCCId( talker );

Пример использования

i3 = MPCC_GetMPCCId( talker );
if ( i3 > 0 ) {
    i4 = MPCC_GetMemberCount( i3 );
    if ( i4 >= 55 ) {
        SendScriptEvent( c0, 99999999, i3 );
    }
}

MPCC_SetMasterPartyRoutingNPC🟢 высокая

назначить мастер-партию

Включает или сбрасывает маршрутизацию мастер-партии командного канала. По декомпилю L2NPC
шлёт серверу пакет opcode 124; обработчик (L2Server: NpcSetMPCCMasterPartyRouting_731E6C)
по флагу выбирает действие: 1 — установить маршрутизацию мастер-партии (SetMasterPartyRouting),
0 — сбросить её (ResetMasterPartyRouting, если данный канал был маршрутизирующим). Возврата нет.

Сигнатура

MPCC_SetMasterPartyRouting( int nMpccId, CSharedCreatureData cMaster, int nOnOff )

Параметры

nMpccId (int) — идентификатор командного канала (mpcc_id).
cMaster (CSharedCreatureData) — существо — лидер мастер-партии.
nOnOff (int) — 1 = установить маршрутизацию мастер-партии; 0 = сбросить маршрутизацию.

Пример

MPCC_SetMasterPartyRouting( script_event_arg2, myself.sm, 1 );

Пример использования

if ( c0.db_value == 0 ) {
    MPCC_SetMasterPartyRouting( myself.i_ai1, c0, 0 );
    SendScriptEvent( c0, @SCE_ANTARAS_PC_ENTERED, 0 );
}

MPCC_GetMasterNPC🟢 высокая

лидер мастер-партии канала

По ключу mpcc_id возвращает существо — лидера мастер-партии командного канала. Вызывается на объекте NPC.

Сигнатура

MPCC_GetMaster( int nMpccId )

Параметры

nMpccId (int) — идентификатор командного канала (mpcc_id).

Пример

c0 = MPCC_GetMaster( i0 );
c1 = MPCC_GetMaster( i9 );
c1 = MPCC_GetMaster( i1 );
c3 = MPCC_GetMaster( i3 );

Пример использования

c0 = MPCC_GetMaster( i0 );
if ( IsNullCreature( c0 ) ) { c0 = target; } // если вдруг игрок выпал из ЦЦ и лидер не найден

MPCC_GetMemberCountNPC🟢 высокая

число членов в канале

По ключу mpcc_id возвращает общее количество членов в командном канале.

Сигнатура

MPCC_GetMemberCount( int nMpccId )

Параметры

nMpccId (int) — идентификатор командного канала (mpcc_id).

Пример

i4 = MPCC_GetMemberCount( i3 );
i2 = MPCC_GetMemberCount(i1);

Пример использования

i4 = MPCC_GetMemberCount( i3 );
if ( i4 >= 55 ) {
    SendScriptEvent( c0, 99999999, i3 );
}

MPCC_GetPartyCountNPC🟢 высокая

число партий в канале

По ключу mpcc_id возвращает количество партий в командном канале. Вызывается на объекте NPC.

Сигнатура

MPCC_GetPartyCount( int nMpccId )

Параметры

nMpccId (int) — идентификатор командного канала (mpcc_id).

Пример

i7 = MPCC_GetPartyCount( i0 );

Пример использования

i1 = MPCC_GetPartyCount( i0 );
if ( i1 < 7 ) {
    ShowPage( talker, "zaken_enter001d.htm" ); 
}

Академия (Academy)

6 функций

IsAcademyMemberNPC🟢 высокая

состоит ли в академии

Возвращает, состоит ли игрок cCreature в академии клана как ученик (1/0, сравнивают с @TRUE), namespace CNPC.

Сигнатура

IsAcademyMember( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, членство которого в академии клана проверяется

Пример

if (_from_choice == 0 || (HaveMemo(talker, @one_who_leads_one_who_is_led) == @FALSE && HaveMemo(talker, @one_who_leads_one_who_is_led_2) == @FALSE && talker.level >= 19 && IsAcademyMember(talker) == @TRUE && HasAcademyMaster(talker) == @TRUE && GetOneTimeQuestFlag(talker, @one_who_leads_one_who_is_led_2) == @FALSE && GetOneTimeQuestFlag(talker, @one_who_leads_one_who_is_led) == @FALSE))

Пример использования

if( IsAcademyMember( talker ) == 1 ) {
    GiveItem1( talker, @academy_circlet ,1 );
    ShowSystemMessage( talker,1749 );
}

HasAcademyMasterNPC🟢 высокая

есть ли наставник

Возвращает, есть ли у игрока cCreature наставник в академии (1/0), namespace CNPC.

Сигнатура

HasAcademyMaster( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, у которого проверяется наличие наставника в академии

Пример

if ( HaveMemo( talker, @to_lead_and_be_led ) == 0 && HaveMemo( talker, @one_who_leads_one_who_is_led_2 ) == 0 && talker.level >= 19 && IsAcademyMember( talker ) == 1 && HasAcademyMaster( talker ) == 1 && GetOneTimeQuestFlag( talker, @to_lead_and_be_led ) == 0 && GetOneTimeQuestFlag( talker, @one_who_leads_one_who_is_led_2 ) == 0 ) {

Пример использования

if ( _from_choice == 0 || ( ( ( HaveMemo( talker, @to_lead_and_be_led ) == 0 && HaveMemo( talker, @one_who_leads_one_who_is_led_2 ) == 0 && ( talker.level < 19 || IsAcademyMember( talker ) == 0 || HasAcademyMaster( talker ) == 0 ) ) && GetOneTimeQuestFlag( talker, @one_who_leads_one_who_is_led_2 ) == 0 ) && GetOneTimeQuestFlag( talker, @to_lead_and_be_led ) == 0 ) ) {
    SetCurrentQuestID( @one_who_leads_one_who_is_led_2 );
    ShowQuestPage( talker, "head_blacksmith_newyear_q0123_02.htm", @one_who_leads_one_who_is_led_2 );
}

GetAcademyMasterNPC🟢 высокая

взять наставника

Возвращает наставника игрока cCreature в академии (существо), namespace CNPC.

Сигнатура

GetAcademyMaster( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, наставника которого в академии нужно получить

Пример

c0 = GetAcademyMaster( talker );
c0 = GetAcademyMaster( target );

HasAcademyMemberNPC🟢 высокая

есть ли ученик

Возвращает, есть ли у игрока cCreature ученик в академии (1/0, сравнивают с @TRUE), namespace CNPC.

Сигнатура

HasAcademyMember( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок (`cCreature`), у которого проверяют наличие ученика в академии

Пример

if (_from_choice == 0 || HasAcademyMember(talker) == @TRUE)

Пример использования

if ( HasAcademyMember( talker ) == 1 ) {
    _choiceN = ( _choiceN + 1 );
    _code = 15;
    AddChoice( 15, MakeFString( 11804, _blank, _blank, _blank, _blank, _blank ) );   // To Lead And Be Led (Sponsor)
}

GetAcademyMemberNPC🟢 высокая

взять ученика

Возвращает ученика игрока cCreature в академии (существо), namespace CNPC.

Сигнатура

GetAcademyMember( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок (`cCreature`), чьего ученика в академии возвращают

Пример

c0 = GetAcademyMember( talker );

HasAcademyNPC🟢 высокая

наличие академии

Возвращает, есть ли у игрока cCreature академия (1/0, сравнивают с @TRUE), namespace CNPC. Точное отличие от HasAcademyMaster/HasAcademyMember подтверждено не до конца.

Сигнатура

HasAcademy( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок (`cCreature`), у которого проверяют наличие академии

Пример

if ( HasAcademy( talker) == @TRUE ) {

Пример использования

if ( HasAcademy( talker) == 1 ) {
    ShowPage( talker, "pl_err_aca.htm" );
} else {
    ShowPage( talker, "pl_err_aca.htm" );
}

Игрок: имя и статусы (Player)

10 функций

GetCountryGLOBAL🟢 высокая

страна/регион игрока

Возвращает числовой код страны/региона игрока cCreature (int), namespace gg. Применяют для локализации (выбора нужного .htm или текста).

Сигнатура

GetCountry( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, для которого возвращают код страны/региона

Пример

if (GetCountry(talker) == 2) { ShowNewTutorialHTML(talker, "..\L2text\pet_visual26-ua.htm"); }

Пример использования

if (GetCountry(talker) == 2) { ShowNewTutorialHTML(talker, "..\L2text\pet_visual26-ua.htm"); }
else if (GetCountry(talker) == 4) { ShowNewTutorialHTML(talker, "..\L2text\pet_visual26-cn.htm"); }
else if (GetCountry(talker) == 8) { ShowNewTutorialHTML(talker, "..\L2text\pet_visual26-ru.htm"); }
else { ShowNewTutorialHTML(talker, "..\L2text\pet_visual26-eu.htm"); }

ChangeNickNameNPC🟢 высокая

сменить титул

Меняет титул существа cCreature — строку над головой — на sName, namespace CNPC.

Сигнатура

ChangeNickName( CSharedCreatureData pCreatureShared, string sName )

Параметры

pCreatureShared (CSharedCreatureData) — существо, которому меняют титул над головой
sName (string) — новый текст титула

Пример

case 1:  { ChangeNickName(myself.sm, LocationName_01); break; }

ChangeMasterNameNPC🟢 высокая

сменить вторую строку имени

Меняет «вторую строку» / имя владельца существа cCreature на sName, namespace CNPC.

Сигнатура

ChangeMasterName( CSharedCreatureData pCreatureShared, string sName )

Параметры

pCreatureShared (CSharedCreatureData) — существо, которому меняют имя владельца (вторую строку)
sName (string) — новый текст имени владельца

Пример

ChangeMasterName(myself.sm, "DEAD * RESPAWN IN " + IntToStr(myself.i_ai3) + " MIN");

ChangeFStrNickNameNPC🟢 высокая

титул через FString

Меняет титул существа cCreature на локализуемый текст по id фразы nFStringId с параметром sParam, namespace CNPC.

Сигнатура

ChangeFStrNickName( CSharedCreatureData cCreature, int nArg1, string pStr1 )

Параметры

cCreature (CSharedCreatureData) — существо, которому меняют титул
nArg1 (int) — id локализуемой фразы для титула (`nFStringId`)
pStr1 (string) — параметр-подстановка в фразу (`sParam`)

Пример

ChangeFStrNickName(myself.sm, 1801100, IntToFStr(i1));

Пример использования

if ( i0 >= 60008 && i0 <= 60011 ) {
    ChangeFStrNickName( myself.sm, i0, "" );
}

ChangeFStrMasterNameNPC🟢 высокая

вторая строка через FString

Меняет «вторую строку» имени существа cCreature на локализуемый текст по id фразы nFStringId с параметром sParam, namespace CNPC.

Сигнатура

ChangeFStrMasterName( CSharedCreatureData cCreature, int nArg1, string pStr1 )

Параметры

cCreature (CSharedCreatureData) — существо, которому меняют вторую строку имени
nArg1 (int) — id локализуемой фразы для второй строки (`nFStringId`)
pStr1 (string) — параметр-подстановка в фразу (`sParam`)

Пример

ChangeFStrMasterName(myself.sm, 1100159, _blank);

IsNewbieNPC🟢 высокая

новичок ли игрок

Возвращает, считается ли игрок cCreature новичком (1/0), namespace CNPC.

Сигнатура

IsNewbie( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок (`cCreature`), которого проверяют на статус новичка

Пример

if ( IsNewbie( talker ) ) {

Пример использования

if ( talker.level < 25 && IsNewbie( talker ) && IsInCategory( @fighter_group, talker.occupation ) ) {
    GiveItem1( talker, @soulshot_none_for_rookie, 7000 );
    VoiceEffect( talker, "tutorial_voice_026", 1000 );
}

SetNoblessNPC🟢 высокая

выдать статус ноблесс

Присваивает игроку cCreature статус ноблесс (noblesse), namespace CNPC.

Сигнатура

SetNobless( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок (`cCreature`), которому присваивают статус ноблесс

Пример

SetNobless( talker );

SetHeroNPC🟢 высокая

выдать статус героя

Присваивает игроку cCreature статус героя (hero), namespace CNPC.

Сигнатура

SetHero( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок (`cCreature`), которому присваивают статус героя

Пример

SetHero( talker );

Пример использования

    if ( talker.hero_type == 1 ) {
        SetHero( talker );
    }

Связанное событие: ответ сервера приходит событием SET_HERO_RETURNED (см. NASC_HANDLERS).

GetHwidNPC🟢 высокая

HWID игрока

Возвращает HWID — строковый идентификатор оборудования игрока cCreature (string), namespace CNPC. Вызовов мало, формат строки подтверждён слабо.

Сигнатура

GetHwid( CSharedCreatureData c )

Параметры

c (CSharedCreatureData) — игрок (`cCreature`), чей HWID возвращают

Пример

if(IsSameString(myself.str_list.Get(i0), GetHwid(talker)))

Пример использования

if(IsSameString(myself.str_list.Get(i0), GetHwid(talker)))
{
    ShowPage(talker, "atb_event_hw_portal_03.htm");
    return;
}

ShowChangePledgeNameUINPC🟢 высокая

окно смены имени клана

Открывает игроку cCreature окно смены названия клана, namespace CNPC.

Сигнатура

ShowChangePledgeNameUI( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок (`cCreature`), которому открывают окно смены названия клана

Пример

ShowChangePledgeNameUI( talker );

Пример использования

if ( talker.is_pledge_master == 1 ) {
    ShowChangePledgeNameUI( talker );
} else {
    ShowPage( talker, "pl_err_master.htm" );
}

Питомцы и саммоны (Pets)

7 функций

GetSummonNPC🟢 высокая

взять саммона/питомца игрока

Возвращает саммона или питомца, призванного существом cCreature (тип CSharedCreatureData), namespace CNPC. Если призванного нет, результат может быть пустым — его проверяют через IsNull*. Используется перед операциями с питомцем/саммоном.

Сигнатура

GetSummon( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, чьего саммона/питомца возвращают

Пример

c0 = GetSummon(talker);

Пример использования

c0 = GetSummon(talker);
if (IsNullCreature(c0) == 0 && skip_chk_summon_pet1 == 1) {
    ShowPage(talker, fnEvolutionStopped);
    return;
}

EvolvePetNPC🟢 высокая

эволюция питомца (детёныш в взрослого)

Превращает питомца игрока cCreature из детёныша во взрослую форму, namespace CNPC. Аргументы: nPetDbId — id питомца в базе, nBabyClassId — класс детёныша, nEvolveItemId — предмет-эволюции, nGrownClassId — класс взрослого, nPetLevel — уровень питомца.

Сигнатура

EvolvePet( CSharedCreatureData c, int nPetDbId, int nBabyClassId, int nEvolveItemId, int nGrownClassId, int nPetLevel )

Параметры

c (CSharedCreatureData) — игрок-владелец питомца.
nPetDbId (int) — идентификатор питомца в базе (обычно item0.dbid).
nBabyClassId (int) — класс детёныша (исходная форма).
nEvolveItemId (int) — предмет-эволюции.
nGrownClassId (int) — класс взрослой формы питомца.
nPetLevel (int) — уровень питомца (обычно item0.pet_level).

Пример

EvolvePet( talker, item0.dbid, 1012311, 4422, 1012526, item0.pet_level );
EvolvePet( talker, item0.dbid, 1012312, 4423, 1012527, item0.pet_level );
EvolvePet( talker, item0.dbid, 1012313, 4424, 1012528, item0.pet_level );
EvolvePet(talker, item0.dbid, i2, i1, i3, item0.pet_level);

Пример использования

if (item0.pet_level >= i4) {
    EvolvePet(talker, item0.dbid, i2, i1, i3, item0.pet_level);
    ShowPage(talker, fnHi);
    SoundEffect(talker, "ItemSound.quest_finish");
} else {
    ShowPage(talker, "pet_manager_evolve_no.htm");
}

EvolvePetWithSameExpNPC🟢 высокая

эволюция питомца с сохранением опыта

Эволюция питомца игрока cCreature во взрослую форму nGrownClassId с сохранением накопленного опыта, namespace CNPC. В отличие от EvolvePet передаётся только итоговый класс.

Сигнатура

EvolvePetWithSameExp( CSharedCreatureData c, int nGrownClassId )

Параметры

c (CSharedCreatureData) — игрок-владелец питомца.
nGrownClassId (int) — итоговый класс взрослой формы питомца.

Пример

EvolvePetWithSameExp( talker, id_grown_pet1 );

DestroyPetNPC🟢 высокая

удалить питомца

Удаляет питомца игрока cCreature, namespace CNPC. Аргументы: nPetDbId — id питомца в базе, nPetLevel — уровень (значение -99 задаёт особый случай удаления).

Сигнатура

DestroyPet( CSharedCreatureData c, int nPetDbId, int nPetLevel )

Параметры

c (CSharedCreatureData) — игрок-владелец питомца.
nPetDbId (int) — идентификатор питомца в базе (обычно item0.dbid / myself.sm.pet_dbid).
nPetLevel (int) — уровень питомца; специальное значение -99 задаёт особый случай удаления.

Пример

DestroyPet( talker, item0.dbid, item0.pet_level );
DestroyPet( myself.master, myself.sm.pet_dbid, -99 );

Пример использования

if ( item0 ) {
    DestroyPet( talker, item0.dbid, item0.pet_level );
}

GetEvolutionIdNPC🟢 высокая

id текущей эволюции

Возвращает числовой идентификатор текущей эволюции (int), namespace CNPC. Вызовов в наших скриптах почти нет, семантика подтверждена слабо.

Сигнатура

GetEvolutionId(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

i0 = GetEvolutionId( );

Summon_SetOptionNPC🟢 высокая

задать опцию саммона

Задаёт опцию призванного саммона и возвращает int, namespace CNPC. Аргументы: nOption — номер опции (0..3), nValue — значение (для опции 1 часто 900, для 2/3 — 0 или 1).

Сигнатура

Summon_SetOption( int nOption, int nValue )

Параметры

nOption (int) — номер опции саммона (0..3).
nValue (int) — значение опции (для опции 1 часто 900, для 2/30 или 1).

Пример

Summon_SetOption( 3, 1 );

RideWyvernNPC🟢 высокая

посадить игрока на виверна

Сажает игрока cCreature верхом на виверна nWyvernId (обычно @wyvern), namespace CNPC.

Сигнатура

RideWyvern( CSharedCreatureData c, int nWyvernId )

Параметры

c (CSharedCreatureData) — игрок, которого сажают верхом.
nWyvernId (int) — идентификатор виверна (обычно `@wyvern`).
    значения — из словаря [npc_pch]

Пример

RideWyvern(talker, @wyvern);
RideWyvern( talker, 1012621 );

Классы и подклассы (Class / Subclass)

7 функций

ClassChangeNPC🟢 высокая

сменить основной класс

Меняет основной класс игрока cCreature на nClassId и возвращает int, namespace CNPC. Класс задают @-константой (@duelist, @phoenix_knight, @grand_khavatari и т.п.) или числом.

Сигнатура

ClassChange( CSharedCreatureData c, int nClassId )

Параметры

c (CSharedCreatureData) — игрок, основной класс которого меняется.
nClassId (int) — идентификатор нового класса (@-константа класса, напр. @grand_khavatari, или число).

Пример

ClassChange( talker, @grand_khavatari );

Пример использования

if ( ask == -512 ) {
    ClassChange( talker, reply );
}

ChangeSubJobNPC🟢 высокая

сменить активный подкласс

Делает активным указанный подкласс nSubJobClass у игрока cCreature, namespace CNPC.

Сигнатура

ChangeSubJob( CSharedCreatureData cCreature, int nSubJobClass )

Параметры

cCreature (CSharedCreatureData) — игрок, у которого активируется подкласс
nSubJobClass (int) — подкласс, делаемый активным

Пример

ChangeSubJob( talker, i0 );

Пример использования

    if( talker.alive ) {
        ChangeSubJob( talker, @shillien_knight );
    }

Связанное событие: ответ сервера приходит событием SUBJOB_CHANGED (см. NASC_HANDLERS).

RenewSubJobNPC🟢 высокая

сбросить/заменить подкласс в слоте

Сбрасывает или заменяет подкласс игрока cCreature в слоте nSlot на класс nClassId, namespace CNPC.

Сигнатура

RenewSubJob( CSharedCreatureData c, int nSlot, int nClassId )

Параметры

c (CSharedCreatureData) — игрок, чей подкласс сбрасывается/заменяется.
nSlot (int) — номер слота подкласса.
nClassId (int) — идентификатор нового класса подкласса.

Пример

    RenewSubJob( talker, i8, 12 );

Связанное событие: ответ сервера приходит событием SUBJOB_RENEWED (см. NASC_HANDLERS).

GetSubJobListNPC🟢 высокая

собрать список доступных подклассов

Заполняет список доступных для выбора подклассов игрока cCreature под меню, namespace CNPC. Аргументы: nCategory — категория (10/20/...), nState — состояние/фильтр.

Сигнатура

GetSubJobList( CSharedCreatureData c, int nCategory, int nState )

Параметры

c (CSharedCreatureData) — игрок, для которого формируется список подклассов.
nCategory (int) — категория подклассов (10/20/…; в вызовах reply-10).
nState (int) — состояние/фильтр отбора (в вызовах 0).

Пример

    GetSubJobList( talker, ( reply - 10 ), 0 );

Связанное событие: ответ сервера приходит событием SUBJOB_LIST_INFORMED (см. NASC_HANDLERS).

IsMainClassNPC🟢 высокая

активен ли основной класс

Возвращает, активен ли сейчас у игрока cCreature основной класс (1/0, сравнивают с @TRUE), namespace CNPC.

Сигнатура

IsMainClass( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, у которого проверяется активность основного класса

Пример

if ( IsMainClass( talker ) == @TRUE ) {

Пример использования

if (IsMainClass(talker) == 1 && talker.level >= 81) {
    ShowPage(talker, "inzone_frantz_q010296_01.htm");
}

CheckSubJobAsMainNPC🟢 высокая

можно ли сделать подкласс основным

Проверяет, можно ли сделать подкласс nSubJobClass игрока cCreature основным классом, возвращает int, namespace CNPC. Семантика возврата подтверждена слабо.

Сигнатура

CheckSubJobAsMain( CSharedCreatureData cCreature, int nSubJobClass )

Параметры

cCreature (CSharedCreatureData) — игрок, чей подкласс проверяется
nSubJobClass (int) — подкласс, проверяемый на возможность стать основным классом

Пример

CheckSubJobAsMain( talker, i10 );
CheckSubJobAsMain( talker, @judicator );

Пример использования

if ( myself.av_quest0.CompareExchange( GetIndexFromCreature( talker ), 0 ) == 0 ) {
    CheckSubJobAsMain( talker, i10 );
}

SetSubJobAsMainNPC🟢 высокая

сделать подкласс основным

Делает подкласс nSubJobClass игрока cCreature основным классом, namespace CNPC. Вызовов мало, поведение подтверждено слабо.

Сигнатура

SetSubJobAsMain( CSharedCreatureData cCreature, int nSubJobClass )

Параметры

cCreature (CSharedCreatureData) — игрок, чей подкласс делается основным
nSubJobClass (int) — подкласс, переводимый в основной класс

Пример

SetSubJobAsMain( c0, myself.av_quest1.GetValue() );
SetSubJobAsMain( talker, reply );
SetSubJobAsMain(c0, @judicator);
SetSubJobAsMain( talker, @judicator );

Обучение (Tutorial)

5 функций

ShowTutorialHTMLNPC🟢 высокая

показать HTML-окно туториала

Показывает игроку cCreature обучающее HTML-окно туториала из файла sFile (имя .htm), namespace CNPC.

Сигнатура

ShowTutorialHTML( CSharedCreatureData c, string sFile )

Параметры

c (CSharedCreatureData) — игрок, которому показывают окно туториала.
sFile (string) — имя .htm-файла туториала (напр. "tutorial_human_fighter001.htm").

Пример

ShowTutorialHTML( talker, "tutorial_human_fighter001.htm" );

Пример использования

if ( talker.occupation == @shillien_oracle ) {
    ShowTutorialHTML( talker, "tutorial_22q.htm" );
}

ShowTutorialHTML2NPC🟢 высокая

окно туториала со звуком

То же, что ShowTutorialHTML, но с задержкой и звуком. По декомпилю L2NPC
(CNPC::ShowTutorialHTML2 → CShowTutorialHTMLTimer) третий аргумент — задержка показа
в секундах: движок ставит AddTimer(1000*nDelaySec) и по срабатыванию показывает окно
с проигрыванием звука. namespace CNPC.

Сигнатура

ShowTutorialHTML2( CSharedCreatureData c, string sFile, int nDelaySec, string sSound )

Параметры

c (CSharedCreatureData) — игрок, которому показывают окно туториала.
sFile (string) — имя .htm-файла туториала.
nDelaySec (int) — задержка перед показом окна, секунды (движок: AddTimer(1000*nDelaySec); в вызовах 3).
sSound (string) — имя звука, проигрываемого при показе (напр. "ItemSound.quest_tutorial").

Пример

ShowTutorialHTML2( talker, "tutorial_03.htm", 3, "ItemSound.quest_tutorial" );
ShowTutorialHTML2( talker, "tutorial_05.htm", 3, "ItemSound.quest_tutorial" );

ShowNewTutorialHTMLNPC🟢 высокая

туториал нового формата

Показывает игроку cCreature обучающее окно нового формата из файла sFile (локализованные .htm), namespace CNPC.

Сигнатура

ShowNewTutorialHTML( CSharedCreatureData cCreature, string pwsName )

Параметры

cCreature (CSharedCreatureData) — игрок, которому показывают окно туториала нового формата
pwsName (string) — имя локализованного .htm-файла туториала

Пример

if (GetCountry(talker) == 2) { ShowNewTutorialHTML(talker, "..\L2text\pet_visual26-ua.htm"); }

Пример использования

if (GetCountry(talker) == 2) { ShowNewTutorialHTML(talker, "..\L2text\pet_visual26-ua.htm"); }
else if (GetCountry(talker) == 4) { ShowNewTutorialHTML(talker, "..\L2text\pet_visual26-cn.htm"); }
else if (GetCountry(talker) == 8) { ShowNewTutorialHTML(talker, "..\L2text\pet_visual26-ru.htm"); }
else { ShowNewTutorialHTML(talker, "..\L2text\pet_visual26-eu.htm"); }

CloseTutorialHTMLNPC🟢 высокая

закрыть окно туториала

Закрывает у игрока cCreature открытое окно туториала, namespace CNPC.

Сигнатура

CloseTutorialHTML( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок (`cCreature`), у которого закрывают окно туториала

Пример

CloseTutorialHTML( talker );

Пример использования

else if ( reply == 999999) {
    CloseTutorialHTML( talker );
    return;
}

EnableTutorialEventNPC🟢 высокая

включить события туториала

Включает у игрока cCreature события туториала по битовой маске флагов, namespace CNPC.
Аргумент — битовая маска: скрипты выставляют/добавляют отдельные биты (напр. i0 | 1048576,
где 1048576 = 0x100000 — бит конкретного класса событий туториала).

Сигнатура

EnableTutorialEvent( CSharedCreatureData c, int nFlags )

Параметры

c (CSharedCreatureData) — игрок, которому включают события туториала.
nFlags (int) — битовая маска флагов событий туториала (комбинируется через OR;
    в вызовах встречается бит 1048576 = 0x100000).

Пример

EnableTutorialEvent( talker, ( i0 | 1048576 ) );

Радар (Radar)

3 функций

ShowRadarNPC🟢 высокая

поставить маркер на карте

Ставит игроку cCreature маркер-указатель в точку с координатами nX, nY, nZ, namespace CNPC. Аргумент nType задаёт радар: 1/2 или @RPT_BOTH (оба радара сразу).

Сигнатура

ShowRadar( CSharedCreatureData c, int nX, int nY, int nZ, int nType )

Параметры

c (CSharedCreatureData) — игрок, которому ставят маркер.
nX (int) — координата X точки маркера.
nY (int) — координата Y точки маркера.
nZ (int) — координата Z точки маркера.
nType (int) — тип радара (manual_pch): @RPT_RADAR (0) — только радар,
    @RPT_MAP (1) — только карта, @RPT_BOTH (2) — оба.

Пример

ShowRadar( attacker, -2908, 44128, -2712, 1 );

Пример использования

if ( ( GetMemoStateEx( talker, @an_arrogant_search, 1 ) % 10 ) == 0 ) {
    ShowRadar( talker, 181472, 7158, -2725, 1 );
}

DeleteRadarNPC🟢 высокая

убрать конкретный маркер

Убирает у игрока cCreature один маркер в точке с координатами nX, nY, nZ для радара nType, namespace CNPC.

Сигнатура

DeleteRadar( CSharedCreatureData c, int nX, int nY, int nZ, int nType )

Параметры

c (CSharedCreatureData) — игрок, у которого убирают маркер.
nX (int) — координата X удаляемого маркера.
nY (int) — координата Y удаляемого маркера.
nZ (int) — координата Z удаляемого маркера.
nType (int) — тип радара (manual_pch): @RPT_RADAR (0), @RPT_MAP (1), @RPT_BOTH (2).

Пример

DeleteRadar( talker, 10133, 157155, -2383, 2 );

Пример использования

if ( ( i0 % 10 ) == 0 ) {
    DeleteRadar( attacker, -2908, 44128, -2712, 1 );
    ShowRadar( attacker, -2908, 44128, -2712, 1 );
} else {
    SetFlagJournal( attacker, @an_arrogant_search, 19 );
    ShowQuestMark( attacker, @an_arrogant_search );
}

DeleteAllRadarNPC🟢 высокая

убрать все маркеры

Убирает у игрока cCreature все маркеры радара nType (@RPT_BOTH или 2), namespace CNPC.

Сигнатура

DeleteAllRadar( CSharedCreatureData c, int nType )

Параметры

c (CSharedCreatureData) — игрок, у которого убирают все маркеры.
nType (int) — тип радара (manual_pch): @RPT_RADAR (0), @RPT_MAP (1), @RPT_BOTH (2).

Пример

DeleteAllRadar(talker, @RPT_BOTH);
DeleteAllRadar( talker, 2 );

Пример использования

if ( reply == 65 ) {
    DeleteAllRadar( talker, 2 );
    ShowRadar( talker, 12311, 17470, -4574, 2 );
    ShowPage( talker, "guide_delf_frankia_q0255_05.htm" );
}

Хенна (Henna)

2 функций

OpenHennaItemListForEquipNPC🟢 высокая

открыть окно нанесения хенны

Открывает игроку cCreature окно нанесения (наложения) хенны, namespace CNPC.

Сигнатура

OpenHennaItemListForEquip( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок (`cCreature`), которому открывают окно нанесения хенны

Пример

OpenHennaItemListForEquip( talker );

Пример использования

if ( reply == 1 ) {
    OpenHennaItemListForEquip( talker );
} else if ( reply == 2 ) {
    OpenHennaListForUnquip( talker );
}

OpenHennaListForUnquipNPC🟢 высокая

открыть окно снятия хенны

Открывает игроку cCreature окно снятия хенны, namespace CNPC.

Сигнатура

OpenHennaListForUnquip( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок (`cCreature`), которому открывают окно снятия хенны

Пример

OpenHennaListForUnquip( talker );

Пример использования

if ( reply == 2 ) {
    OpenHennaListForUnquip( talker );
}

ТОРГОВЛЯ И МАНОР (Shop / Multisell / PC-Cafe / Manor)

27 функций

BuyNPC🟢 высокая

открыть окно покупки

Открывает игроку торговое окно покупки. Принимает покупателя (talker), список товаров [CBuySellList] (например, BuyList0), три строковые html-страницы оформления (шапка, список, пустая страница) и налог-наценку долей; всё на NPC (myself). Ничего не возвращает.

Сигнатура

Buy( CSharedCreatureData cCreature, CBuySellList pBuyList, string pwsPage0, string pwsPage1, string pwsEmptyPage, float dTax )

Параметры

cCreature (CSharedCreatureData) — 1.
pBuyList (CBuySellList) — список товаров на покупку, выставляемый в окне
pwsPage0 (string) — html-страница оформления (шапка окна)
pwsPage1 (string) — html-страница оформления (список товаров)
pwsEmptyPage (string) — html-страница, показываемая при пустом списке
dTax (float) — доля налога/наценки к цене покупки

Пример

Buy( talker, BuyList0, ShopName, fnSell, fnUnableItemSell, -50 );

SellNPC🟢 высокая

открыть окно продажи

Открывает игроку торговое окно продажи. Принимает продавца (talker), список товаров [CBuySellList] (например, SellList0) и четыре строковые html-страницы оформления окна; всё на NPC (myself). Ничего не возвращает.

Сигнатура

Sell( CSharedCreatureData cCreature, CBuySellList pSellList, string pwsPage0, string pwsPage1, string pwsPage2, string pwsEmptyPage )

Параметры

cCreature (CSharedCreatureData) — игрок, которому открывают окно продажи
pSellList (CBuySellList) — список товаров на продажу, выставляемый в окне
pwsPage0 (string) — html-страница оформления окна
pwsPage1 (string) — html-страница оформления окна
pwsPage2 (string) — html-страница оформления окна
pwsEmptyPage (string) — html-страница, показываемая при пустом списке

Пример

Sell(talker, SellList0, ShopName, fnHi, _blank, _blank);

ShowBuySellNPC🟢 высокая

объединённое окно купли-продажи

Открывает объединённое окно купли-продажи — более современная форма торгового окна. Принимает игрока (talker), список товаров на покупку и список на продажу (оба [CBuySellList]) и долю-курс; всё на NPC (myself). Ничего не возвращает.

Сигнатура

ShowBuySell( CSharedCreatureData pTalker, CBuySellList pBuyList, CBuySellList pSellList, float fRate )

Параметры

pTalker (CSharedCreatureData) — игрок, которому открывают окно купли-продажи
pBuyList (CBuySellList) — список товаров на покупку
pSellList (CBuySellList) — список товаров на продажу
fRate (float) — доля-курс (налог/наценка) к ценам

Пример

ShowBuySell( talker, SellList0, BuyList0, -50 );

Пример использования

if ( GetPchValue( "client_hf" ) == 1 ) {
    ShowBuySell( talker, SellList0, BuyList0, -50 );
} else {
    Sell( talker, SellList0, ShopName, fnBuy, _blank, _blank );
}

ShowMultisellNPC🟢 высокая

открыть мультиселл

Открывает игроку мультиселл — обмен по готовым рецептам — с заданным идентификатором. Принимает идентификатор рецепта (сырое число из данных мультиселла, часто это пришедший номер пункта меню) и игрока (talker); вызывается на NPC (myself). Ничего не возвращает.

Сигнатура

ShowMultisell( int nMultisellId, CSharedCreatureData c )

Параметры

nMultisellId (int) — идентификатор списка/рецепта мультиселла (сырое число из данных, часто номер пункта меню).
c (CSharedCreatureData) — игрок, которому открывают мультиселл (обычно talker).

Пример

ShowMultisell(212, talker);

Пример использования

if ( GetSSQPart( talker ) != 0 ) {
    ShowMultisell( reply, talker );
}

GiveItemByPCCafePointNPC🟢 высокая

выдать предмет за очки PC-кафе

Выдаёт игроку предмет за очки PC-кафе, списывая указанную стоимость. По декомпилю L2NPC
(CNPC::GiveItemByPCCafePoint_49224C) движок сверяет стоимость с балансом очков (не выдаст,
если не хватает), требует неотрицательных предмета/заточки/количества и шлёт выдачу пакетом
opcode 122 формата "cddddQ" (заточка — обычный int, количество — 64-битное Q). ВНИМАНИЕ:
порядок последних двух — заточка, затем количество (в прежней таблице был перепутан).
Возвращает 1 при успехе, 0 при нехватке очков/ошибке.

Сигнатура

GiveItemByPCCafePoint( CSharedCreatureData c, int nCost, int nItemClassId, int nEnchant, int64 nCount )

Параметры

c (CSharedCreatureData) — игрок, получающий предмет за очки PC-кафе.
nCost (int) — стоимость в очках PC-кафе, списываемая за выдачу (сверяется с балансом).
nItemClassId (int) — идентификатор выдаваемого предмета.
    значения — из словаря [item_pch]
nEnchant (int) — уровень заточки выдаваемого предмета (в вызовах 0; должен быть >= 0).
nCount (int64) — количество выдаваемого предмета (в вызовах 1; должно быть >= 0).

Пример

GiveItemByPCCafePoint(talker, ticket_price, event_ticket, 0, 1);

Пример использования

if ( GetDailyQuestFlag( talker, 993 ) == 1 ) {
    GiveItemByPCCafePoint( talker, ticket_price, event_ticket, 0, 1 );
    SetDailyQuestFlag( talker, 993 );
} else {
    ShowPage( talker, NotYetTime );
}

GetPCCafePointNPC🟢 высокая

сколько очков PC-кафе у игрока

Сообщает, сколько очков PC-кафе у игрока. Принимает игрока; вызывается на NPC (myself). Возвращает целое — число очков, используется как гейт перед выдачей награды.

Сигнатура

GetPCCafePoint( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, чьи очки PC-кафе запрашивают

Пример

if (GetPCCafePoint(talker) >= ticket_price) {

Пример использования

if ( i9 > -1 && enter_type > -1 && ( GetPCCafePoint( talker ) >= required_PCCafePoint || pccafe_pass_mode == 2 ) ) {
    if ( IsUserPremium( talker ) == @FALSE ) {
        ShowPage( talker, "npc_rim_maker001e.htm" );
        return;
    }
    InstantZone_Enter( talker, i9, enter_type );
}

IsPCCafeUserNPC🟢 высокая

играет ли игрок из PC-кафе

Проверяет, играет ли игрок из PC-кафе. Принимает игрока; вызывается на NPC (myself). Возвращает целое-признак (1 — играет из кафе), применяется вместе с проверкой очков.

Сигнатура

IsPCCafeUser( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, для которого проверяют признак игры из PC-кафе

Пример

if (IsPCCafeUser(target) == @TRUE)

Пример использования

if ( IsPCCafeUser( talker ) == 1 ) {
    GiveItem1( talker, cratae_reward, 5 ); 
}

CanUsePCCafePointNPC🟢 высокая

можно ли тратить очки PC-кафе

Проверяет, может ли игрок использовать очки PC-кафе. Принимает игрока; вызывается на NPC (myself). Возвращает целое-признак.

Сигнатура

CanUsePCCafePoint( CSharedCreatureData cCreature )

Параметры

    cCreature (CSharedCreatureData) — игрок, для которого проверяют возможность тратить очки PC-кафе

Пример (иллюстративный):

    CanUsePCCafePoint( talker );

UpdatePCCafePointNPC🟢 высокая

изменить очки PC-кафе

Изменяет баланс очков PC-кафе у игрока на заданную величину (положительную или отрицательную). Принимает игрока и величину изменения; вызывается на NPC (myself). Возвращает целое.

Сигнатура

UpdatePCCafePoint( CSharedCreatureData c, int nDelta )

Параметры

c (CSharedCreatureData) — игрок, чей баланс очков PC-кафе меняют.
nDelta (int) — величина изменения очков со знаком (в вызовах, напр., -1000).

Пример

if ( UpdatePCCafePoint( talker, -1000 ) == 1 || pccafe_pass_mode == 2 ) {

ShowManorDefaultInfoNPC🟢 высокая

общая сводка манора

Показывает игроку общую сводку манора. Принимает игрока; вызывается на NPC (myself) — менеджере замка. Ничего не возвращает.

Сигнатура

ShowManorDefaultInfo( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, которому показывают сводку манора

Пример использования

if ( ask == 5 ) { ShowManorDefaultInfo( talker ); } else
if ( ask == 7 ) { ShowSeedSetting( talker, state ); } else
if ( ask == 8 ) { ShowCropSetting( talker, state );  }

ShowSeedInfoNPC🟢 высокая

информация по семенам

Показывает игроку информацию по семенам манора. Принимает игрока, идентификатор манора и время; вызывается на NPC (myself). Ничего не возвращает.

Сигнатура

ShowSeedInfo( CSharedCreatureData pTalker, int nManorState, int nTime )

Параметры

pTalker     (CSharedCreatureData) — игрок, которому показывают информацию по семенам (talker).
nManorState (int) — идентификатор манора: residence_id NPC (в скриптах state/manor_id;
                    при state == -1 подставляется myself.sm.residence_id).
nTime       (int) — период/время манора. Приходит полем time из события
                    MANOR_MENU_SELECTED(talker, …, time); скриптом напрямую не задаётся.

Пример использования

if ( state == -1 ) {
    ShowSeedInfo( talker, manor_id, time );
} else {
    ShowSeedInfo( talker, state, time );
}

ShowCropInfoNPC🟢 высокая

информация по урожаю

Показывает игроку информацию по урожаю манора. Принимает игрока, идентификатор манора и время; вызывается на NPC (myself). Ничего не возвращает.

Сигнатура

ShowCropInfo( CSharedCreatureData pTalker, int nManorState, int nTime )

Параметры

pTalker     (CSharedCreatureData) — игрок, которому показывают информацию по урожаю (talker).
nManorState (int) — идентификатор манора: residence_id NPC (в скриптах state/manor_id;
                    при state == -1 подставляется myself.sm.residence_id).
nTime       (int) — период/время манора. Приходит полем time из события
                    MANOR_MENU_SELECTED(talker, …, time); скриптом напрямую не задаётся.

Пример использования

if ( state == -1 ) {
    ShowCropInfo( talker, manor_id, time );
} else {
    ShowCropInfo( talker, state, time );
}

ShowSeedSettingNPC🟢 высокая

настройка продажи семян

Показывает лорду меню настройки продажи семян. Принимает игрока и состояние; вызывается на NPC (myself). Ничего не возвращает.

Сигнатура

ShowSeedSetting( CSharedCreatureData cCreature, int nManorState )

Параметры

cCreature   (CSharedCreatureData) — лорд, которому показывают меню настройки продажи семян
nManorState (int) — состояние/режим меню (в вызовах — state/id манора)

Пример

ShowSeedSetting(talker, state);

Пример использования

if ( ask == 7 ) {
    ShowSeedSetting( talker, state );
} else 
if ( ask == 8 ) {
    ShowCropSetting( talker, state );
}

ShowCropSettingNPC🟢 высокая

настройка закупки урожая

Показывает лорду меню настройки закупки урожая. Принимает игрока и состояние; вызывается на NPC (myself). Ничего не возвращает.

Сигнатура

ShowCropSetting( CSharedCreatureData cCreature, int nManorState )

Параметры

cCreature   (CSharedCreatureData) — лорд, которому показывают меню настройки закупки урожая
nManorState (int) — состояние/режим меню (в вызовах — state/id манора)

Пример использования

if ( ask == 8 ) {
    ShowCropSetting( talker, state );
}

ShowProcureCropListNPC🟢 высокая

список закупаемого урожая

Показывает игроку список закупаемого замком урожая. Принимает игрока и идентификатор манора; вызывается на NPC (myself). Ничего не возвращает.

Сигнатура

ShowProcureCropList( CSharedCreatureData cCreature, int nManorId )

Параметры

cCreature (CSharedCreatureData) — игрок, которому показывают список закупаемого урожая
nManorId  (int) — идентификатор манора

Пример

ShowProcureCropList(talker, manor_id);

ShowProcureCropDetailNPC🟢 высокая

детали по одному урожаю

Показывает игроку детали по одной позиции закупаемого урожая. Принимает игрока и состояние; вызывается на NPC (myself). Ничего не возвращает.

Сигнатура

ShowProcureCropDetail( CSharedCreatureData cCreature, int nManorState )

Параметры

cCreature   (CSharedCreatureData) — игрок, которому показывают детали позиции урожая
nManorState (int) — состояние/выбранная позиция (в вызовах — state манора)

Пример использования

if ( ask == 9 ) {
    ShowProcureCropDetail( talker, state );
}

ShowSellSeedListNPC🟢 высокая

список продаваемых семян

Показывает игроку список продаваемых семян. Принимает игрока и идентификатор манора; вызывается на NPC (myself). Ничего не возвращает.

Сигнатура

ShowSellSeedList( CSharedCreatureData cCreature, int nManorId )

Параметры

cCreature (CSharedCreatureData) — игрок, которому показывают список продаваемых семян
nManorId  (int) — идентификатор манора

Пример

ShowSellSeedList(talker, manor_id);

Manor_GetSeedIncomeNPC🟢 высокая

доход манора от продажи семян

Сообщает накопленный доход манора от продажи семян. Аргументов нет; работает по манору
резиденции самого NPC. Возвращает 64-битное число (сумму адены из данных манора), поэтому
переполнения нет.

Сигнатура

Manor_GetSeedIncome(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

FHTML_SetInt(fhtml0, "seed_income", Manor_GetSeedIncome());

GetSeedClassidByOrderNumNPC🟢 высокая

class_id семени по номеру в списке

По выбранному замку и номеру позиции семени в его списке возвращает class_id самого предмета-семени. Список семян у каждого замка разбит по позициям (1, 2, 3, …), а стоящие в них семена имеют разные class_id — эта функция переводит «номер строки в диалоге» в реальный class_id, чтобы показать игроку название семени или сверить, что покупается именно оно. Полностью аналогична GetCropClassidByOrderNum, только для семян, а не для урожая.

Первый аргумент — id замка (манора): лорд/игрок сначала выбирает замок из меню, его номер кладётся в cookie "ManorId" и передаётся сюда. Второй аргумент — номер семени, выбранный в списке (reply). Возвращает class_id семени (0, если позиция пустая/неверная).

Сигнатура

GetSeedClassidByOrderNum( int nManorId, int nOrderNum )

Параметры

nManorId  (int) — id замка/манора, к которому относится список семян (обычно из cookie "ManorId").
nOrderNum (int) — номер позиции семени в списке замка; в диалоге это выбор игрока (`reply`).

Пример

i1 = GetSeedClassidByOrderNum( i0, reply );

GetCropClassidByOrderNumNPC🟢 высокая

class_id урожая по номеру

По выбранному замку и номеру позиции урожая в его списке возвращает class_id самого предмета-урожая. Список урожаев у каждого замка фиксирован по позициям (1, 2, 3, …), а сажать и сдавать можно предметы с разными class_id — эта функция переводит «номер строки в диалоге» в реальный class_id, чтобы затем показать игроку название урожая или сверить, что он сдаёт именно тот предмет.

Первый аргумент — id замка (манора): в диалоге лорд сначала выбирает замок из меню, номер замка кладётся в cookie "ManorId" и потом передаётся сюда. Второй аргумент — номер урожая, который игрок выбрал в списке (reply). Возвращает class_id урожая (0, если позиция пустая/неверная).

Сигнатура

GetCropClassidByOrderNum( int nManorId, int nOrderNum )

Параметры

nManorId  (int) — id замка/манора, к которому относится список урожаев (обычно берётся из cookie "ManorId").
nOrderNum (int) — номер позиции урожая в списке замка; в диалоге это выбор игрока (`reply`).

Пример

i1 = GetCropClassidByOrderNum(i0, reply);

GetCurrentSeedPriceNPC🟢 высокая

текущая цена семени

По выбранному замку и номеру семени в его списке возвращает цену, по которой замок сейчас продаёт это семя игрокам. Это действующая цена текущего периода: она уже установлена лордом и по ней идёт торговля до следующей смены настроек. Значение подставляется в HTML-поле диалога (например "CurrentSeedPrice"), чтобы игрок или лорд видел актуальную цену.

Первый аргумент — id замка (манора); в диалоге он приходит из выбора замка в меню (переменные state / i0, номер лежит в cookie "ManorId"). Второй аргумент — номер семени: либо конкретный выбор игрока (reply), либо индекс i2 при переборе всех 25 позиций для заполнения таблицы. Возвращает цену в адене.

Сигнатура

GetCurrentSeedPrice( int nManorId, int nOrderNum )

Параметры

nManorId  (int) — id замка/манора, чей прайс семян читаем (в скриптах state / i0, из меню выбора замка).
nOrderNum (int) — номер позиции семени в списке; выбор игрока (`reply`) либо индекс перебора i2 (1..25).

Пример

FHTML_SetInt( fhtml0, "CurrentSeedPrice" + i2, GetCurrentSeedPrice( state, i2 ) );

GetCurrentSeedSellCountSetNPC🟢 высокая

лимит продаж семени

По выбранному замку и номеру семени возвращает лимит продажи, установленный лордом на текущий период: сколько всего единиц этого семени замок готов продать игрокам за период. Это плановое число из настроек мануфактуры, а не остаток на складе (остаток отдаёт GetCurrentSeedRemainCount). Значение показывается в поле диалога "CurrentSeedCount".

Первый аргумент — id замка (манора); в диалоге приходит из выбора замка (state / i0). Второй аргумент — номер семени: индекс i2 при переборе всех 25 позиций для таблицы либо выбор игрока (reply).

Сигнатура

GetCurrentSeedSellCountSet( int nManorId, int nOrderNum )

Параметры

nManorId  (int) — id замка/манора, чей план продажи семян читаем (в скриптах state / i0, из меню выбора замка).
nOrderNum (int) — номер позиции семени в списке; индекс перебора i2 (1..25) либо выбор игрока (`reply`).

Пример

FHTML_SetInt( fhtml0, "CurrentSeedCount" + i2, GetCurrentSeedSellCountSet( state, i2 ) );

GetCropDefaultPriceNPC🟢 высокая

базовая цена урожая

По выбранному замку и номеру урожая возвращает базовую (стартовую) цену урожая — эталонное значение, от которого отсчитывается закупка. Это не текущая объявленная лордом цена, а базовая ставка позиции: по ней удобно показывать «рекомендованную» цену и считать плановую выручку. Пара к GetSeedDefaultPrice, который так же отдаёт базовую цену для семени; тот в диалоге вызывается как GetSeedDefaultPrice( i0, i2 ) — те же два аргумента.

Первый аргумент — id замка (манора); в диалоге приходит из выбора замка (переменные state / i0, номер в cookie "ManorId"). Второй аргумент — номер урожая: индекс i2 при переборе всех 25 позиций либо выбор игрока (reply). Возвращает цену в адене.

Сигнатура

GetCropDefaultPrice( int nManorId, int nOrderNum )

Параметры

    nManorId  (int) — id замка/манора, чью базовую цену урожая читаем (в скриптах state / i0, из меню выбора замка).
    nOrderNum (int) — номер позиции урожая в списке; индекс перебора i2 (1..25) либо выбор игрока (`reply`).

Пример (иллюстративный; прямых вызовов в собранных скриптах нет, но парная GetSeedDefaultPrice вызывается точно так же):

    i1 = GetCropDefaultPrice( i0, i2 );

GetRemainProcureCropCountNPC🟢 высокая

остаток закупки урожая

По выбранному замку и номеру урожая возвращает, сколько этого урожая замок ещё готов принять от игроков до конца периода. Замок объявляет план закупки на период; игроки сдают урожай, и это число уменьшается. Когда доходит до нуля, урожай данного вида замок больше не покупает. Значение показывается в поле диалога "RemainCropCount", чтобы игрок видел, стоит ли ещё нести урожай на сдачу.

Первый аргумент — id замка (манора); в диалоге приходит из выбора замка (переменные manor_id / state / i0). Второй аргумент — номер урожая: индекс i2 при переборе всех 25 позиций для таблицы либо выбор игрока (reply).

Сигнатура

GetRemainProcureCropCount( int nManorId, int nOrderNum )

Параметры

nManorId  (int) — id замка/манора, чей остаток закупки читаем (в скриптах manor_id / state / i0, из меню выбора замка).
nOrderNum (int) — номер позиции урожая в списке; индекс перебора i2 (1..25) либо выбор игрока (`reply`).

Пример

FHTML_SetInt( fhtml0, "RemainCropCount" + i2, GetRemainProcureCropCount( manor_id, i2 ) );

SetSeedSellPropertyNPC🟢 высокая

задать продажу семени

Сеттер к геттерам семян (GetCurrentSeedPrice / GetCurrentSeedSellCountSet): лорд задаёт для одной позиции семени, по какой цене и в каком количестве замок будет продавать это семя игрокам в следующем периоде. Именно этими значениями потом наполняются поля "NextSeedPrice"/"NextSeedCount" в диалоге, а с началом нового периода они становятся текущими.

Первый аргумент — сам лорд, который меняет настройку (через него проверяются права на манор). Дальше — какой замок и какую позицию правим, затем новая цена и новый лимит. Идентификатор замка должен быть настоящим номером замка (задавать «состояние меню» вместо него нельзя, иначе настройка не применится).

Сигнатура

SetSeedSellProperty( CSharedCreatureData cCreature, int nManorId, int nOrderNum, int64 nPrice, int64 nCount )

Параметры

    cCreature (CSharedCreatureData) — лорд (или уполномоченный клана), задающий настройку; по нему сверяются права на манор.
    nManorId  (int) — id замка/манора, чьё семя настраиваем (реальный номер замка, а не «состояние меню»).
    nOrderNum (int) — номер позиции семени в списке замка (тот же индекс, что и у геттеров семян).
    nPrice    (int64) — новая цена продажи семени игрокам (адена за единицу).
    nCount    (int64) — новый лимит продажи: сколько единиц этого семени замок выставит на период.

Пример (иллюстративный; прямых вызовов в собранных скриптах нет, порядок аргументов взят из сигнатуры и подтверждён парными геттерами):

    SetSeedSellProperty( talker, i0, reply, i_price, i_count );

SetCropProcurePropertyNPC🟢 высокая

задать закупку урожая

Сеттер к геттерам урожая (GetProcurementRate / GetProcurementCount / GetProcurementType и GetRemainProcureCropCount): лорд задаёт для одной позиции урожая, по какой цене и в каком объёме замок будет скупать этот урожай у игроков в следующем периоде. Эти значения потом видны в диалоге как "NextProcurePrice"/"NextProcureCount"/"NextProcureType", а с началом нового периода определяют, сколько урожая замок примет.

Первый аргумент — сам лорд (через него проверяются права на манор). Дальше — какой замок и какую позицию урожая правим, затем цена закупки, отдельный параметр «тип закупки» и объём. Отдельный параметр (nArg) у урожая соответствует «типу закупки», который на чтение отдаёт GetProcurementType (например, форма оплаты/режим приёма); отличие от семян в том, что у урожая эта настройка есть, а у семян её нет — поэтому в сигнатуре появляется лишний int между ценой и количеством.

Порядок аргументов — «цена (64-битная) → тип → количество (64-битное)»; id манора принимается в диапазоне 1..40. Прямых вызовов в собранных скриптах нет, но раскладка и наличие отдельного «типа закупки» между ценой и объёмом подтверждены и согласуются с парным сеттером семян SetSeedSellProperty (у семян «типа» нет).

Сигнатура

SetCropProcureProperty( CSharedCreatureData cCreature, int nManorId, int nOrderNum, int64 nPrice, int nArg, int64 nCount )

Параметры

    cCreature (CSharedCreatureData) — лорд (или уполномоченный клана), задающий настройку; по нему сверяются права на манор.
    nManorId  (int) — id замка/манора, чью закупку урожая настраиваем (реальный номер замка).
    nOrderNum (int) — номер позиции урожая в списке замка (тот же индекс, что и у геттеров закупки).
    nPrice    (int64) — цена закупки урожая (адена за единицу), которую замок предложит игрокам.
    nArg      (int) — тип/режим закупки для этой позиции (значение того же смысла, что отдаёт GetProcurementType).
    nCount    (int64) — объём закупки: сколько единиц этого урожая замок готов принять за период.

Пример (иллюстративный — прямых вызовов в собранных скриптах нет):

    SetCropProcureProperty( talker, i0, reply, i_price, i_type, i_count );

GiveItemByCastleSiegeDefenceNPC🟢 высокая

награда за защиту замка в осаде

Обменивает накопленный кланом «счётчик защиты замка» на награду: списывает у клана игрока
nConsume единиц этого счётчика и выдаёт игроку предмет. Требует, чтобы игрок был главой клана,
а счётчик защиты его клана был не меньше nConsume; иначе выдача не происходит. Счётчик копится
за участие клана в защите замка в осадах и читается через GetPledgeCastleSiegeDefenceCount.

Сигнатура

GiveItemByCastleSiegeDefence( CSharedCreatureData cCreature, int nConsume, int nItemClassId, int nEnchant, int64 nCount )

Параметры

cCreature    (CSharedCreatureData) — игрок (глава клана), получающий награду; его клан
               должен иметь счётчик защиты >= nConsume.
nConsume     (int) — сколько единиц «счётчика защиты замка» списать у клана (в примере —
               весь накопленный счётчик i0).
nItemClassId (int) — класс выдаваемого предмета (медаль за защиту); значения из словаря [item_pch].
nEnchant     (int) — заточка/доп-поле выдаваемого предмета (в примере 0).
nCount       (int64) — количество выдаваемого предмета (в примере i0 — по медали за каждую
               единицу счётчика).

Пример

GiveItemByCastleSiegeDefence(talker, i0, item_medal, 0, i0);

Пример использования

i0 = GetPledgeCastleSiegeDefenceCount( talker );
if ( i0 == 0 ) {
    ShowPage( talker, fnNoReward );
    return;
}
GiveItemByCastleSiegeDefence( talker, i0, item_medal, 0, i0 );

Манор: семена и урожай (Manor / Seeds)

13 функций

GetProcurementCountNPC🟢 высокая

сколько урожая закуплено в текущем цикле

Геттер аграрной системы манора (CNPC). Возвращает int — объём урожая, закупленного резиденцией в текущем цикле для семени типа nSeedType при состоянии nManorState. Значение вставляют в HTML-меню манор-менеджера.

Сигнатура

GetProcurementCount( int nManorState, int nSeedType )

Параметры

nManorState (int) — состояние/период манора. В реальных вызовах = 1 (переменные manor_id/state
                    инициализируются единицей); отдельных @-констант для него нет.
nSeedType   (int) — тип культуры = порядковый индекс 1..25, перебираемый циклом for i2=1..25
                    при построении HTML-меню манора.

Пример

FHTML_SetInt( fhtml0, "CurrentCropProcureCount" + i2, GetProcurementCount( manor_id, i2 ) );

GetProcurementRateNPC🟢 высокая

цена/рейт закупки урожая

Геттер манора (CNPC). По состоянию nManorState и типу семени nSeedType возвращает int — цену (рейт) закупки урожая в текущем цикле. Используется для отрисовки текущих цен в меню.

Сигнатура

GetProcurementRate( int nManorState, int nSeedType )

Параметры

nManorState (int) — состояние/период манора. В реальных вызовах = 1 (переменные manor_id/state
                    инициализируются единицей); отдельных @-констант для него нет.
nSeedType   (int) — тип культуры = порядковый индекс 1..25, перебираемый циклом for i2=1..25
                    при построении HTML-меню манора.

Пример

FHTML_SetInt( fhtml0, "CurrentCropPrice" + i2, GetProcurementRate( manor_id, i2 ) );

GetProcurementTypeNPC🟢 высокая

тип/признак закупки урожая

Геттер манора (CNPC). По nManorState и nSeedType возвращает int — тип (признак) закупки урожая текущего цикла. Идёт в HTML-меню рядом с количеством и ценой.

Сигнатура

GetProcurementType( int nManorState, int nSeedType )

Параметры

nManorState (int) — состояние/период манора. В реальных вызовах = 1 (переменные manor_id/state
                    инициализируются единицей); отдельных @-констант для него нет.
nSeedType   (int) — тип культуры = порядковый индекс 1..25, перебираемый циклом for i2=1..25
                    при построении HTML-меню манора.

Пример

FHTML_SetInt( fhtml0, "CurrentProcureType" + i2, GetProcurementType( manor_id, i2 ) );

GetNextProcurementCountNPC🟢 высокая

прогноз объёма закупки на следующий цикл

Геттер манора (CNPC). По состоянию nManorState и типу семени nSeedType возвращает int — запланированный объём закупки урожая на следующий цикл.

Сигнатура

GetNextProcurementCount( int nManorState, int nSeedType )

Параметры

nManorState (int) — состояние/период манора. В реальных вызовах = 1 (переменные manor_id/state
                    инициализируются единицей); отдельных @-констант для него нет.
nSeedType   (int) — тип культуры = порядковый индекс 1..25, перебираемый циклом for i2=1..25
                    при построении HTML-меню манора.

Пример

FHTML_SetInt( fhtml0, "NextProcureCount" + i2, GetNextProcurementCount( state, i2 ) );

GetNextSeedPriceNPC🟢 высокая

цена семени на следующий период

Геттер манора (CNPC). По состоянию nManorState и типу семени nSeedType возвращает int — цену продажи семени, установленную на следующий период.

Сигнатура

GetNextSeedPrice( int nManorState, int nSeedType )

Параметры

nManorState (int) — идентификатор манора: residence_id NPC (в скриптах переменные manor_id/state/i0,
                    обычно = 1; при state == -1 подставляется myself.sm.residence_id).
nSeedType   (int) — тип культуры = порядковый индекс 1..25 (перебирается циклом for i2=1..25).

Пример

FHTML_SetInt( fhtml0, "NextSeedPrice" + i2, GetNextSeedPrice( state, i2 ) );

GetSeedDefaultPriceNPC🟢 высокая

базовая цена семени

Геттер манора (CNPC). По nManorState и nSeedType возвращает int — базовую (дефолтную) цену семени, от которой отсчитываются настройки продажи.

Сигнатура

GetSeedDefaultPrice( int nManorState, int nSeedType )

Параметры

nManorState (int) — идентификатор манора: residence_id NPC (в скриптах переменные manor_id/state/i0,
                    обычно = 1; при state == -1 подставляется myself.sm.residence_id).
nSeedType   (int) — тип культуры = порядковый индекс 1..25 (перебирается циклом for i2=1..25).

Пример

FHTML_SetInt( fhtml0, "DefaultSeedPrice" + i2, GetSeedDefaultPrice( i0, i2 ) );

GetNextSeedSellCountSetNPC🟢 высокая

план продажи семян (следующий период)

По выбранному замку и номеру семени возвращает лимит продажи, заданный на СЛЕДУЮЩИЙ период: сколько единиц этого семени замок выставит на продажу, когда наступит новый цикл мануфактуры. Это пара к GetCurrentSeedSellCountSet (тот отдаёт лимит текущего периода) — в диалоге настройки их показывают рядом («сейчас» и «станет»), чтобы лорд видел, что он поменял. Значение подставляется в поле "NextSeedCount".

Первый аргумент — id замка (манора); в диалоге приходит из выбора замка (state / i0). Второй аргумент — номер семени: индекс i2 при переборе всех 25 позиций для таблицы либо выбор игрока (reply).

Сигнатура

GetNextSeedSellCountSet( int nManorId, int nOrderNum )

Параметры

nManorId  (int) — id замка/манора, чей план на следующий период читаем (в скриптах state / i0, из меню выбора замка).
nOrderNum (int) — номер позиции семени в списке; индекс перебора i2 (1..25) либо выбор игрока (`reply`).

Пример

FHTML_SetInt( fhtml0, "NextSeedCount" + i2, GetNextSeedSellCountSet( state, i2 ) );

GetCurrentSeedRemainCountNPC🟢 высокая

остаток семян текущего периода

Геттер манора (CNPC). По состоянию nManorState и типу семени nSeedType возвращает int — непроданный остаток семян за текущий период.

Сигнатура

GetCurrentSeedRemainCount( int nManorState, int nSeedType )

Параметры

nManorState (int) — идентификатор манора: residence_id NPC (в скриптах переменные manor_id/state/i0,
                    обычно = 1; при state == -1 подставляется myself.sm.residence_id).
nSeedType   (int) — тип культуры = порядковый индекс 1..25 (перебирается циклом for i2=1..25).

Пример

FHTML_SetInt( fhtml0, "CurrentSeedRemain" + i2, GetCurrentSeedRemainCount( state, i2 ) );

GetMaxSellableCountNPC🟢 высокая

максимум семян к продаже

Геттер манора (CNPC). По nManorState и nSeedType возвращает int — максимально допустимое количество семян к продаже.

Сигнатура

GetMaxSellableCount( int nManorState, int nSeedType )

Параметры

nManorState (int) — идентификатор манора: residence_id NPC (в скриптах переменные manor_id/state/i0,
                    обычно = 1; при state == -1 подставляется myself.sm.residence_id).
nSeedType   (int) — тип культуры = порядковый индекс 1..25 (перебирается циклом for i2=1..25).

Пример

FHTML_SetInt( fhtml0, "MaxSell" + i2, GetMaxSellableCount( i0, i2 ) );

IsManorSettingTimeNPC🟢 высокая

идёт ли период настройки манора

Предикат манора (CNPC) без аргументов. Возвращает 1, если сейчас идёт период настройки манора
(цен/планов), иначе 0. По декомпилю окно настройки — это время суток вне промежутка 8..19 часов
(то есть с 20:00 до 07:59). По нему меню решает, разрешать ли правку параметров.

Сигнатура

IsManorSettingTime(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if ( IsManorSettingTime( ) == 1 ) {

Пример использования

if ( IsManorSettingTime( ) == 0 ) {
    FHTML_SetFileName( fhtml0, "manor_crop_client_info_next.htm" );
}

SellPreviewNPC🟢 высокая

предпросмотр списка продажи

Метод манор-/торгового меню (CNPC). Показывает существу c предпросмотр списка продажи: аргументы — список товаров (CBuySellList) и три строки оформления страницы (sPage0..sPage2).

Сигнатура

SellPreview( CSharedCreatureData cCreature, CBuySellList pSellList, string pwsPage0, string pwsPage1, string pwsPage2, string pwsEmptyPage )

Параметры

cCreature (CSharedCreatureData) — существо (игрок), которому показывается предпросмотр продажи
pSellList (CBuySellList) — список выставляемых на продажу товаров
pwsPage0 (string) — первая строка оформления страницы меню
pwsPage1 (string) — вторая строка оформления страницы меню
pwsPage2 (string) — третья строка оформления страницы меню
pwsEmptyPage (string) — текст, показываемый при пустом списке продажи

Пример

SellPreview( talker, SellList0, ShopName, fnBuy, _blank, _blank );

Пример использования

if ( reply == 2 ) {
    SellPreview( talker, SellPreview1, ShopName, fnBuy, _blank, _blank ); 
}

GetNextProcurementRateNPC🟢 высокая

цена закупки следующего товара манора

Возвращает цену закупки очередного товара манора. Принимает состояние (state) и
номер позиции; вызывается на myself и обычно подставляется в HTML-поле.
Работает в паре с GetNextProcurementType.

Сигнатура

GetNextProcurementRate( int nManorState, int nSeedType )

Параметры

nManorState (int) — состояние/период манора. В реальных вызовах = 1 (переменные manor_id/state
                    инициализируются единицей); отдельных @-констант для него нет.
nSeedType   (int) — тип культуры = порядковый индекс 1..25, перебираемый циклом for i2=1..25
                    при построении HTML-меню манора.

Пример

FHTML_SetInt( fhtml0, "NextProcurePrice" + i2, GetNextProcurementRate( state, i2 ) );

GetNextProcurementTypeNPC🟢 высокая

тип закупки манора по позиции

Возвращает тип закупаемого товара манора (семена/урожай). Принимает состояние
(state) и номер позиции; вызывается на myself. Работает в паре с
GetNextProcurementRate, обычно для вывода в HTML.

Сигнатура

GetNextProcurementType( int nManorState, int nSeedType )

Параметры

nManorState (int) — состояние/период манора. В реальных вызовах = 1 (переменные manor_id/state
                    инициализируются единицей); отдельных @-констант для него нет.
nSeedType   (int) — тип культуры = порядковый индекс 1..25, перебираемый циклом for i2=1..25
                    при построении HTML-меню манора.

Пример

FHTML_SetInt( fhtml0, "NextProcureType" + i2, GetNextProcurementType( state, i2 ) );

Свадьбы (Marriage)

2 функций

MarryNPC🟢 высокая

оформить брак между двумя персонажами

Оформляет брак между двумя персонажами по их индексам. Принимает два индекса
(idx1, idx2), обычно полученные через GetIndexFromCreature; ничего не возвращает.

Сигнатура

Marry( int nChar1Index, int nChar2Index )

Параметры

nChar1Index (int) — индекс первого вступающего в брак персонажа
nChar2Index (int) — индекс второго вступающего в брак персонажа

Пример

Marry( GetIndexFromCreature(myself.c_ai0), GetIndexFromCreature(myself.c_ai1) );

DivorceNPC🟢 высокая

расторгнуть брак игрока

Расторгает брак: снимает статус брака для игрока. Принимает индекс игрока
(user_idx), обычно полученный через GetIndexFromCreature; ничего не возвращает.

Сигнатура

Divorce( int nCharIndex )

Параметры

nCharIndex (int) — индекс игрока, у которого расторгается брак

Пример

Divorce( GetIndexFromCreature( talker ) );

Пример использования

if ( myself.i_ai0 == 0 ) {
    Divorce( GetIndexFromCreature( talker ) );
    ShowPage( talker, "sia_wedding012a.htm" ); 
}

УТИЛИТЫ — СТРОКИ, ЧИСЛА, ПРОВЕРКИ (Utility)

12 функций

RandGLOBAL🟢 высокая

случайное целое число

Возвращает случайное целое в диапазоне от нуля до значения [base] минус единица.
Принимает единственный аргумент [base] (верхняя граница, исключительно), namespace не
задан. На этой функции держится вся вероятностная логика — шансы дропа и реплик,
разброс заточки, случайные ветвления.

Сигнатура

Rand( int base )

Параметры

base (int) — верхняя граница (исключительно).

Пример

i0 = Rand( 4 );

Пример использования

if ( MoveAroundSocial1 > 0 && Rand( 100 ) < 40 ) {
    AddEffectActionDesire( myself.sm, 2, ( ( MoveAroundSocial1 * 1000 ) / 30 ), 50 );
}

MakeFStringGLOBAL🟢 высокая

сборка локализованной строки

Собирает строку из локализованной NPC-string с идентификатором [id], подставляя до
пяти параметров [p1]..[p5]. Аргументы: [id] (id строки клиента) и пять строковых
подстановок, namespace не задан; возвращает готовый текст, который обычно передают в
Say, Shout или FHTML. Неиспользуемые параметры оставляют пустыми (_blank или
пустая строка), а вызовы можно вкладывать друг в друга.

Откуда берётся id: сами строки лежат в файле fstring.txt хроники — по id из
вызова там находится текст (например, 1001000 = «The Kingdom of Aden»,
1001100 = «The Kingdom of Elmore»; отсюда идиома MakeFString(1001000 +
myself.sm.residence_id, ...) — имя владения по номеру резиденции).

Сигнатура

MakeFString( int id, string pwsValue1, string pwsValue2, string pwsValue3, string pwsValue4, string pwsValue5 )

Параметры

id (int) — id строки клиента.
pwsValue1 (string) — первая строковая подстановка в шаблон (вместо [p1]); пусто — `_blank`
pwsValue2 (string) — вторая строковая подстановка (вместо [p2]); пусто — `_blank`
pwsValue3 (string) — третья строковая подстановка (вместо [p3]); пусто — `_blank`
pwsValue4 (string) — четвёртая строковая подстановка (вместо [p4]); пусто — `_blank`
pwsValue5 (string) — пятая строковая подстановка (вместо [p5]); пусто — `_blank`

Пример

Say( MakeFString( 33413, "", "", "", "", "" ) );

MakeFStringMultiGLOBAL🟢 высокая

локализованная строка с привязкой к существу

Работает как MakeFString, но дополнительно принимает существо [c] — судя по всему,
для мультиязычной подстановки под язык или локаль конкретного игрока. Аргументы: [c]
(для кого строится строка), [id] (id строки) и пять строковых подстановок
[p1]..[p5], namespace не задан; возвращает собранную строку. Прямых вызовов в коде не
извлечено.

Сигнатура

MakeFStringMulti( CSharedCreatureData c, int id, string pwsValue1, string pwsValue2, string pwsValue3, string pwsValue4, string pwsValue5 )

Параметры

    c (CSharedCreatureData) — для кого строится строка (язык/контекст).
    id (int) — id строки.
    pwsValue1 (string) — первая строковая подстановка в шаблон (вместо [p1]); пусто — `_blank`
    pwsValue2 (string) — вторая строковая подстановка (вместо [p2]); пусто — `_blank`
    pwsValue3 (string) — третья строковая подстановка (вместо [p3]); пусто — `_blank`
    pwsValue4 (string) — четвёртая строковая подстановка (вместо [p4]); пусто — `_blank`
    pwsValue5 (string) — пятая строковая подстановка (вместо [p5]); пусто — `_blank`

Пример (иллюстративный):

    MakeFStringMulti( talker, id, "", "", "", "", "" );

IntToStrGLOBAL🟢 высокая

число в текст

Преобразует целое число в текст для вставки в реплики и HTML-окна. Принимает
единственный аргумент [nValue] (исходное число), namespace не задан; возвращает
строковое представление.

Сигнатура

IntToStr( int nValue )

Параметры

nValue (int) — целое число, которое надо превратить в текст

Пример

FHTML_SetStr( fhtml0, "p_member_count0", IntToStr( i1 ) );

StrToIntGLOBAL🟢 высокая

текст в число

Разбирает текст обратно в целое число — используется при разборе строковых
параметров. Принимает единственный аргумент [sValue] (исходная строка), namespace не
задан; возвращает целое число.

Сигнатура

StrToInt( string sValue )

Параметры

sValue (string) — исходная строка, которую разбирают в целое число

Пример

i2 = StrToInt( s0 );

Пример использования

if ( StrToInt( s0 ) == 2 ) {
    FHTML_SetStr( fhtml0, "Winner", MakeFString( 1000311, "", "", "", "", "" ) );
} else {
    FHTML_SetStr( fhtml0, "Winner", "" );
}

FloatToIntGLOBAL🟢 высокая

дробное число в целое

Преобразует дробное число в целое (усечение либо округление). Принимает единственный
аргумент [fValue] (исходное дробное значение), namespace не задан; возвращает целое
число. Особенно часто нужна для координат: позиция существа хранится дробной, а
функции спауна и телепорта ждут целые числа.

Сигнатура

FloatToInt( float fValue )

Параметры

fValue (float) — исходное дробное значение, которое усекают/округляют до целого

Пример

x = FloatToInt(speller.x);

Пример использования

if ( FloatToInt( ( ( attacker.hp / attacker.max_hp ) * 100 ) ) < 20 && Rand( 100 ) < 3 && attacker.is_pc == 1 ) {
    CreateOnePrivateEx( HelpHeroSilhouette, HelpHeroAI, 0, 0, ( FloatToInt( myself.sm.x ) + 80 ), ( FloatToInt( myself.sm.y ) + 80 ), FloatToInt( myself.sm.z ), 0, 0, 0, GetIndexFromCreature( myself.sm ) );
}

GetIndexFromCreatureGLOBAL🟢 высокая

числовой идентификатор существа

Возвращает числовой индекс или идентификатор объекта существа [c]. Принимает
единственный аргумент [c] (существо), namespace не задан; возвращает int. Нужна там,
где функция принимает не существо, а int-id цели или владельца — например, владелец
спауна либо цель умения, заданная числом.

Сигнатура

GetIndexFromCreature( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо.

Пример

i0 = GetIndexFromCreature( last_attacker );

IsNullGLOBAL🟢 высокая

общая проверка на пустоту

Проверяет произвольный объект на «пусто/недействительно». Принимает единственный
аргумент [o] (объект), namespace не задан; возвращает единицу, если объект пуст или
невалиден, иначе ноль. Обязательна перед обращением к полям объекта, чтобы не словить
ошибку на отсутствующем значении.

Сигнатура

IsNull( object obj )

Параметры

obj (object) — произвольный объект, проверяемый на пусто/недействительно

Пример

if (IsNull(item0) == 0) {

Пример использования

while ( IsNull( code_info = always_list.Next( ) ) == 0 ) {
}

IsNullCreatureNPC🟢 высокая

проверка существа на пустоту

Типизированная проверка существа на «пусто/недействительно», принадлежит самому NPC.
Принимает единственный аргумент [c] (существо), namespace не задан; возвращает
единицу при пустом или невалидном существе, иначе ноль. Применяется перед обращением
к полям цели.

Сигнатура

IsNullCreature( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, проверяемое на пусто/недействительно

Пример

if (IsNullCreature(c0) == 0) {

Пример использования

if ( IsNullCreature( myself.boss ) == 0 && DistFromMe( myself.boss ) > 500 && myself.boss.alive != 0 && myself.p_state != 3 ) {
    InstantTeleport( myself.sm, FloatToInt( myself.boss.x ), FloatToInt( myself.boss.y ), FloatToInt( myself.boss.z ) );
}

IsNullPartyNPC🟢 высокая

проверка группы на пустоту

Типизированная проверка группы (пати) на «пусто/недействительно». Принимает
единственный аргумент [p] (группа), namespace не задан; возвращает единицу при пустой
или невалидной группе, иначе ноль.

Сигнатура

IsNullParty( CSharedPartyData p )

Параметры

p (CSharedPartyData) — группа (пати), проверяемая на пусто/недействительно.

Пример

if (IsNullParty(party0) == @FALSE)

Пример использования

if ( IsNullParty( party0 ) == 0 ) {
    myself.i_ai0 = party0.id;
}

IsNullStringNPC🟢 высокая

проверка строки на пустоту

Типизированная проверка строки на «пусто/недействительно». Принимает единственный
аргумент [s] (строка), namespace не задан; возвращает единицу при пустой или
невалидной строке, иначе ноль.

Сигнатура

IsNullString( string s )

Параметры

s (string) — строка, проверяемая на пусто/недействительно.

Пример

if (IsNullString(s0) == @TRUE) {

Пример использования

if ( IsNullString( DoorName ) == 0 ) {
    Castle_GateOpenClose2( DoorName, 0 );
}

IsNullHateInfoNPC🟢 высокая

проверка инфо-агро на пустоту

Типизированная проверка информации об агрессии (инфо-агро) на «пусто/недействительно».
Принимает единственный аргумент [h] (инфо-агро), namespace не задан; возвращает
единицу при пустом или невалидном значении, иначе ноль.

Сигнатура

IsNullHateInfo( CHateInfo h )

Параметры

h (CHateInfo) — запись информации об агрессии (инфо-агро), проверяемая на пусто/недействительно.

Пример

if (IsNullHateInfo(h0) == @FALSE)

Пример использования

if (IsNullHateInfo(h0) == @TRUE || h0.hate <= 0)
{
    h0 = GetMaxHateInfo(0);
}

ВРЕМЯ И КАЛЕНДАРЬ (Time / DateTime)

5 функций

GetTimeOfDayGLOBAL🟢 высокая

текущее время сервера (Unix-секунды)

Это НЕ «часть суток», как можно подумать по имени. Функция берёт системное время
сервера и возвращает его как количество секунд, прошедших с 1 января 1970 года
(Unix-таймстамп). Аргументов нет, вызывается на gg. Нужна для арифметики со
сроками: разность с граничной меткой даёт «сколько секунд осталось». Классический
приём — GetTimeOfSSQ(1) - GetTimeOfDay() — сколько секунд до конца периода Семи
Печатей. День или ночь этой функцией НЕ узнают — для этого есть
GetL2Time(@L2F_IS_NIGHT) (см. ниже) или GetTimeHour. Этим же таймстампом
кормят GetDateTime, чтобы разобрать «сейчас» на год/месяц/час и т. д.

Сигнатура

GetTimeOfDay(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

i0 = GetTimeOfDay( );
i6 = GetTimeOfDay( );

Пример использования

if ( ( ( ( i0 >= 0 && i0 < 18 ) || ( i0 >= 20 && i0 < 38 ) ) || ( i0 >= 40 && i0 < 58 ) ) || ( GetTimeOfSSQ( 1 ) - GetTimeOfDay( ) ) <= 120 ) {
    ShowPage( talker, "ssq_main_event_acolyte_q0505_22.htm" );
    RemoveMemo( talker, @blood_offering );
    return;
}

GetDateTimeGLOBAL🟢 высокая

разбор даты-времени на поле

Разбирает дату-время на отдельный компонент и возвращает его числом. Первый
аргумент — метка времени: ноль означает «сейчас», ненулевое — конкретный момент,
например срок истечения украшения замка. Второй аргумент выбирает компонент
(год, месяц, день, час, минуту, секунду или день недели). Вызывается на глобальном
объекте gg; для дня недели вернёт число от нуля (воскресенье) до шести (суббота).

Сигнатура

GetDateTime( int nTime, int nField )

Параметры

nTime  (int) — метка времени: 0 = текущее время; >0 = конкретный момент (напр. срок истечения).
nField (int) — какой компонент извлечь (подтверждено декомпилем движка):
    0 год · 1 месяц · 2 день · 3 час · 4 минута · 5 секунда · 6 день недели (0=вс … 6=сб)

Пример

i0 = GetDateTime( 0, 3 );

Пример использования

i0 = GetDateTime( 0, 4 );
if ( i0 > 49 && i0 < 60 ) {
    Say( MakeFString( 1010552, "", "", "", "", "" ) );
    return;
}

GetL2TimeGLOBAL🟢 высокая

компонент игрового времени мира

Возвращает компонент игрового времени L2 (внутриигровые сутки идут быстрее
реальных). Вызывается на gg. Единственный аргумент — не «день/ночь», а НОМЕР
ПОЛЯ, которое нужно получить; коды берут из [manual_pch] (одинаковы во всех
хрониках):

@L2F_HOUR = 0 — игровой час
@L2F_MIN = 1 — игровая минута
@L2F_IS_NIGHT = 2 — ночь ли сейчас: 1 = ночь, 0 = день

То есть GetL2Time(@L2F_IS_NIGHT) — самый удобный способ проверить «сейчас ночь?»:
вернёт 1 ночью и 0 днём. GetL2Time(@L2F_HOUR) — то же, что GetTimeHour().
Не путать с GetTimeOfDay (та отдаёт сырой серверный таймстамп в секундах).

Сигнатура

GetL2Time( int nField )

Параметры

nField (int) — какое поле времени вернуть: @L2F_HOUR(0) / @L2F_MIN(1) / @L2F_IS_NIGHT(2)

Пример

i1 = GetL2Time(@L2F_MIN);

Пример использования

i0 = GetL2Time(@L2F_IS_NIGHT);
if (i0 == 0)    //День
{
    Despawn();
}

GetLifeTimeNPC🟢 высокая

сколько секунд NPC жив

Возвращает, сколько секунд NPC прожил с момента появления. Аргументов нет,
вызывается на myself. Самое частое применение — «выдержка» после спавна: первые
несколько секунд монстр не агрится и не двигается, чтобы успеть осмотреться;
порог берут либо числом, либо из параметра класса.

Сигнатура

GetLifeTime(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if ( GetLifeTime( ) > 7 ) {

Пример использования

if ( GetLifeTime( ) >= ( Rand( 5 ) + 3 ) && InMyTerritory( myself.sm ) ) {
    AddAttackDesire( creature, @AMT_MOVE_TO_TARGET, 200 );
}

GetTimeHourNPC🟢 высокая

текущий игровой час

Возвращает текущий игровой час (0..23) по ускоренному внутриигровому клоку — то же
самое, что GetL2Time(@L2F_HOUR). Аргументов нет, вызывается на myself. В старых
скриптах «день или ночь» проверяют порогом (час пять и больше — день, меньше — ночь),
но надёжнее спросить напрямую GetL2Time(@L2F_IS_NIGHT) (вернёт 1 ночью, 0 днём).
Не путать с GetTimeOfDay — та отдаёт сырой серверный таймстамп в секундах.

Сигнатура

GetTimeHour(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if (GetTimeHour() < 5)

Пример использования

if (GetTimeHour() < 6)
{
    CreateOnePrivateEx(@sf_halloween21_vampire1 + Rand(4), "sf_halloween21_vampire", 0, 0, FloatToInt(myself.sm.x + 30), FloatToInt(myself.sm.y + 30), FloatToInt(myself.sm.z), 0, 0, 0, 0);
    CreateOnePrivateEx(@sf_halloween21_vampire1 + Rand(4), "sf_halloween21_vampire", 0, 0, FloatToInt(myself.sm.x - 30), FloatToInt(myself.sm.y - 30), FloatToInt(myself.sm.z), 0, 0, 0, 0);
}

ХРАНИЛИЩА СОСТОЯНИЯ (GlobalMap / DBSavingMap / DBValue)

8 функций

RegisterDBSavingMapGLOBAL🟢 высокая

записать значение в сохраняемую карту

Записывает пару «ключ — число» в персистентную карту, значение которой сохраняется
в БД и переживает перезапуск; применяется для счётчиков, которые нельзя терять.
Принимает аргументы (int key, int value) в namespace gg (CGlobalObject);
возвращает целое число.
Связанное событие: чтение (LoadDBSavingMap) отвечает событием LOAD_DBSAVING_MAP_RETURNED(i0=key, i1=value) (см. NASC_HANDLERS).

Сигнатура

RegisterDBSavingMap( int nMapKey, int nValue )

Параметры

nMapKey (int) — ключ карты: константа @gm_* [manual_pch] либо сырое число.
nValue  (int) — число, сохраняемое в персистентной карте БД под этим ключом.

Пример

RegisterDBSavingMap(@gm_supply_box, i2);

Пример использования

if ( myself.i_ai2 == 1 ) {
    RegisterDBSavingMap( GM_ID1, Castle_GetRawSystemTime( ) );
    myself.i_ai0 = Castle_GetRawSystemTime( );
    myself.i_ai1 = 0;
    myself.i_ai2 = 2;
}

GetDBSavingMapGLOBAL🟢 высокая

прочитать значение из сохраняемой карты

Читает число, сохранённое по ключу в персистентной карте в БД. Принимает аргумент
(int key) в namespace gg (CGlobalObject); возвращает сохранённое число.

Сигнатура

GetDBSavingMap( int nMapKey )

Параметры

nMapKey (int) — ключ карты: константа @gm_* [manual_pch] либо сырое число.

Пример

i1 = GetDBSavingMap(@gm_supply_box);

Пример использования

i1 = GetDBSavingMap(@gm_supply_carriage);
if ((i1 % 10) >= 1) {
    i2 = i1 - 1;
    RegisterDBSavingMap(19, i2);
}

LoadDBSavingMapGLOBAL🟢 высокая

подгрузить сохранённые данные существа из БД

Инициирует АСИНХРОННУЮ загрузку сохранённой карты данных существа из базы (по идентификатору
персонажа). Первый аргумент — существо, чьи данные грузить, — определяет, чью запись поднять
из БД. Прямого значения функция НЕ возвращает: результат приходит отдельным событием, после
чего данные доступны через Get-функции. Поэтому в скриптах Load лишь запускает подгрузку в
кэш, а читают уже потом. Вызывается на gg.

Сигнатура

LoadDBSavingMap( CSharedCreatureData cCreature, int nMapKey )

Параметры

cCreature (CSharedCreatureData) — существо, в контексте которого подгружают значение.
nMapKey   (int) — ключ карты: константа @gm_* [manual_pch] либо сырое число.

Пример

    LoadDBSavingMap(myself.sm, @gm_hot_spot);

Связанное событие: ответ сервера приходит событием LOAD_DBSAVING_MAP_RETURNED (см. NASC_HANDLERS).

RegisterSharedGlobalMapGLOBAL🟢 высокая

карта с расширенной областью видимости

Общий на всех «журнал» вида «ключ → число», через который разные NPC (в том числе из разных
скриптов) договариваются между собой. Работает как доска объявлений: под уникальным ключом
записывают одно число, потом кто угодно может это число прочитать, а когда надобность отпала —
запись стирают.

На практике это реестр «кто сейчас исполняет роль X». Типичный приём с рейд-боссами: при
появлении босс регистрирует под своим ключом-константой свой id — RegisterSharedGlobalMap
(@ghost_of_orfen, myself.sm.id)
. Другой NPC потом спрашивает GetSharedGlobalMap(@ghost_of_orfen):
если вернулось число больше нуля, значит босс жив и это его id — по нему берут само существо
(GetCreatureFromID) и, например, шлют ему сигнал. Когда босс умирает или уходит, он
UnregisterSharedGlobalMap(@ghost_of_orfen) очищает запись, и следующая проверка вернёт 0
(«никого нет»). Так одни мобы узнают, жив ли босс и где он, не имея на него прямой ссылки.

- RegisterSharedGlobalMap(key, value) — записать под ключом key число value (обычно id NPC). Без возврата.
- GetSharedGlobalMap(key) — прочитать число, записанное под ключом key; 0, если под ключом никого/ничего нет.
- UnregisterSharedGlobalMap(key) — стереть запись под ключом key.

Ключ — это осмысленная константа-имя (@ghost_of_orfen, @zaken, @dent и т. п.), одинаковая у
всех, кто общается через эту доску. Значение — целое число, чаще всего id того NPC, который
«застолбил» роль под этим ключом.

Сигнатура

RegisterSharedGlobalMap( int key, int value )
GetSharedGlobalMap( int key )
UnregisterSharedGlobalMap( int key )

Параметры

key (int) — общий ключ-имя роли (константа @…), под которым идёт запись/чтение.
value (int) — записываемое число, обычно id NPC, занявшего роль (только у Register).

Пример

RegisterSharedGlobalMap( @ghost_of_orfen, myself.sm.id );
i0 = GetSharedGlobalMap( @ghost_of_orfen );
UnregisterSharedGlobalMap( @ghost_of_orfen );

Пример использования

i0 = GetSharedGlobalMap( @zaken );
if ( i0 > 0 ) {
    c0 = GetCreatureFromID( i0 );
    if ( IsNullCreature( c0 ) == @FALSE ) {
        SendScriptEvent( c0, @zaken, 111 ); // сообщаем зарегистрированному NPC о событии
    }
}

RegisterGlobalMapNPC🟢 высокая

записать значение в глобальную карту

Записывает пару «ключ — число» в серверный кэш в памяти, которым NPC обмениваются
состоянием на лету. Принимает аргументы (int key, int value) в namespace myself
(CNPC); ничего не возвращает. Кэш сбрасывается при перезапуске сервера.

Сигнатура

RegisterGlobalMap( int key, int value )

Параметры

key (int) — ключ записи в серверный кэш состояния
value (int) — число, сохраняемое в глобальной карте под заданным ключом

Пример

RegisterGlobalMap(@gm_cartia, myself.sm.id);

Пример использования

if ( i0 == -1 ) {
    RegisterGlobalMap( GM_ID, GetIndexFromCreature( myself.sm ) );
}

GetGlobalMapNPC🟢 высокая

прочитать значение из глобальной карты

Читает число, ранее записанное по ключу в глобальную карту. Принимает аргумент
(int key) в namespace myself (CNPC); возвращает сохранённое число или -1, если
ключа нет.

Сигнатура

GetGlobalMap( int key )

Параметры

key (int) — ключ, по которому читают число из глобальной карты

Пример

i0 = GetGlobalMap(@gm_cartia);

Пример использования

i0 = GetGlobalMap( @gm_frintessa );
if ( i0 != -1 ) { c0 = GetCreatureFromIndex( i0 ); }

UnregisterGlobalMapNPC🟢 высокая

удалить ключ из глобальной карты

Удаляет запись по ключу из глобальной карты в памяти. Принимает аргумент (int key)
в namespace myself (CNPC); возвращает целое число.

Сигнатура

UnregisterGlobalMap( int key )

Параметры

key (int) — ключ, запись по которому удаляют из глобальной карты

Пример

UnregisterGlobalMap(@i_core);

Пример использования

if ( c0.db_value == 0 ) {
    UnregisterGlobalMap( myself.i_ai2 );
    Despawn( );
}

SetDBValueNPC🟢 высокая

сохранить постоянное число за существом

Сохраняет за существом c (чаще всего myself.sm) постоянное число — например,
номер стадии, который NPC помнит между перезаходами. Принимает аргументы
(CSharedCreatureData c, int nValue) в namespace myself (CNPC); ничего не возвращает.
Обратной функции чтения нет — записанное читают через поле существа .db_value.

Сигнатура

SetDBValue( CSharedCreatureData c, int nValue )

Параметры

c (CSharedCreatureData) — существо (обычно `myself.sm`), за которым сохраняют число.
nValue (int) — постоянное число, сохраняемое за существом (читается через поле `.db_value`).

Пример

SetDBValue( myself.sm, @SCE_FRINTESSA_ALL_READY );

Пример использования

if ( myself.sm.db_value == 1 ) {
    SetDBValue( myself.sm, 0 );
}

ХРАНИЛИЩЕ ДАННЫХ (DbData / DbCookie / AtomicValue)

16 функций

CompareExchangeGLOBAL🟢 высокая

атомарно сравнить и подменить значение

Метод потокобезопасного счётчика CAtomicValue (по декомпилю — _InterlockedCompareExchange). Если
текущее значение совпадает с ожидаемым (ВТОРОЙ аргумент — comparand), подменяет его на новое
(ПЕРВЫЙ аргумент) и возвращает старое; если не совпадает — оставляет как есть и возвращает текущее.
Основа lock-free флагов: одной операцией безопасно «захватить» состояние без гонки.

Сигнатура

CompareExchange( int nNew, int nComparand )

Параметры

nNew       (int) — новое значение, которое записывается в счётчик при совпадении.
nComparand (int) — ожидаемое значение: сверяется с текущим содержимым счётчика (при равенстве — подмена).
    Пример: av_ai0.CompareExchange(1, 0) — если счётчик == 0, записать 1 и вернуть старое (0).

Пример

if (myself.av_ai0.CompareExchange(1, 0) == 0)

Пример использования

if ( myself.av_quest0.CompareExchange( GetIndexFromCreature( talker ), 0 ) == 0 ) {
    CheckSubJobAsMain( talker, i10 );
}

DecrementGLOBAL🟢 высокая

атомарно уменьшить счётчик

Метод CAtomicValue: атомарно уменьшает счётчик на nAmount и возвращает новое значение
(по декомпилю — _InterlockedExchangeAdd(-nAmount); сам счётчик — это объект-атомик, напр. av_ai0).
Под капотом — выровненное целочисленное поле и аппаратные блокированные инструкции.

Сигнатура

Decrement( int nAmount )

Параметры

nAmount (int) — на сколько уменьшить счётчик (в вызовах 1).

Пример

myself.av_ai0.Decrement(1);

SetMaxSizeGLOBAL🟢 высокая

ограничить максимальный размер списка

Метод списка (целочисленного или строкового): задаёт максимальный размер. Вызывают перед
наполнением списка.

Сигнатура

SetMaxSize( int nMaxSize )

Параметры

nMaxSize (int) — максимальный размер списка

Пример

myself.int_list.SetMaxSize(100);

SetAsNullGLOBAL🟢 высокая

обнулить ссылку на объект

Обнуляет ссылку на объект — ею чистят временные ссылки на существ вроде c_ai0/c_ai1.

Сигнатура

SetAsNull( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — ссылка на существо, которую обнуляют (например `c_ai0`/`c_ai1`)

Пример

SetAsNull( myself.c_ai1 );

LoadDBNpcInfoMAKER🟢 высокая

поднять данные NPC из базы

Подтягивает в объект определения спавна (spawn-define) сохранённые данные NPC из базы по
числовому ключу. Вызывается на самом определении: сначала мейкер перебирает свои
spawn-define'ы через GetSpawnDefine, для каждого проверяет, привязан ли он к базе (поле
has_dbname), и только у привязанных вызывает LoadDBNpcInfo — иначе поднимать нечего. После
этого определение хранит данные из базы, и по нему можно спавнить NPC уже с восстановленным
состоянием. Аргумент — числовой ключ записи в базе (в вызовах 1010).

Сигнатура

LoadDBNpcInfo( int nNpcId )

Параметры

nNpcId (int) — числовой ключ записи в базе, данные которой подтягиваются в определение спавна.

Пример

def0.LoadDBNpcInfo( 1010 );

SetDBLoadedMAKER🟢 высокая

отметить, что данные загружены из базы

Выставляет флаг, что данные персонажа/определения уже загружены из базы (1 — загружены,
0 — нет).

Сигнатура

SetDBLoaded( int nLoaded )

Параметры

nLoaded (int) — флаг загрузки данных из базы: 1 — загружены, 0 — нет

Пример

loaded_def.SetDBLoaded( 1 );

GetDbCookieIntNPC🟢 высокая

прочитать целое из именованной группы

Читает целое значение из группы DbCookie по ключу. Группа задаётся идентификатором
(например BuffCookieGroupID), ключ — числом. Если ключа нет, возвращается ноль. Первый
аргумент — игрок, второй — группа, третий — ключ.

Сигнатура

GetDbCookieInt( CSharedCreatureData cCreature, int nGroupId, int nCookieId )

Параметры

cCreature (CSharedCreatureData) — игрок, значение из DbCookie которого читают
nGroupId (int) — идентификатор группы куки
nCookieId (int) — ключ читаемого значения внутри группы

Пример

i9 = GetDbCookieInt( talker, BuffCookieGroupID, 0 );

Пример использования

i5 = GetDbCookieInt(talker, BuffCookieGroupID, i1+1);
if ((i4 == i6) && (i5 == state)) { i0 = i2; i2 = i3+1; }

SetDbCookieIntNPC🟢 высокая

записать целое в группу и сохранить в базу

Записывает целое значение в группу по ключу и тут же сохраняет его в базу. Если ключа ещё
не было, он создаётся. Аргументы: игрок, идентификатор группы, ключ, значение.

Сигнатура

SetDbCookieInt( CSharedCreatureData cCreature, int nGroupId, int nCookieId, int64 nValue )

Параметры

cCreature (CSharedCreatureData) — игрок, которому записывают значение в DbCookie
nGroupId (int) — идентификатор группы куки
nCookieId (int) — ключ записываемого значения внутри группы
nValue (int64) — записываемое значение

Пример

SetDbCookieInt(talker, @AbilityCheckCookieGroup, 7, 1);

LoadDbCookieGroupNPC🟢 высокая

загрузить одну группу из базы

Поднимает из базы одну указанную группу куки и попутно вызывает событие о её загрузке.
Аргументы: игрок и идентификатор группы.

Сигнатура

LoadDbCookieGroup( CSharedCreatureData cCreature, int nGroupId )

Параметры

cCreature (CSharedCreatureData) — игрок, чью группу куки поднимают из базы
nGroupId (int) — идентификатор загружаемой группы куки

Пример

LoadDbCookieGroup( talker, BuffCookieGroupID );

Пример использования

if ( reply == 4 ) { // начало работы с бафами
    LoadDbCookieGroup( talker, BuffCookieGroupID );
    return;
}

LoadDbCookieAllGroupsNPC🟢 высокая

загрузить все группы персонажа

Поднимает из базы сразу все группы куки персонажа. Единственный аргумент — игрок.

Сигнатура

LoadDbCookieAllGroups( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, все группы куки которого поднимают из базы

Пример

LoadDbCookieAllGroups(talker);

DeleteDbCookieGroupNPC🟢 высокая

удалить группу целиком

Удаляет указанную группу куки целиком — и из памяти, и из базы. Аргументы: игрок и
идентификатор группы.

Сигнатура

DeleteDbCookieGroup( CSharedCreatureData cCreature, int nGroupId )

Параметры

cCreature (CSharedCreatureData) — игрок, у которого удаляют группу куки
nGroupId (int) — идентификатор удаляемой группы куки

Пример

DeleteDbCookieGroup( talker, BuffCookieGroupID );

Пример использования

if ( reply == 8 ) { // удаление профилЕЙ
    DeleteDbCookieGroup( talker, BuffCookieGroupID );
    ShowPage( talker, fn_BuffProfilesDelOk );
    return;
}

SetDbDataNPC🟢 высокая

вставить или обновить строку таблицы

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

Сигнатура

SetDbData( string pws1, string pws2, string pws3, string pws4, string pws5, string pws6, string pws7, string pws8, string pws9, string pws10 )

Параметры

pws1 (string) — первый ключевой параметр строки (имя таблицы/первичный ключ)
pws2 (string) — ключевой/данные-параметр строки
pws3 (string) — ключевой/данные-параметр строки
pws4 (string) — ключевой/данные-параметр строки
pws5 (string) — данные-параметр строки
pws6 (string) — данные-параметр строки
pws7 (string) — данные-параметр строки
pws8 (string) — данные-параметр строки
pws9 (string) — данные-параметр строки
pws10 (string) — данные-параметр строки (неиспользуемые передают как `_blank`)

Пример

SetDbData("za_monolit", "0", "0", "0", "0", "0", "0", "0", "0", s1);
SetDbData( config_ID, s0, "0", "0", "-1", "-1", "0", _blank, _blank, _blank );

Пример использования

if ( reply > 0 ) {
    SetDbData( "SUB_USER", talker.name, "MAIN: " + talker.subjob0_class, "SUB1: " + talker.subjob1_class, "SUB2: " + talker.subjob2_class, "SUB3: " + talker.subjob3_class, "LV: " + talker.level, IntToStr( talker.dbid ), "reply: " + reply , "level: " + level );
} else {
    SetDbData( "SUB_USER", talker.name, "Error on SET_SUBJOB_AS_MAIN", _blank, _blank, _blank, _blank, _blank, _blank, _blank );    
}

GetDbDataNPC🟢 высокая

запросить строки таблицы (асинхронно)

Запрашивает строки таблицы по критериям (те же десять строковых параметров). Запрос
асинхронный: строки приходят не сразу, а позже — в событии возврата, где число найденных
строк лежит в первом целочисленном параметре. Неиспользуемые параметры передают как _blank.

Сигнатура

GetDbData( string pws1, string pws2, string pws3, string pws4, string pws5, string pws6, string pws7, string pws8, string pws9, string pws10 )

Параметры

pws1 (string) — первый критерий выборки (имя таблицы/ключ)
pws2 (string) — критерий выборки строк
pws3 (string) — критерий выборки строк
pws4 (string) — критерий выборки строк
pws5 (string) — критерий выборки строк
pws6 (string) — критерий выборки строк
pws7 (string) — критерий выборки строк
pws8 (string) — критерий выборки строк
pws9 (string) — критерий выборки строк
pws10 (string) — критерий выборки строк (неиспользуемые передают как `_blank`)

Пример

    GetDbData( tiat_top_dbname, "top10", _blank, _blank, _blank, _blank, _blank, IntToStr( myself.i_quest9 ), _blank, _blank );

Связанное событие: ответ сервера приходит событием GETDBDATA_RETURNED (см. NASC_HANDLERS).

DelDbDataNPC🟢 высокая

удалить строки по критериям

Удаляет из таблицы строки, подходящие под переданные критерии (десять строковых
параметров, неиспользуемые — _blank).

Сигнатура

DelDbData( string pws1, string pws2, string pws3, string pws4, string pws5, string pws6, string pws7, string pws8, string pws9, string pws10 )

Параметры

pws1 (string) — первый критерий удаления (имя таблицы/ключ)
pws2 (string) — критерий удаления строк
pws3 (string) — критерий удаления строк
pws4 (string) — критерий удаления строк
pws5 (string) — критерий удаления строк
pws6 (string) — критерий удаления строк
pws7 (string) — критерий удаления строк
pws8 (string) — критерий удаления строк
pws9 (string) — критерий удаления строк
pws10 (string) — критерий удаления строк (неиспользуемые передают как `_blank`)

Пример

DelDbData( db_type, s0, s1, _blank, _blank, _blank, _blank, _blank, _blank, _blank );

Пример использования

if ( i2 == 0 && (i0 == 0) && (i1 == 0) ) { // меняем сезон в вск, в 00:00
    DelDbData( tiat_top_dbname_season, IntToStr( myself.i_quest9 ), _blank, _blank, _blank, _blank, _blank, _blank, _blank, _blank ); // удаляем запись о предыдущем сезоне
    myself.i_quest9 = myself.i_quest9 + 1;
    SetDbData( tiat_top_dbname_season, IntToStr( myself.i_quest9 ), _blank, _blank, _blank, _blank, _blank, _blank, _blank, _blank ); // пишем текущее значение
}

DelDbDataByIdNPC🟢 высокая

удалить строку по числовому идентификатору

Удаляет одну строку таблицы по её числовому идентификатору — самый быстрый способ удаления.

Сигнатура

DelDbDataById( int nId )

Параметры

nId (int) — числовой идентификатор удаляемой строки таблицы

Пример

DelDbDataById( myself.db_int_list.Get( i1 ) );
DelDbDataById( myself.db_int_list.Get( 0 ) );

Пример использования

for( i1=0; i1<i0; ++i1 ) {
    DelDbDataById( myself.db_int_list.Get( i1 ) );
}

GetAllUserForInZoneNPC🟢 высокая

запросить всех игроков зоны (асинхронно)

Запрашивает список всех игроков в текущей зоне. Список приходит асинхронно — в событии,
где каждый игрок становится целью, а их общее число лежит в первом целочисленном параметре.

Сигнатура

GetAllUserForInZone(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

GetAllUserForInZone( );

Пример использования

if (myself.sm.flag != 2) {
    GetAllUserForInZone();
    myself.av_ai0.Increment(1);
    AddTimerEx(1001, 1000);
}

NR-MEMO / ЖУРНАЛ / COOKIE (устойчивая память состояний)

14 функций

HaveNRMemoGLOBAL🟢 высокая

есть ли NR-маркер

Проверяет, стоит ли на игроке NR-маркер указанного квеста/события. Аргументы: игрок и
nQuestId ([quest_pch], @-константа). Возвращает 1, если маркер есть, иначе 0.

Сигнатура

HaveNRMemo( CSharedCreatureData cCreature, int nQuestId )

Параметры

cCreature (CSharedCreatureData) — игрок, у которого проверяют NR-маркер
nQuestId  (int) — выбор квеста/события, наличие маркера которого проверяют (`@`-константа квеста)
    значения — из словаря [quest_pch]

Пример

if (HaveNRMemo(talker, @dominion_war_state) == @FALSE)

Пример использования

if (HaveNRMemo(talker, @defend_catapult_of_dom) == @TRUE)
{
    SetNRMemoState(talker, @defend_catapult_of_dom, 100);
}

GetNRMemoStateGLOBAL🟢 высокая

прочитать NR-состояние

Читает числовое NR-состояние, привязанное к квесту/событию (устойчивый аналог GetMemoState).
Аргументы: игрок и nQuestId ([quest_pch], @-константа). Возвращает сохранённое число.

Сигнатура

GetNRMemoState( CSharedCreatureData cCreature, int nQuestId )

Параметры

cCreature (CSharedCreatureData) — игрок, NR-состояние которого читают
nQuestId  (int) — выбор квеста/события, состояние которого читают (`@`-константа квеста)
    значения — из словаря [quest_pch]

Пример

i0 = GetNRMemoState(talker, @dominion_war_state);

Пример использования

i6 = GetNRMemoState(talker, i10);
if (i6 >= 0)
{
    i7 = GetNRMemoState(talker, @dominion_war_state);
    SetNRMemoState(talker, @dominion_war_state, (i6 + i7));
    RemoveNRMemo(talker, i10);
    AddLog(2, talker, i10);
}

GetNRMemoStateExGLOBAL🟢 высокая

прочитать доп. слот NR-состояния

Читает дополнительный слот NR-состояния (несколько ячеек на один квест, как у GetMemoStateEx).
Аргументы: игрок, nQuestId ([quest_pch], @-константа) и nSlot — номер слота. Возвращает
сохранённое в слоте число.

Сигнатура

GetNRMemoStateEx( CSharedCreatureData cCreature, int nQuestId, int nSlot )

Параметры

cCreature (CSharedCreatureData) — игрок, дополнительный слот NR-состояния которого читают
nQuestId  (int) — выбор квеста/события, состояние которого читают (`@`-константа квеста)
    значения — из словаря [quest_pch]
nSlot     (int) — номер дополнительного слота состояния

Пример

if (i4 != GetNRMemoStateEx(talker, @dominion_war_state, 1))

Пример использования

if (i4 != GetNRMemoStateEx(talker, @dominion_war_state, 1))
{
    SetNRMemoState(talker, @dominion_war_state, 0);
    SetNRMemoStateEx(talker, @dominion_war_state, 1, i4);
}

SetNRMemoNPC🟢 высокая

поставить устойчивый NR-маркер контакта с квестом/событием

Ставит на игроке NR-маркер «контакт с квестом/событием» — аналог SetMemo, но устойчивый
(не сбрасывается при обнулении квестов). Аргументы: игрок и nQuestId (резолвится из
[quest_pch], то есть @-константа квеста/события). Возвращает int.

Сигнатура

SetNRMemo( CSharedCreatureData cCreature, int nQuestId )

Параметры

cCreature (CSharedCreatureData) — игрок, которому ставят NR-маркер
nQuestId  (int) — выбор квеста/события, маркер которого ставят (`@`-константа квеста)
    значения — из словаря [quest_pch]

Пример

SetNRMemo(talker, @dominion_war_state);

Пример использования

if (GetDailyQuestFlag(target, @destory_shield) == @TRUE) {
    SetNRMemo(target, @destory_shield);
    AddLog(1, target, @destory_shield);
    SetNRMemoState(target, @destory_shield, i5);
    ShowOnScreenMsgFStr(target, 2, 0, 0, 0, 1, 0, 5000, 0, 73451, IntToStr(i5), _blank, _blank, _blank, _blank);
}

RemoveNRMemoNPC🟢 высокая

снять устойчивый NR-маркер

Снимает с игрока ранее поставленный NR-маркер (аналог RemoveMemo). Аргументы: игрок и
nQuestId ([quest_pch], @-константа квеста/события). Возвращает int.

Сигнатура

RemoveNRMemo( CSharedCreatureData cCreature, int nQuestId )

Параметры

cCreature (CSharedCreatureData) — игрок, с которого снимают NR-маркер
nQuestId  (int) — выбор квеста/события, маркер которого снимают (`@`-константа квеста)
    значения — из словаря [quest_pch]

Пример

RemoveNRMemo(talker, @defend_catapult_of_dom);

Пример использования

if ( HaveNRMemo( talker, @defend_catapult_of_dom ) == 1 ) {
    RemoveNRMemo( talker, @defend_catapult_of_dom );
    AddLog( 2, talker, 729 );
}

SetNRMemoStateNPC🟢 высокая

записать NR-состояние

Записывает числовое NR-состояние для квеста/события (устойчивый аналог SetMemoState).
Аргументы: игрок, nQuestId ([quest_pch], @-константа) и nValue — записываемое число.
Возвращает int.

Сигнатура

SetNRMemoState( CSharedCreatureData cCreature, int nQuestId, int nValue )

Параметры

cCreature (CSharedCreatureData) — игрок, NR-состояние которого записывают
nQuestId  (int) — выбор квеста/события, для которого записывают состояние (`@`-константа квеста)
    значения — из словаря [quest_pch]
nValue    (int) — записываемое числовое состояние

Пример

SetNRMemoState(talker, @dominion_war_state, 0);

Пример использования

if (HaveNRMemo(talker, @defend_catapult_of_dom) == @TRUE) {
    SetNRMemoState(talker, @defend_catapult_of_dom, i0);
    SetNRMemoStateEx(talker, @defend_catapult_of_dom, 1, i3);
    AddLog(1, talker, @defend_catapult_of_dom);
    ShowQuestMark(talker, @defend_catapult_of_dom);
    SoundEffect(talker, "ItemSound.quest_middle");
}

SetNRMemoStateExNPC🟢 высокая

записать доп. слот NR-состояния

Записывает значение в дополнительный слот NR-состояния (несколько ячеек на квест, как у
SetMemoStateEx). Аргументы: игрок, nQuestId ([quest_pch], @-константа), nSlot — номер слота
и nValue — записываемое число. Возвращает int.

Сигнатура

SetNRMemoStateEx( CSharedCreatureData cCreature, int nQuestId, int nSlot, int nValue )

Параметры

cCreature (CSharedCreatureData) — игрок, дополнительный слот NR-состояния которого записывают
nQuestId  (int) — выбор квеста/события, для которого записывают состояние (`@`-константа квеста)
    значения — из словаря [quest_pch]
nSlot     (int) — номер дополнительного слота состояния
nValue    (int) — записываемое в слот число

Пример

SetNRMemoStateEx(talker, @dominion_war_state, 1, i4);

GetNRMemoCountNPC🟢 высокая

число NR-маркеров на игроке

Возвращает количество NR-маркеров, стоящих на игроке (устойчивый аналог GetMemoCount).
Единственный аргумент — игрок. Возвращает int.

Сигнатура

GetNRMemoCount( CSharedCreatureData cCreature )

Параметры

    cCreature (CSharedCreatureData) — игрок, количество NR-маркеров у которого считают

Пример: в наших скриптах прямых вызовов нет.

SetNRFlagJournalNPC🟢 высокая

выставить флаг журнала NR-события

Выставляет флаг (бит/шаг) журнала NR-события — видимую отметку прогресса (аналог
SetFlagJournal). Аргументы: игрок, nQuestId ([quest_pch], @-константа или переменная с id) и
nFlag — флаг-шаг (в вызовах накапливается значениями вроде 3..11). Ничего не возвращает.

Сигнатура

SetNRFlagJournal( CSharedCreatureData cCreature, int nQuestId, int nFlag )

Параметры

cCreature (CSharedCreatureData) — игрок, которому выставляют флаг журнала NR-события
nQuestId  (int) — выбор квеста/события, журнал которого помечают (`@`-константа квеста)
    значения — из словаря [quest_pch]
nFlag     (int) — выставляемый флаг-шаг прогресса журнала

Пример

SetNRFlagJournal(talker, i10, 1);

SetJournalNPC🟢 высокая

выставить обычный флаг журнала квеста

Выставляет обычный (сбрасываемый) флаг-шаг журнала квеста — видимую отметку прогресса.
Аргументы: игрок, nQuestId ([quest_pch], @-константа) и nStep — номер шага. Ничего не
возвращает.

Сигнатура

SetJournal( CSharedCreatureData cCreature, int nQuestId, int nStep )

Параметры

cCreature (CSharedCreatureData) — игрок, которому выставляют флаг журнала квеста
nQuestId  (int) — выбор квеста, журнал которого помечают (`@`-константа квеста)
    значения — из словаря [quest_pch]
nStep     (int) — номер выставляемого шага журнала

Пример

SetJournal( talker, @the_wishing_potion, 1 );

GetHTMLCookieNPC🟢 высокая

прочитать cookie этапа диалога/квеста

Читает «куки» прохождения этапа диалога/квеста, привязанные к показанному HTML. Аргументы:
игрок, nQuestId ([quest_pch], @-константа) и nIndex — номер этапа/cookie. Возвращает -1,
если этап ещё не отмечен.

Сигнатура

GetHTMLCookie( CSharedCreatureData cCreature, int nQuestId, int nIndex )

Параметры

cCreature (CSharedCreatureData) — игрок, у которого читают cookie этапа диалога/квеста
nQuestId  (int) — выбор квеста, к которому привязан этап (`@`-константа квеста)
    значения — из словаря [quest_pch]
nIndex    (int) — номер этапа/cookie

Пример

i0 = GetHTMLCookie( talker, @the_ocean_of_distant_stars, 3 );

SetHTMLCookieNPC🟢 высокая

отметить cookie этапа диалога/квеста

Помечает, что игрок прошёл этап диалога/квеста (cookie показанного HTML), чтобы при повторном
входе диалог сразу показал нужную страницу. Аргументы: игрок, nQuestId ([quest_pch],
@-константа) и nIndex — номер этапа/cookie. Ничего не возвращает.

Сигнатура

SetHTMLCookie( CSharedCreatureData cCreature, int nQuestId, int nIndex )

Параметры

cCreature (CSharedCreatureData) — игрок, которому помечают пройденный этап диалога/квеста
nQuestId  (int) — выбор квеста, к которому привязан этап (`@`-константа квеста)
    значения — из словаря [quest_pch]
nIndex    (int) — номер этапа/cookie

Пример

SetHTMLCookie( talker, @the_ocean_of_distant_stars, 3 );

Пример использования

if ( GetMemoState( talker, @into_the_flame ) == ( ( 2 * 10 ) + 2 ) && OwnItemCount( talker, @q_vacualite_ore ) >= 50 ) {
    SetHTMLCookie( talker, 618, 2 );
    ShowPage( talker, "blacksmith_byron_q0618_0202.htm" );
} else {
    ShowPage( talker, "blacksmith_byron_q0618_0203.htm" );
}

GetCookieNPC🟢 высокая

прочитать именованное значение состояния

Читает произвольное именованное значение состояния на игроке по строковому ключу (в отличие
от memo/HTML-cookie, ключ задаётся строкой, а не quest-id). Аргументы: игрок и sKey —
строковый ключ. Возвращает сохранённое число.

Сигнатура

GetCookie( CSharedCreatureData cCreature, string sKey )

Параметры

cCreature (CSharedCreatureData) — игрок, именованное состояние которого читают
sKey      (string) — строковый ключ читаемого значения

Пример

if ( OwnItemCount( talker, @adena ) >= GetCookie( talker, "AgitDecoFee" ) ) {

Пример использования

i1 = GetCookie( talker, "gate_level" );
if ( i0 == 1 && i1 == 200 ) {
    i2 = DDoorPrice1_1;
}

SetCookieNPC🟢 высокая

записать именованное значение состояния

Записывает произвольное именованное значение состояния на игроке по строковому ключу — туда
скрипт сохраняет вычисленные параметры между шагами диалога (цена услуги, выбор ветки, номера
зон/ворот, id манора). Аргументы: игрок, sKey — строковый ключ и nValue — записываемое число.

Сигнатура

SetCookie( CSharedCreatureData cCreature, string sKey, int nValue )

Параметры

cCreature (CSharedCreatureData) — игрок, которому записывают именованное состояние
sKey      (string) — строковый ключ записываемого значения
nValue    (int) — записываемое число

Пример

SetCookie( talker, "AgitDecoFee", Agit_GetDecoFee( i0, i1 ) );

Пример использования

if ( reply == 2 ) {
    SetCookie( talker, "dmgzone_num", 2 ); 
}

ЗАМКИ, ОСАДЫ И ФОРТЫ (Castle / Siege / Fortress)

53 функций

Fortress_GetOwnerPledgeIdGLOBAL🟢 высокая

владелец форта

Возвращает id клана-владельца форта nFortressId. Если форт никем не захвачен — возвращает 0,
поэтому проверкой результата > 0 узнают, есть ли у форта владелец.

Сигнатура

Fortress_GetOwnerPledgeId( int nFortressId )

Параметры

nFortressId (int) — идентификатор форта, чьего клана-владельца запрашивают

Пример использования

if ( Fortress_GetOwnerPledgeId( fortress_id ) > 0 ) {
    return;
}

Fortress_GetParentCastleIdGLOBAL🟢 высокая

родительский замок форта

Возвращает идентификатор родительского замка форта. Назначение определено по имени,
прямых вызовов не разбирали.

Сигнатура

Fortress_GetParentCastleId( int nFortressId )

Параметры

nFortressId (int) — идентификатор форта, чей родительский замок запрашивают

Пример

Fortress_GetParentCastleId(fortress_id);

Fortress_GetFacilityLevelGLOBAL🟢 высокая

уровень построек форта

Возвращает уровень указанной постройки (facility) форта nFortressId. У форта пять типов
построек (nFacilityType 0..4, см. ниже); для неизвестного типа возвращается -1. Уровень
показывает, насколько прокачана постройка (усиление стражи, ворот и т. п.).

Сигнатура

Fortress_GetFacilityLevel( int nFortressId, int nFacilityType )

Параметры

nFortressId   (int) — идентификатор форта, постройки которого опрашиваются
nFacilityType (int) — тип постройки форта. Значения @FORTRESS_* [manual_pch]:
    0 GUARD_REINFORCEMENT · 1 GUARD_POWER_UP · 2 DOOR_POWER_UP · 3 PHOTOCANNON · 4 SCOUT

Пример использования

i0 = Fortress_GetFacilityLevel( fortress_id, facility_type );
if ( i0 < facility_level ) {
    return;
}

Fortress_GetRentCostGLOBAL🟢 высокая

стоимость аренды форта

Возвращает стоимость содержания форта nFortressId — сумму (в адене), которую клан-владелец
периодически платит за удержание форта. Используется в диалогах управляющего фортом для показа
и списания платы.

Сигнатура

Fortress_GetRentCost( int nFortressId )

Параметры

nFortressId (int) — идентификатор форта, стоимость содержания которого возвращается

Пример

i6 = Fortress_GetRentCost( fortress_id );

GetDominionStateGLOBAL🟢 высокая

состояние территориальной войны

Возвращает код состояния территориальной войны (Dominion) для территории nResidenceId.
Ненулевые значения соответствуют активным фазам осадного цикла: в примере состояния 1 и 2
включают дополнительный респаун объектов на территории.

Сигнатура

GetDominionState( int nResidenceId )

Параметры

nResidenceId (int) — идентификатор резиденции/территории, состояние которой запрашивается

Пример использования

i1 = GetDominionState(dominion_id);
if (i1 == 1 || i1 == 2) {
    if (deleted_def.respawn_time != 0) {
        if (AtomicIncreaseTotal(deleted_def, 1, 1)) {
            deleted_def.Spawn2(1, deleted_def.respawn_time, deleted_def.respawn_rand);
        }
    }
}

Castle_GetPledgeStateNPC🟢 высокая

отношение существа к замку (свой/чужой)

Возвращает отношение существа c к замку этого NPC — основу логики «свой или чужой» во
время осады. Аргумент c (CSharedCreatureData) — кого проверяем. Значение 2 означает
принадлежность к владеющей замком стороне (член клана-владельца или защитник): стражи
не атакуют тех, у кого состояние 2, и враждебны к остальным; для саммонов проверяют
состояние их хозяина (attacker.master).

Сигнатура

Castle_GetPledgeState( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — кого проверяем.

Пример

if (IsInCategory(@summon_npc_group, speller.npc_class_id) != 0 && Castle_GetPledgeState(speller.master) == 2) {

Пример использования

if ( Castle_GetPledgeState( creature ) != 2 ) {
    AddAttackDesire( creature, @AMT_STAND, 200 );
}

Castle_IsUnderSiegeNPC🟢 высокая

идёт ли сейчас осада замка

Возвращает, идёт ли сейчас осада замка этого NPC (1/0), без аргументов. По этому флагу
стражи переключают поведение между мирным и боевым режимом (агрессия к чужим,
открытие или закрытие ворот). Существует версия Castle_IsUnderSiege2(nCastleId) — для
конкретного замка по идентификатору.

Сигнатура

Castle_IsUnderSiege(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if (Castle_IsUnderSiege() == @TRUE)

Пример использования

if ( Castle_IsUnderSiege( ) != 0 ) {
    Say( "Castle is Under Attack..." );
}

Castle_GetPledgeIdNPC🟢 высокая

идентификатор клана-владельца замка

Возвращает идентификатор клана-владельца замка этого NPC, без аргументов. Его часто
сверяют с принадлежностью игрока (talker.pledge_id), чтобы вместе с проверкой
клановой привилегии решить, принадлежит ли он владеющему клану.

Сигнатура

Castle_GetPledgeId(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if (Castle_GetPledgeId())

Пример использования

if ( Castle_GetPledgeId( ) == talker.pledge_id && talker.pledge_id != 0 ) {
    ShowPage( talker, "farm_kel_mahum_messenger_25.htm" );
    return;
}

Castle_GetPledgeNameNPC🟢 высокая

имя клана-владельца замка

Возвращает строку с именем клана-владельца замка этого NPC, без аргументов.
Используется для показа сведений о владельце замка игроку.

Сигнатура

Castle_GetPledgeName(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

FHTML_SetStr(fhtml0, "my_pledge_name", Castle_GetPledgeName());

Castle_GetOwnerNameNPC🟢 высокая

имя владельца замка

Возвращает строку с именем самого владельца замка этого NPC, без аргументов.
Применяется для показа сведений о владельце игроку.

Сигнатура

Castle_GetOwnerName(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

FHTML_SetStr(fhtml0, "my_owner_name", Castle_GetOwnerName());

Castle_GateOpenCloseNPC🟢 высокая

открыть/закрыть ворота замка

Открывает или закрывает ворота замка этого NPC. Аргумент nState (int, из [manual_pch])
задаёт состояние: @CGOC_OPEN=0 открыть, @CGOC_CLOSE=1 закрыть. Доступно владельцу
или лорду с привилегией @PP_OPEN_CASTLE_DOOR. Глобальные варианты
Castle_GateOpenClose2(sGate, nState) и ...Ex(sGate, nState, nZoneId) (на gg)
адресуют конкретные ворота по имени — см. группу дверей, ворот и зон.

Сигнатура

Castle_GateOpenClose( int nState )

Параметры

nState (int) — состояние ворот (manual_pch):
    @CGOC_OPEN (0) — открыть; @CGOC_CLOSE (1) — закрыть.

Пример

Castle_GateOpenClose(@CGOC_OPEN);
Castle_GateOpenClose( 0 );
Castle_GateOpenClose( 1 );
Castle_GateOpenClose(@CGOC_CLOSE);

Castle_GetSiegeTimeNPC🟢 высокая

время ближайшей осады

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

Сигнатура

Castle_GetSiegeTime(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if (Castle_GetSiegeTime() != "")

Пример использования

if ( Castle_GetSiegeTime( ) != _blank ) {
    FHTML_SetFileName( fhtml0, "farm_messenger_q0655_11.htm" );
    FHTML_SetStr( fhtml0, "next_siege", Castle_GetSiegeTime( ) );
    ShowFHTML( talker, fhtml0 );
}

RegisterSiegeNPC🟢 высокая

записать клан атакующим осады

Регистрирует клан игрока c (CSharedCreatureData) как атакующего осады. Ничего не
возвращает.

Сигнатура

RegisterSiege( CSharedCreatureData cCreature )

Параметры

    cCreature (CSharedCreatureData) — игрок, чей клан регистрируют как атакующего осады

Пример (иллюстративный):

    RegisterSiege( talker );

RegisterSiegeDefenderNPC🟢 высокая

записать клан защитником осады

По замыслу — регистрирует клан игрока c (CSharedCreatureData) защитником осады замка. ВАЖНО: в
этой сборке сервера (CT2.3) вызов фактически не выполняется — как и всё семейство регистрации на
осаду замка (RegisterSiege/UnregisterSiege/CheckSiege), запись защитников вынесена в комьюнити-борд.
Функция оставлена для совместимости со старыми скриптами.

Сигнатура

RegisterSiegeDefender( CSharedCreatureData cCreature )

Параметры

    cCreature (CSharedCreatureData) — игрок, чей клан регистрируют как защитника осады

Пример (иллюстративный):

    RegisterSiegeDefender( talker );

OpenSiegeInfoNPC🟢 высокая

открыть окно информации об осаде

Открывает игроку c (CSharedCreatureData) окно с информацией об осаде. Ничего не
возвращает.

Сигнатура

OpenSiegeInfo( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, которому открывают окно информации об осаде

Пример

OpenSiegeInfo(talker);

Пример использования

if ( IsMyLord( talker ) || ( HavePledgePower( talker, @ppSiege ) && Castle_GetPledgeId( ) == talker.pledge_id && talker.pledge_id != 0 ) ) {
    OpenSiegeInfo( talker );
} else {
    ShowPage( talker, fnNoAuthority );
}

Castle_BanishOthersNPC🟢 высокая

изгнать чужих из замка

Изгоняет из зоны замка (резиденции) этого NPC всех посторонних — игроков, не входящих в
клан-владелец. Без аргументов: резиденция берётся по самому NPC. Соответствует кнопке
«Изгнать чужих» в меню управления замком.

Сигнатура

Castle_BanishOthers(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

Castle_BanishOthers();

Пример использования

if ( IsMyLord( talker ) || ( HavePledgePower( talker, @ppClanHallBanish ) && Castle_GetPledgeId( ) == talker.pledge_id && talker.pledge_id != 0 ) ) {
    Castle_BanishOthers( );
    ShowPage( talker, fnAfterBanish );
} else {
    ShowPage( talker, fnNoAuthority );
}

Castle_GetHPRegenNPC🟢 высокая

реген HP в зоне замка

Возвращает уровень (грейд) установленной функции резиденции «Восстановление HP» замка этого
NPC. Это одна из платных функций резиденции (аналог функций кланового зала): её уровень
задаётся Castle_SetHPRegen и определяет силу бонуса регенерации HP на территории. Без
аргументов — работает по резиденции самого NPC; если функция не установлена, возвращает 0.

Сигнатура

Castle_GetHPRegen(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

Castle_GetHPRegen( );

Castle_SetHPRegenNPC🟢 высокая

задать реген HP в зоне замка

Устанавливает (или снимает) функцию резиденции «Восстановление HP» замка на заданный уровень.
При nLevel>0 функция включается на 7 суток; при nLevel=0 — снимается. Резиденция берётся по
самому NPC.

Сигнатура

Castle_SetHPRegen( int nLevel )

Параметры

    nLevel (int) — уровень (грейд) функции восстановления HP резиденции; >0 — установить на
                   7 суток, 0 — снять функцию.

Пример (иллюстративный):

    Castle_SetHPRegen( nLevel );

Castle_GetMPRegenNPC🟢 высокая

реген MP в зоне замка

Возвращает уровень (грейд) установленной функции резиденции «Восстановление MP» замка этого
NPC — аналог Castle_GetHPRegen для MP (функция типа 1). Уровень задаётся Castle_SetMPRegen и
определяет силу бонуса регенерации MP на территории. Без аргументов — по резиденции самого
NPC; если функция не установлена, возвращает 0.

Сигнатура

Castle_GetMPRegen(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

Castle_GetMPRegen( );

Castle_SetMPRegenNPC🟢 высокая

задать реген MP в зоне замка

Устанавливает (или снимает) функцию резиденции «Восстановление MP» замка на заданный уровень —
аналог Castle_SetHPRegen для MP. При nLevel>0 функция включается на 7 суток; при nLevel=0 —
снимается. Резиденция берётся по самому NPC.

Сигнатура

Castle_SetMPRegen( int nLevel )

Параметры

    nLevel (int) — уровень (грейд) функции восстановления MP резиденции; >0 — установить на
                   7 суток, 0 — снять функцию.

Пример (иллюстративный):

    Castle_SetMPRegen( nLevel );

Castle_GetLifeControlLevelNPC🟢 высокая

уровень «контроля жизни» замка

Возвращает настроенный уровень «контроля жизни» замка/резиденции этого NPC (без аргументов —
работает по резиденции самого NPC). Если у NPC нет привязанной резиденции, возвращает 0; иначе
читает уровень из статических данных резиденции. Это геттер уровня апгрейда (влияет на тир
бонуса регенерации на территории замка); сам бонус применяется другим кодом.

Сигнатура

Castle_GetLifeControlLevel(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if (Castle_IsUnderSiege() == @TRUE && Castle_GetLifeControlLevel() == 0) {

Пример использования

if ( Castle_IsUnderSiege( ) && Castle_GetLifeControlLevel( ) == 0 ) {
    ShowPage( talker, fnBrokenCtrlTower );
} else {
    ShowPage( talker, fnHi );
}

Castle_GetRawSiegeTimeNPC🟢 высокая

сырое время осады (число)

Возвращает «сырое» время начала ближайшей осады замка этого NPC — как целочисленный timestamp
в секундах (в отличие от форматированного Castle_GetSiegeTime). Удобно для арифметики со
временем: в примере ниже quest-скрипт сравнивает его с системным временем (Castle_GetRawSystemTime)
и с сохранённой меткой memo, чтобы поймать суточное окно (86400 c) и убедиться, что осада ещё в
будущем. Без аргументов — по замку самого NPC.

Сигнатура

Castle_GetRawSiegeTime(  )

Параметры

(нет — функция вызывается без аргументов)

Пример использования

if ( _from_choice == 0 || ( HaveMemo( talker, @competition_for_the_bandit_stronghold ) == 1 && OwnItemCount( talker, @q_contest_certificate ) > 0 && OwnItemCount( talker, @q_tarlk_amulet ) < 30 && ( Castle_GetRawSiegeTime( ) - GetMemoState( talker, @competition_for_the_bandit_stronghold ) ) < 86400 && ( Castle_GetRawSiegeTime( ) - Castle_GetRawSystemTime( ) ) > 0 ) ) {
    SetCurrentQuestID( @competition_for_the_bandit_stronghold );
    ShowPage( talker, "azit_messenger_q0504_07.htm" );
}

Castle_SetSiegeTimeNPC🟢 высокая

задать настройку времени осады

Задаёт дату/время ближайшей осады замка. По декомпилю L2NPC (CNPC::Castle_SetSiegeTime_48B04C)
движок берёт ближайший «осадный» день, обнуляет его до полуночи, затем прибавляет смещения из
аргументов и шлёт серверу вычисленный timestamp (пакет opcode 13). Первые два аргумента —
булевы сдвиги (+1 день и +12 часов), последние два — час и минута начала осады.

Сигнатура

Castle_SetSiegeTime( int nAddDay, int nAddHalfDay, int nHour, int nMinute )

Параметры

    nAddDay (int) — сдвиг базового дня: 1 = +1 сутки, 0 = без сдвига (движок: +86400 с).
    nAddHalfDay (int) — сдвиг на половину суток: 1 = +12 часов, 0 = без сдвига (движок: +43200 с).
    nHour (int) — час начала осады (прибавляется как 3600·nHour).
    nMinute (int) — минута начала осады (прибавляется как 60·nMinute).

Пример (иллюстративный):

    Castle_SetSiegeTime( nAddDay, nAddHalfDay, nHour, nMinute );

ShowSetSiegeTimeNPC🟢 высокая

показать нужную HTML-страницу окна назначения осады

Показывает игроку одну из трёх HTML-страниц в зависимости от состояния осады резиденции
этого NPC. По декомпилю L2NPC (CNPC::ShowSetSiegeTime_4ACEE8) движок читает данные
резиденции и вызывает ShowPage с одной из трёх страниц: если осада уже запланирована на
будущее — третья страница; иначе если стоит флаг «время уже назначалось в текущем цикле» —
вторая; иначе (время можно задать) — первая. То есть три аргумента — это имена HTML-страниц,
а не текст времени.

Сигнатура

ShowSetSiegeTime( CSharedCreatureData c, string sPageCanSet, string sPageRegistered, string sPageScheduled )

Параметры

    c (CSharedCreatureData) — игрок, которому показывают страницу.
    sPageCanSet (string) — HTML-страница, когда осада не запланирована и время можно задать (ветка по умолчанию).
    sPageRegistered (string) — HTML-страница, когда взведён флаг «время уже назначалось в текущем цикле».
    sPageScheduled (string) — HTML-страница, когда осада уже запланирована на будущее (время в будущем).

Пример (иллюстративный):

    ShowSetSiegeTime( talker, "", "", "" );

Castle_GetRelatedFortressListNPC🟢 высокая

список фортов, связанных с замком

Запрашивает список фортов, «связанных» с замком этого NPC — фортов, заключивших контракт/договор
с замком. Функция асинхронная: результат приходит отдельным событием (см. ниже). Аргумент c —
существо-контекст запроса.

Сигнатура

Castle_GetRelatedFortressList( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, по чьему замку берут список связанных фортов

Пример

    Castle_GetRelatedFortressList(talker);

Связанное событие: ответ сервера приходит событием GET_RELATED_FORTRESS_LIST_RETURNED (см. NASC_HANDLERS).

CheckSiegeNPC🟢 высокая

проверка записи на осаду

По замыслу — проверяет запись клана существа c на осаду замка. ВАЖНО: в этой сборке сервера
(CT2.3) вызов фактически ничего не выполняет — регистрация и проверка осад замка вынесены в
комьюнити-борд. Функция оставлена для совместимости со старыми скриптами.

Сигнатура

CheckSiege( CSharedCreatureData cCreature )

Параметры

    cCreature (CSharedCreatureData) — существо, чью запись клана проверяют на осаду

Пример (иллюстративный):

    CheckSiege( talker );

UnregisterSiegeNPC🟢 высокая

снятие записи на осаду

По замыслу — снимает запись клана существа c на осаду замка. ВАЖНО: в этой сборке сервера
(CT2.3) вызов фактически ничего не выполняет — запись на осаду замка (и её отмена) вынесена в
комьюнити-борд. Функция оставлена для совместимости со старыми скриптами.

Сигнатура

UnregisterSiege( CSharedCreatureData cCreature )

Параметры

    cCreature (CSharedCreatureData) — существо, чью запись клана снимают с осады

Пример (иллюстративный):

    UnregisterSiege( talker );

ViewSiegeListNPC🟢 высокая

список осад

Показывает игроку c список зарегистрированных осад, отрисованный в переданную HTML-страницу
sPage. Если sPage — пустая строка, список не показывается. В отличие от CheckSiege и
UnregisterSiege, в этой сборке функция рабочая.

Сигнатура

ViewSiegeList( CSharedCreatureData c, string sPage )

Параметры

    c (CSharedCreatureData) — игрок, которому показывают список осад.
    sPage (string) — имя HTML-страницы окна списка осад; пустая строка не принимается (список не покажется).

Пример (иллюстративный):

    ViewSiegeList( talker, "" );

Fortress_GetStateNPC🟢 высокая

состояние форта

Возвращает код текущего состояния форта nFortressId (стадия владения/контракта). По этому коду
скрипты форта разветвляют логику: например, сравнением с 0 отличают форт без владельца от
занятого кланом.

Сигнатура

Fortress_GetState( int nFortressId )

Параметры

nFortressId (int) — идентификатор форта, чьё состояние запрашивают

Пример

if ( Fortress_GetState( fortress_id ) == 0 ) {

Fortress_GetSiegeStatusNPC🟢 высокая

состояние осады форта

Возвращает код состояния осады форта nFortressId (нет осады / идёт осада и её фаза). Позволяет
скриптам форта понять, в какой стадии находится осадный цикл.

Сигнатура

Fortress_GetSiegeStatus( int nFortressId )

Параметры

    nFortressId (int) — идентификатор форта, чьё состояние осады запрашивают

Пример (иллюстративный):

    Fortress_GetSiegeStatus( nFortressId );

Fortress_PledgeRegisterNPC🟢 высокая

регистрация клана на форт

Регистрирует клан игрока претендентом на форт nFortressId (заявка на осаду/захват форта).
Действие инициирует NPC-управляющий фортом от имени пришедшего игрока.

Сигнатура

    Fortress_PledgeRegister( int nNpcId, int nUserId, int nFortressId )

Параметры (по реальным вызовам — myself.sm.id, talker.id, fortress_id):
    nNpcId      (int) — id NPC-источника действия (myself.sm.id).
    nUserId     (int) — id игрока (talker.id).
    nFortressId (int) — идентификатор форта, на который регистрируется клан игрока.

Пример

Fortress_PledgeRegister(myself.sm.id, talker.id, fortress_id);

Fortress_BarrackCapturedNPC🟢 высокая

событие захвата казарм форта

Сообщает о захвате казармы во время осады форта: отмечает казарму nBarrackId форта nFortressId
захваченной. Когда захвачены все казармы форта, осада завершается в пользу атакующих.

Сигнатура

    Fortress_BarrackCaptured( int nNpcId, int nFortressId, int nBarrackId )

Параметры (по реальным вызовам — myself.sm.id, fortress_id, barrack_id):
    nNpcId      (int) — id NPC-источника события (myself.sm.id).
    nFortressId (int) — идентификатор форта, где захвачены казармы.
    nBarrackId  (int) — идентификатор захваченных казарм.

Пример

Fortress_BarrackCaptured(myself.sm.id, fortress_id, barrack_id);

Fortress_ContractCastleNPC🟢 высокая

контракт форта с замком

Оформляет договор форта nFortressId с замком (выбор фортом сюзеренного замка — контракт). Функция
асинхронная: результат приходит отдельным событием (см. ниже). В вызовах nArg = -1.

Сигнатура

    Fortress_ContractCastle( int nNpcId, int nUserId, int nFortressId, int nArg )

Параметры (по реальным вызовам — myself.sm.id, talker.id, fortress_id, -1):
    nNpcId      (int) — id NPC-источника действия (myself.sm.id).
    nUserId     (int) — id игрока (talker.id).
    nFortressId (int) — идентификатор форта, оформляющего контракт.
    nArg        (int) — параметр контракта (в вызовах -1).

Пример использования

    if ( reply == 1 ) {
        Fortress_ContractCastle( myself.sm.id, talker.id, fortress_id, -1 ); 
        return;
    }

Связанное событие: ответ сервера приходит событием FORTRESS_CONTRACT_CASTLE_RETURNED (см. NASC_HANDLERS).

Fortress_OwnerRewardTakenNPC🟢 высокая

получение награды владельцем форта

Отмечает, что владелец форта nFortressId забрал полагающуюся периодическую награду, и выдаёт
игроку предмет nItemClassId в количестве nCount. Защищает от повторного получения награды
владельца.

Сигнатура

    Fortress_OwnerRewardTaken( int nNpcId, int nUserId, int nFortressId, int nItemClassId, int64 nCount )

Параметры (по реальным вызовам — myself.sm.id, talker.id, fortress_id, item_medal, i0):
    nNpcId       (int) — id NPC-источника события (myself.sm.id).
    nUserId      (int) — id игрока-владельца (talker.id).
    nFortressId  (int) — идентификатор форта, чью награду получают.
    nItemClassId (int) — id предмета награды ([item_pch], напр. item_medal).
    nCount       (int64) — количество награды.

Пример

Fortress_OwnerRewardTaken(myself.sm.id, talker.id, fortress_id, item_medal, i0);

Agit_GetDecoExpireNPC🟢 высокая

дата окончания декорации клан-холла

Геттер декораций клан-холла (агита). По типу декорации nDecoType возвращает int — момент
окончания срока действия установленной декорации как timestamp. В скриптах это значение
передают в GetDateTime, чтобы вытащить год/месяц/день и показать дату истечения в диалоге.

Сигнатура

Agit_GetDecoExpire( int nDecoType )

Параметры

nDecoType (int) — тип декорации агита. Значения (константы-соглашения скрипта):
    1 hpregen · 2 mpregen · 3 cpregen · 6 broadcast · 7 curtain · 8 hanging ·
    9 buff · 10 outerflag · 11 platform · 12 item

Пример

IntToStr( GetDateTime( Agit_GetDecoExpire( decotype_hpregen ), 1 ) );

Agit_GetTeleportLevelNPC🟢 высокая

телепорт-уровень агита

Возвращает уровень функции телепорта кланового зала (агита) этого NPC: 0 — функция выключена,
большее значение — установленный тир апгрейда. Пара к Agit_SetTeleportLevel.

Сигнатура

Agit_GetTeleportLevel(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

Agit_GetTeleportLevel( );

Agit_SetTeleportLevelNPC🟢 высокая

задать телепорт-уровень агита

Задаёт телепорт-уровень кланового зала (агита). Описано обзорно, точные аргументы — в
исходных таблицах.

Сигнатура

Agit_SetTeleportLevel( int nLevel )

Параметры

    nLevel (int) — задаваемый уровень функции телепорта кланового зала (0 = выключена, далее тиры апгрейда).

Пример (иллюстративный):

    Agit_SetTeleportLevel( nLevel );

Agit_StartObserverNPC🟢 высокая

наблюдатель агита

Отправляет игрока c в режим наблюдателя (осадная камера кланового зала/резиденции) в точку с
координатами x, y, z. Позиция проверяется по геоданным: при некорректной точке наблюдение не
включается. Если резиденция nResidenceId сейчас под осадой — наблюдение запрещается (игрок
получает системное сообщение). Наблюдение длится 1 час (3600 c). Также блокируется, если игрок
зарегистрирован на Олимпиаде или держит открытым приватный магазин.

Сигнатура

Agit_StartObserver( CSharedCreatureData c, int x, int y, int z, int nCamParam4, int nCamParam5, int nResidenceId )

Параметры

    c (CSharedCreatureData) — игрок, отправляемый в режим наблюдателя.
    x (int) — координата X точки наблюдения (проверяется по геоданным).
    y (int) — координата Y точки наблюдения.
    z (int) — координата Z точки наблюдения.
    nCamParam4 (int) — параметр камеры наблюдателя (передаётся клиенту).
    nCamParam5 (int) — параметр камеры наблюдателя (передаётся клиенту).
    nResidenceId (int) — id резиденции: при активной осаде наблюдение запрещается.

Пример (иллюстративный):

    Agit_StartObserver( talker, x, y, z, nCamParam4, nCamParam5, nResidenceId );

AuctionAgit_GetAgitCostInfoNPC🟢 высокая

сведения об аукционе агита

Показывает игроку c сведения о стоимости кланового зала (агита) на аукционе — цену и условия
аренды. Обычно вызывается в диалоге управляющего после проверки, что игрок из клана-владельца.

Сигнатура

AuctionAgit_GetAgitCostInfo( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо-инициатор запроса сведений о стоимости/аукционе зала

Пример использования

if (Castle_GetPledgeId() == talker.pledge_id && talker.pledge_id != 0) {
    AuctionAgit_GetAgitCostInfo(talker);
} else {
    ShowPage(talker, fnNoAuthority);
}

GetDominionSiegeIDNPC🟢 высокая

идентификатор осады Dominion

Возвращает id осады территориальной войны (Dominion), к которой относится существо c — по его
территории. Значение используется как база для вычисления связанных id (в примере из него
смещениями получают другие идентификаторы).

Сигнатура

GetDominionSiegeID( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, по которому определяется идентификатор осады территории

Пример использования

i0 = GetDominionSiegeID( target );
if ( i0 < 90 ) { i1 = ( i0 + 636 ); } else { i1 = ( i0 + 650 ); }

RegisterDominionNPC🟢 высокая

регистрация в территориальной войне

Регистрирует клан существа c участником территориальной войны (Dominion) за территорию
nDominionId. Обычно вызывается управляющим замка и требует полномочий лорда/клан-лидера
(в примере проверяются IsMyLord и право клана).

Сигнатура

RegisterDominion( int nDominionId, CSharedCreatureData c )

Параметры

nDominionId (int) — идентификатор территории/резиденции (Dominion) для регистрации участия (в вызовах dominion_id).
c (CSharedCreatureData) — существо-инициатор (игрок или представитель клана).

Пример использования

if (IsMyLord(talker) || (HavePledgePower(talker, 18) && Castle_GetPledgeId() == talker.pledge_id && talker.pledge_id != 0)) {
    RegisterDominion(dominion_id, talker);
} else {
    ShowPage(talker, fnNoAuthority);
}

CancelPledgeDominionNPC🟢 высокая

отмена участия клана в Dominion

Отменяет регистрацию клана существа c в территориальной войне (Dominion) за территорию
nDominionId — обратное действие к RegisterDominion.

Сигнатура

CancelPledgeDominion( int nDominionId, CSharedCreatureData c )

Параметры

    nDominionId (int) — идентификатор территории/резиденции (Dominion), участие в которой отменяется.
    c (CSharedCreatureData) — существо-инициатор (игрок или представитель клана).

Пример (иллюстративный):

    CancelPledgeDominion( nDominionId, talker );

IsDominionOfLordNPC🟢 высокая

принадлежность Dominion лорду

Сообщает, есть ли у территории (Dominion) nDominionId лорд-владелец: 0 — территория ничья,
значение > 0 — у территории есть владелец. Идентификаторы территорий лежат в диапазоне 80+
(в примерах 87, 80+i0).

Сигнатура

IsDominionOfLord( int nDominionId )

Параметры

nDominionId (int) — идентификатор территории/резиденции (Dominion), проверяемой на принадлежность лорду (в вызовах 87).

Пример использования

if (IsDominionOfLord(87) == 0) {
    ShowQuestPage( talker, "chamberlain_alfred_q0715_01.htm", @path_of_feudal_lord_godard );
} else {
    ShowQuestPage( talker, "chamberlain_alfred_q0715_03.htm", @path_of_feudal_lord_godard );
}

IsHostileInDominionSiegeNPC🟢 высокая

враждебность в осаде Dominion

Сообщает, является ли существо c враждебным участником в текущей осаде территориальной войны
(Dominion) — противником по отношению к обороняющейся стороне. Возвращает 1 (@TRUE), если c
враждебен, иначе 0.

Сигнатура

IsHostileInDominionSiege( CSharedCreatureData cCreature )

Параметры

    cCreature (CSharedCreatureData) — существо, проверяемое на враждебность в осаде территории

Пример (иллюстративный):

    IsHostileInDominionSiege( talker );

Residence_GetTaxRateNPC🟢 высокая

текущая ставка налога резиденции

Возвращает ставку налога резиденции этого NPC, которая вступит в силу в следующем цикле
(в диалогах подставляется в поле «next_tax_rate»). Без аргументов — по резиденции самого NPC.
Пара к Residence_GetTaxRateCurrent (действующая ставка).

Сигнатура

Residence_GetTaxRate(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

FHTML_SetInt(fhtml0, "next_tax_rate", Residence_GetTaxRate());

Residence_GetTaxRateCurrentNPC🟢 высокая

действующая ставка налога резиденции

Возвращает действующую сейчас ставку налога резиденции этого NPC (в диалогах подставляется
в поле «current_tax_rate»). Без аргументов — по резиденции самого NPC. Пара к Residence_GetTaxRate
(ставка следующего цикла).

Сигнатура

Residence_GetTaxRateCurrent(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

Residence_GetTaxRateCurrent( );

Residence_GetTaxIncomeNPC🟢 высокая

налоговый доход резиденции

Возвращает накопленную налоговую адену резиденции этого NPC (без аргументов — по резиденции
самого NPC). Значение 64-битное (читается из данных резиденции), поэтому переполнения нет.
Парная Residence_GetTaxIncomeReserved отдаёт зарезервированную (ещё не выплаченную) часть.

Сигнатура

Residence_GetTaxIncome(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

Residence_GetTaxIncome( );

Residence_VaultSaveMoneyNPC🟢 высокая

пополнить казну резиденции

Вносит nAmount адены из инвентаря игрока c в казну (доход) резиденции этого NPC. Требует, чтобы
у игрока было не меньше nAmount адены — иначе внесение не происходит. Обычно вызывается
управляющим и требует полномочий (в примере — право @ppTaxVault или статус лорда).

Сигнатура

Residence_VaultSaveMoney( CSharedCreatureData c, int nAmount )

Параметры

c (CSharedCreatureData) — существо-инициатор пополнения казны.
nAmount (int) — сумма пополнения казны резиденции (адена; в вызовах reply).

Пример использования

if ( IsMyLord( talker ) || ( HavePledgePower( talker, @ppTaxVault ) && Castle_GetPledgeId( ) == talker.pledge_id && talker.pledge_id != 0 ) ) {
    Residence_VaultSaveMoney( talker, reply );
    ShowPage( talker, fnHi );
} else {
    ShowPage( talker, fnNoAuthority );
}

Residence_TakeOutMoneyNPC🟡 средняя

изъять из казны резиденции

Изымает средства из казны резиденции — операция, обратная Residence_VaultSaveMoney (в которой
игрок вносит адену в казну). Смысл ясен, но саму функцию не удаётся найти ни в справочниках
сигнатур, ни в исходниках движка, ни в L2NPC (ни CT2.3, ни CT2.6) — возможно, в этих сборках её
нет или она называется иначе, поэтому список аргументов не подтверждён.

Пример (иллюстративный):

Residence_TakeOutMoney( ... );

RemoveResidenceNPC🟢 высокая

удалить резиденцию

Расформировывает резиденцию nResidenceId — сбрасывает её принадлежность клану (служебное
действие управляющего). c — существо-инициатор.

Сигнатура

RemoveResidence( CSharedCreatureData c, int nResidenceId )

Параметры

    c (CSharedCreatureData) — существо-инициатор удаления резиденции
    nResidenceId (int) — идентификатор удаляемой резиденции

Пример (иллюстративный):

    RemoveResidence( talker, nResidenceId );

AssignResidenceNpcToPledgeNPC🟢 высокая

привязать NPC резиденции к клану

Привязывает NPC резиденции residence_id к клану существа c — передаёт управляющих/служебных
NPC резиденции во владение клану. Служебное действие при смене владельца резиденции.

Сигнатура

AssignResidenceNpcToPledge( int residence_id, CSharedCreatureData c )

Параметры

    residence_id (int) — идентификатор резиденции, чей NPC привязывается
    c (CSharedCreatureData) — существо/клан, к которому привязывается NPC резиденции


Пример (иллюстративный):

    AssignResidenceNpcToPledge( residence_id, talker );

RegisterUserResurrectionTowerNPC🟢 высокая

зарегистрировать игрока у башни воскрешения

Регистрирует игрока у башни воскрешения для отслеживания потенциально
воскрешаемых. Принимает идентификатор пользователя (user_id); ничего не
возвращает.

Сигнатура

RegisterUserResurrectionTower( int nUserId )

Параметры

nUserId (int) — идентификатор пользователя (user_id), регистрируемого у башни воскрешения (в вызовах myself.sm.id).

Пример

    RegisterUserResurrectionTower( myself.sm.id );

Связанное событие: ответ сервера приходит событием REGISTER_USER_RESURRECTION_TOWER_RESULT (см. NASC_HANDLERS).

RegisterResurrectionTowerNPC🟢 высокая

зарегистрировать башню воскрешения

Регистрирует саму башню воскрешения в системе и связывает её с зоной. Принимает
идентификатор башни и идентификатор зоны; ничего не возвращает.

Сигнатура

RegisterResurrectionTower( int nTowerId, int nZoneId )

Параметры

nTowerId (int) — идентификатор башни воскрешения (в вызовах myself.i_ai0).
nZoneId (int) — идентификатор зоны, с которой связывается башня (в вызовах myself.i_ai1).

Пример

    RegisterResurrectionTower( myself.i_ai0, myself.i_ai1 );

Связанное событие: ответ сервера приходит событием REGISTER_RESURRECTION_TOWER_RESULT (см. NASC_HANDLERS).

Форты, кланхоллы, доминион (Fortress / Agit / Dominion)

30 функций

Fortress_GetContractStatusGLOBAL🟢 высокая

статус контракта крепости

Геттер (gg). По id крепости nFortId возвращает int — статус её контракта (для крепостей с id 101…111).

Сигнатура

Fortress_GetContractStatus( int nFortressId )

Параметры

nFortressId (int) — идентификатор форта, чьё состояние контракта запрашивают

Пример

if (Fortress_GetContractStatus(fortress_id) != @FORTRESS_CONTRACT_CASTLE)

Пример использования

if ( Fortress_GetContractStatus( fortress_id ) != 0 ) {
    return;
}

Fortress_GetAvailableOwnMinutesGLOBAL🟢 высокая

остаток времени владения крепостью

Геттер (gg). По id крепости nFortId возвращает int — сколько минут осталось у текущего владельца.

Сигнатура

Fortress_GetAvailableOwnMinutes( int nFortressId )

Параметры

nFortressId (int) — идентификатор форта, доступное время владения которым возвращается

Пример

if ( Fortress_GetAvailableOwnMinutes( fortress_id ) <= 120 && Fortress_GetOwnerPledgeId( fortress_id ) > 0 ) {

Пример использования

if ( Fortress_GetAvailableOwnMinutes( fortress_id ) <= 120 && Fortress_GetOwnerPledgeId( fortress_id ) > 0 ) {
    ShowPage( talker, fnHi6 ); 
    return;
}

Fortress_GetNextRewardRemainTimeGLOBAL🟢 высокая

время до следующей выплаты владельцу

Геттер (gg). По id крепости nFortId возвращает int — время, оставшееся до следующей выплаты награды владельцу крепости.

Сигнатура

Fortress_GetNextRewardRemainTime( int nFortressId )

Параметры

nFortressId (int) — идентификатор форта, время до следующей награды которого возвращается

Пример

i7 = Fortress_GetNextRewardRemainTime( fortress_id );

Castle_GetDomainFortressContractStatusGLOBAL🟢 высокая

статус контракта крепости в доменах замка

Геттер (gg). По id крепости nFortId возвращает int — статус её контракта в доменах замка.

Сигнатура

Castle_GetDomainFortressContractStatus( int nFortId )

Параметры

nFortId (int) — id крепости, для которой запрашивается статус контракта в доменах замка

Пример

if ( Castle_GetDomainFortressContractStatus( fortress_id ) == 0 ) {

Пример использования

if ( Castle_GetDomainFortressContractStatus( fortress_id ) == 0 ) {
    ShowPage( talker, fnNoCastleContract );
    return;
}

GetDominionWarStateGLOBAL🟢 высокая

состояние войны за домен

Геттер (gg). По id домена nDominionId (@*_dominion либо 81…89) возвращает int — состояние войны за домен; значение 5 означает, что война идёт.

Сигнатура

GetDominionWarState( int nDominionId )

Параметры

nDominionId (int) — идентификатор территории/резиденции (Dominion), состояние войны которой запрашивают

Пример

if (Castle_IsUnderSiege() == @TRUE || GetDominionWarState(dominion_id) == 5)

Пример использования

if ( Castle_IsUnderSiege( ) == @FALSE && GetDominionWarState( i0 ) != 5 ) {
    ShowPage(talker, "mass_teleporter_instant.htm");
    return;
}

Fortress_GetPledgeSiegeStateNPC🟢 высокая

состояние осады для клана существа

Геттер крепостей (CNPC). По существу c возвращает int — состояние осады для его клана; значение 2 означает, что клан существа сейчас под осадой.

Сигнатура

Fortress_GetPledgeSiegeState( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо (игрок), по чьему клану проверяется состояние осады крепости

Пример

if (Fortress_GetPledgeSiegeState(creature) == 2 || (IsNullCreature(creature.master) == @FALSE && Fortress_GetPledgeSiegeState(creature.master) == 2))

Пример использования

if ( ( Fortress_GetPledgeSiegeState( creature ) == 2 ) || ( IsNullCreature( creature.master ) == 0 && Fortress_GetPledgeSiegeState( creature.master ) == 2 ) ) {
    return;
}

Fortress_SetFacilityNPC🟢 высокая

задать уровень укрепления крепости

Метод крепостей (CNPC). Для существа c устанавливает уровень nLevel укрепления типа nFacilityType (константа @FORTRESS_* либо 0..4).

Сигнатура

Fortress_SetFacility( CSharedCreatureData cCreature, int nFacilityType, int nValue )

Параметры

cCreature     (CSharedCreatureData) — существо-инициатор настройки (обычно talker).
nFacilityType (int) — тип настраиваемой постройки форта @FORTRESS_*:
    0 GUARD_REINFORCEMENT · 1 GUARD_POWER_UP · 2 DOOR_POWER_UP · 3 PHOTOCANNON · 4 SCOUT
nValue        (int) — задаваемый уровень/значение настройки постройки.

Пример

Fortress_SetFacility(talker, @FORTRESS_PHOTOCANNON, 1);

Пример использования

if ( OwnItemCount( talker, @adena ) >= i0 ) {
    Fortress_SetFacility( talker, 1, 0 ); 
} else {
    ShowPage( talker, "fortress_not_enough_money.htm" ); 
}

Fortress_ResetFacilityNPC🟢 высокая

сбросить все укрепления крепости

Метод крепостей (CNPC). Сбрасывает все укрепления крепости, привязанной к существу c.

Сигнатура

Fortress_ResetFacility( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо-инициатор сброса построек форта

Пример

Fortress_ResetFacility( talker );

Пример использования

if ( OwnItemCount( talker, @adena ) >= i0 ) {
    Fortress_ResetFacility( talker ); 
} else {
    ShowPage( talker, "fortress_not_enough_money.htm" ); 
}

Fortress_IsInBoundaryNPC🟢 высокая

находится ли NPC в границах крепости

Предикат крепостей (CNPC). По id крепости nFortId возвращает int (1/0) — находится ли NPC в её границах.

Сигнатура

Fortress_IsInBoundary( int nFortId )

Параметры

nFortId (int) — id крепости, в границах которой проверяется нахождение NPC.

Пример

i8 = fortress_dependancy + Fortress_IsInBoundary(i0);

Fortress_GetCastleTreasureLevelNPC🟢 высокая

уровень казны замка-родителя

Геттер крепостей (CNPC). По id крепости nFortId возвращает int — уровень казны замка, которому подчинена крепость.

Сигнатура

Fortress_GetCastleTreasureLevel( int nFortId )

Параметры

nFortId (int) — id крепости, по которой берётся уровень казны замка-владельца.

Пример

i0 = Fortress_GetCastleTreasureLevel( fortress_id );

Fortress_CastleTreasureTakenNPC🟢 высокая

отметить, что казна крепости взята

Метод крепостей (CNPC). Фиксирует факт изъятия казны крепости. Аргументы: nNpcId — id NPC, nTalkerId — id игрока, nFortId — id крепости.

Сигнатура

    Fortress_CastleTreasureTaken( int nNpcId, int nUserId, int nFortressId )

Параметры (по реальным вызовам — myself.sm.id, talker.id, fortress_id):
    nNpcId      (int) — id NPC-источника события (myself.sm.id).
    nUserId     (int) — id игрока, забравшего казну (talker.id).
    nFortressId (int) — идентификатор форта, где захвачена казна.

Пример

Fortress_CastleTreasureTaken( myself.sm.id, talker.id, fortress_id );

Пример использования

if ( i0 > 0 ) {
    Fortress_CastleTreasureTaken( myself.sm.id, talker.id, fortress_id ); 
    ShowPage( talker, fnGetTreasureSuccess ); 
}

Fortress_ProtectedNpcDiedNPC🟢 высокая

смерть защищаемого NPC крепости

Метод крепостей (CNPC). Сообщает системе о гибели защищаемого NPC крепости. Аргументы: nNpcId — id NPC, nFortId — id крепости.

Сигнатура

    Fortress_ProtectedNpcDied( int nNpcId, int nFortressId )

Параметры (по реальным вызовам — myself.sm.id, fortress_id):
    nNpcId      (int) — id NPC-источника события (myself.sm.id).
    nFortressId (int) — идентификатор форта, где погиб охраняемый NPC.

Пример

Fortress_ProtectedNpcDied( myself.sm.id, fortress_id );

Fortress_PledgeUnregisterNPC🟢 высокая

снять регистрацию клана на крепость

Метод крепостей (CNPC). Снимает регистрацию клана на осаду/владение крепостью. Аргументы: nNpcId — id NPC, nTalkerId — id игрока, nFortId — id крепости.

Сигнатура

    Fortress_PledgeUnregister( int nNpcId, int nUserId, int nFortressId )

Параметры (по реальным вызовам — myself.sm.id, talker.id, fortress_id):
    nNpcId      (int) — id NPC-источника действия (myself.sm.id).
    nUserId     (int) — id игрока (talker.id).
    nFortressId (int) — идентификатор форта, с которого снимается регистрация.

Пример

Fortress_PledgeUnregister( myself.sm.id, talker.id, fortress_id );

Пример использования

if ( reply == 0 ) {
    Fortress_PledgeUnregister( myself.sm.id, talker.id, fortress_id ); 
} else {
    if ( reply == 2 ) {
        ShowMultisell( 614, talker ); 
    }
}

Fortress_GetOwnerRewardCycleCountNPC🟢 высокая

число полученных циклов наград

Геттер крепостей (CNPC). По id крепости nFortId возвращает int — сколько циклов наград уже получил её владелец.

Сигнатура

Fortress_GetOwnerRewardCycleCount( int nFortId )

Параметры

nFortId (int) — id крепости, по которой считается число полученных владельцем циклов наград.

Пример

i0 = Fortress_GetOwnerRewardCycleCount( fortress_id );

Agit_GetDecoLevelNPC🟢 высокая

текущий уровень декорации клан-холла

Геттер декораций клан-холла (CNPC). По типу декорации nDecoType (@decotype_*) возвращает int — её текущий уровень; значение больше 0 означает, что декорация установлена.

Сигнатура

Agit_GetDecoLevel( int nDecoType )

Параметры

nDecoType (int) — тип декорации агита. Значения (константы-соглашения скрипта):
    1 hpregen · 2 mpregen · 3 cpregen · 6 broadcast · 7 curtain · 8 hanging ·
    9 buff · 10 outerflag · 11 platform · 12 item

Пример

if ( Agit_GetDecoLevel( decotype_buff ) > 0 ) {

Пример использования

if ( Agit_GetDecoLevel( decotype_item ) == 0 ) {
    ShowPage( talker, fnFuncDisabled );
}

Agit_GetDecoFeeNPC🟢 высокая

плата за декорацию данного уровня

Геттер декораций (CNPC). По типу nDecoType и уровню nLevel возвращает int — плату за установку/продление декорации этого уровня.

Сигнатура

Agit_GetDecoFee( int nDecoType, int nLevel )

Параметры

nDecoType (int) — тип декорации агита. Значения (константы-соглашения скрипта):
    1 hpregen · 2 mpregen · 3 cpregen · 6 broadcast · 7 curtain · 8 hanging ·
    9 buff · 10 outerflag · 11 platform · 12 item
nLevel    (int) — уровень декорации (обычно Agit_GetDecoLevel(nDecoType)).

Пример

FHTML_SetStr( fhtml0, "HP" + "Cost", "(" + MakeFString( 6, IntToStr( Agit_GetDecoFee( decotype_hpregen, Agit_GetDecoLevel( decotype_hpregen ) ) ), IntToStr( Agit_GetDecoDay( decotype_hpregen, Agit_GetDecoLevel( decotype_hpregen ) ) ), _blank, _blank, _blank ) + ")" );

Agit_GetDecoDayNPC🟢 высокая

срок действия декорации (дней)

Геттер декораций (CNPC). По типу nDecoType и уровню nLevel возвращает int — срок действия декорации в днях.

Сигнатура

Agit_GetDecoDay( int nDecoType, int nLevel )

Параметры

nDecoType (int) — тип декорации агита. Значения (константы-соглашения скрипта):
    1 hpregen · 2 mpregen · 3 cpregen · 6 broadcast · 7 curtain · 8 hanging ·
    9 buff · 10 outerflag · 11 platform · 12 item
nLevel    (int) — уровень декорации (обычно Agit_GetDecoLevel(nDecoType)).

Пример

FHTML_SetStr( fhtml0, "HP" + "Cost", "(" + MakeFString( 6, IntToStr( Agit_GetDecoFee( decotype_hpregen, Agit_GetDecoLevel( decotype_hpregen ) ) ), IntToStr( Agit_GetDecoDay( decotype_hpregen, Agit_GetDecoLevel( decotype_hpregen ) ) ), _blank, _blank, _blank ) + ")" );

Agit_GetCostFailDayNPC🟢 высокая

дней просрочки оплаты до потери декорации

Геттер декораций (CNPC) без аргументов. Возвращает int — допустимое число дней просрочки оплаты, после которых декорация теряется.

Сигнатура

Agit_GetCostFailDay(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if ( Agit_GetCostFailDay( ) == 0 ) {

Пример использования

if ( Agit_GetCostFailDay( ) == 0 ) {
    ShowPage( talker, fnHi );
} else {
    FHTML_SetFileName( fhtml0, fnCostFail );
    FHTML_SetInt( fhtml0, "CostFailDayLeft", ( 8 - Agit_GetCostFailDay( ) ) );
    ShowFHTML( talker, fhtml0 );
}

Agit_GetDecoIdNPC🟢 высокая

внутренний id декорации

Геттер декораций (CNPC). По типу декорации nDecoType возвращает int — её внутренний id.

Сигнатура

Agit_GetDecoId( int nDecoType )

Параметры

    nDecoType (int) — тип декорации агита. Значения (константы-соглашения скрипта):
        1 hpregen · 2 mpregen · 3 cpregen · 6 broadcast · 7 curtain · 8 hanging ·
        9 buff · 10 outerflag · 11 platform · 12 item

Пример: в наших скриптах прямых вызовов нет.

Agit_SetDecoNPC🟢 высокая

установить/обновить декорацию

Метод декораций (CNPC). Для существа c устанавливает либо обновляет декорацию типа nDecoType до уровня nLevel.

Сигнатура

Agit_SetDeco( CSharedCreatureData cCreature, int nDecoType, int nLevel )

Параметры

cCreature (CSharedCreatureData) — существо-инициатор настройки украшения кланового зала.
nDecoType (int) — тип декорации агита. Значения (константы-соглашения скрипта):
    1 hpregen · 2 mpregen · 3 cpregen · 6 broadcast · 7 curtain · 8 hanging ·
    9 buff · 10 outerflag · 11 platform · 12 item
nLevel    (int) — задаваемый уровень декорации.

Пример

Agit_SetDeco( talker, i0, i1 );

Agit_ResetDecoNPC🟢 высокая

сбросить декорацию

Метод декораций (CNPC). Для существа c сбрасывает декорацию типа nDecoType.

Сигнатура

Agit_ResetDeco( CSharedCreatureData cCreature, int nDecoType )

Параметры

cCreature (CSharedCreatureData) — существо, у чьего клан-холла сбрасывается декорация (talker).
nDecoType (int) — тип сбрасываемой декорации агита; в вызовах = FloatToInt(reply/1000).
    Значения (константы-соглашения скрипта):
    1 hpregen · 2 mpregen · 3 cpregen · 6 broadcast · 7 curtain · 8 hanging ·
    9 buff · 10 outerflag · 11 platform · 12 item

Пример

Agit_ResetDeco( talker, i0 );

DeclareLordNPC🟢 высокая

объявить игрока лордом домена

Метод (CNPC). Объявляет существо c лордом домена nDominionId.

Сигнатура

DeclareLord( int nDominionId, CSharedCreatureData c )

Параметры

nDominionId (int) — id домена, для которого объявляется лорд.
c (CSharedCreatureData) — существо (игрок), объявляемое лордом домена.

Пример

DeclareLord(dominion_id, talker);

IsLordOfCastleNPC🟢 высокая

является ли игрок лордом замка/домена

Предикат (CNPC). По существу c возвращает int (1/0) — является ли игрок лордом замка/домена.

Сигнатура

IsLordOfCastle( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо (игрок), проверяемое на статус лорда замка/домена

Пример

i0 = IsLordOfCastle( talker );
i1 = IsLordOfCastle(talker);

CancleUserDominionNPC🟢 высокая

снять участие игрока в войне за домен

Метод (CNPC). Снимает участие существа c в войне за домен nDominionId.

Сигнатура

CancleUserDominion( int nDominionId, CSharedCreatureData c )

Параметры

    nDominionId (int) — id домена, из войны за который снимается участник.
    c (CSharedCreatureData) — существо (игрок), чьё участие в войне снимается.

Пример: в наших скриптах прямых вызовов нет.

Residence_GetTaxIncomeReservedNPC🟢 высокая

зарезервированный налоговый доход

Геттер резиденции (CNPC) без аргументов. Возвращает int64 — зарезервированный (ещё не выплаченный) налоговый доход.

Сигнатура

Residence_GetTaxIncomeReserved(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

FHTML_SetInt( fhtml0, "tax_income_reserved", Residence_GetTaxIncomeReserved( ) );

Residence_SetTaxRateNPC🟢 высокая

задать ставку налога

Метод резиденции (CNPC). Устанавливает ставку налога резиденции nRate.

Сигнатура

Residence_SetTaxRate( int nTaxRate )

Параметры

nTaxRate (int) — задаваемая ставка налога резиденции, в процентах (в вызовах 0 или reply).

Пример

Residence_SetTaxRate( 0 );
Residence_SetTaxRate( reply );

Пример использования

if ( reply < 0 ) {
    Residence_SetTaxRate( 0 );
    FHTML_SetInt( fhtml0, "next_tax_rate", 0 );
} else {
    Residence_SetTaxRate( reply );
    FHTML_SetInt( fhtml0, "next_tax_rate", reply );
}

Residence_VaultTakeOutMoneyNPC🟢 высокая

снять деньги из казны резиденции

Метод резиденции (CNPC). Выдаёт существу c сумму nAmount из казны резиденции; возвращает int.

Сигнатура

Residence_VaultTakeOutMoney( CSharedCreatureData c, int nAmount )

Параметры

c (CSharedCreatureData) — существо (игрок), которому выдаются деньги из казны.
nAmount (int) — выдаваемая сумма (адена; в вызовах reply).

Пример

Residence_VaultTakeOutMoney( talker, reply );

GetControlTowerLevelNPC🟢 высокая

уровень контрольной башни зоны

Метод (CNPC). По существу c и имени зоны sZoneName сообщает уровень контрольной башни этой зоны (тип возврата не подтверждён).

Сигнатура

GetControlTowerLevel( CSharedCreatureData c, string sZoneName )

Параметры

c (CSharedCreatureData) — существо, которому вернётся результат (событием CONTROLTOWER_LEVEL_INFORMED).
sZoneName (string) — имя зоны, чья контрольная башня запрашивается.

Пример

GetControlTowerLevel( talker, dmgzonename1 );
GetControlTowerLevel( talker, dmgzonename2 );

Пример использования

    if ( GetCookie( talker, "dmgzone_num" ) == 2 ) {
        GetControlTowerLevel( talker, dmgzonename2 );
    }

Связанное событие: ответ сервера приходит событием CONTROLTOWER_LEVEL_INFORMED (см. NASC_HANDLERS).

SetControlTowerLevelNPC🟢 высокая

задать уровень контрольной башни

Метод (CNPC). Для зоны с именем sZoneName устанавливает уровень контрольной башни nLevel.

Сигнатура

SetControlTowerLevel( string sZoneName, int nLevel )

Параметры

sZoneName (string) — имя зоны, для чьей контрольной башни задаётся уровень.
nLevel (int) — устанавливаемый уровень контрольной башни.

Пример

SetControlTowerLevel( dmgzonename1, ( 2 * i1 ) );
SetControlTowerLevel( dmgzonename2, ( 2 * i1 ) );
SetControlTowerLevel(dmgzonename1, 2 * i1);
SetControlTowerLevel(dmgzonename2, 2 * i1);

Castle_GetRawSystemTimeNPC🟢 высокая

сырое системное время

Геттер (CNPC) без аргументов. Возвращает int — сырое системное время, применяется для синхронизации осад.

Сигнатура

Castle_GetRawSystemTime(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if ( ( Castle_GetRawSystemTime( ) - Castle_GetRawSiegeTime( ) ) < 1800 ) {

Пример использования

if ( _from_choice == 0 || ( HaveMemo( talker, @competition_for_the_bandit_stronghold ) == 1 && OwnItemCount( talker, @q_contest_certificate ) > 0 && OwnItemCount( talker, @q_tarlk_amulet ) < 30 && ( Castle_GetRawSiegeTime( ) - GetMemoState( talker, @competition_for_the_bandit_stronghold ) ) < 86400 && ( Castle_GetRawSiegeTime( ) - Castle_GetRawSystemTime( ) ) > 0 ) ) {
    SetCurrentQuestID( @competition_for_the_bandit_stronghold );
    ShowPage( talker, "azit_messenger_q0504_07.htm" );
}

ТЕРРИТОРИАЛЬНЫЕ БИТВЫ, КЛАНЫ, РЕГИСТРАЦИЯ СОБЫТИЙ И ПРЕМИУМ (TB / Pledge / Register / Premium)

26 функций

GetSubpledgeMasterNameGLOBAL🟢 высокая

узнать имя лидера подклана

Возвращает имя лидера подклана строкой. Первый аргумент — существо
(CSharedCreatureData), второй — ID подклана.

Сигнатура

GetSubpledgeMasterName( CSharedCreatureData cCreature, int nSubPledgeId )

Параметры

cCreature    (CSharedCreatureData) — существо (игрок), в контексте чьего клана ищется подклан
nSubPledgeId (int) — id подклана, имя лидера которого запрашивается

Пример

s0 = GetSubpledgeMasterName( talker, reply );

Пример использования

s0 = GetSubpledgeMasterName( talker, reply );
if ( IsNullString(s0 ) == 1 ) {
    s0 = "";
    s0 = MakeFString( 1010642, "", "", "", "", "" );
}

TB_SetNpcTypeNPC🟢 высокая

задать тип участника территориального боя

Устанавливает тип участника территориального боя (1–5: виды NPC). Вызывается на
объекте существа (CSharedCreatureData), вторым аргументом передаётся номер типа;
ничего не возвращает.

Сигнатура

TB_SetNpcType( CSharedCreatureData c, int nType )

Параметры

c (CSharedCreatureData) — существо, которому задаётся тип участника территориального боя.
nType (int) — номер устанавливаемого типа участника территориального боя, 1..5 (в вызовах 2, 5).

Пример

TB_SetNpcType( talker, 2 );

Пример использования

    if ( reply == 8 ) {
        TB_SetNpcType( talker, 5 );
    } else
    if ( reply == 9 ) {
        TB_GetNpcType( talker );
    }

Связанное событие: ответ сервера приходит событием TB_SET_NPC_TYPE_RETURNED (см. NASC_HANDLERS).

TB_GetNpcTypeNPC🟢 высокая

узнать тип участника территориального боя

Получает текущий тип участника территориального боя для переданного существа
(CSharedCreatureData). Вызывается на объекте существа.

Сигнатура

TB_GetNpcType( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, чей тип участника территориального боя запрашивается

Пример

TB_GetNpcType( talker );

Пример использования

    if ( reply == 9 ) {
        TB_GetNpcType( talker );
    }

Связанное событие: ответ сервера приходит событием TB_GET_NPC_TYPE_INFORMED (см. NASC_HANDLERS).

TB_GetPledgeRegisterStatusNPC🟢 высокая

проверить регистрацию клана в боях

Проверяет статус регистрации клана игрока в территориальном бою; результат приходит событием.
По обработчику L2Server (NpcQueryTeamBattlePledge → CTeamBattleAgit::GetPledgeRegisterStatusForNpcServer)
сервер ищет клан игрока среди зарегистрированных на агите (до 5 слотов) и возвращает индекс слота,
либо код «не зарегистрирован». Флаг влияет именно на этот код при отсутствии регистрации: при
nMode=0 возвращается -3, при nMode=1 остаётся -1 — скрипты используют это для разных веток диалога.

Сигнатура

TB_GetPledgeRegisterStatus( CSharedCreatureData c, int nMode )

Параметры

c (CSharedCreatureData) — существо (игрок), по чьему клану проверяется регистрация.
nMode (int) — режим ответа при незарегистрированном клане: 0 → код результата -3, 1 → код -1.

Пример

TB_GetPledgeRegisterStatus( talker, 1 );
TB_GetPledgeRegisterStatus( talker, 0 );

Пример использования

    if ( GetPledgeSkillLevel( talker ) >= 4 ) {
        TB_GetPledgeRegisterStatus( talker, 0 );
    } else {
        ShowPage( talker, "azit_messenger_q0504_04.htm" );
    }

Связанное событие: ответ сервера приходит событием TB_GET_PLEDGE_REGISTER_STATUS_INFORMED (см. NASC_HANDLERS).

TB_RegisterPledgeNPC🟢 высокая

зарегистрировать клан в территориальных войнах

Регистрирует клан для участия в территориальных войнах. Вызывается на объекте
существа (CSharedCreatureData), без дополнительных аргументов.

Сигнатура

TB_RegisterPledge( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо (игрок), чей клан регистрируется на территориальные войны

Пример

    TB_RegisterPledge( talker );

Связанное событие: ответ сервера приходит событием TB_REGISTER_PLEDGE_RETURNED (см. NASC_HANDLERS).

TB_RegisterMemberNPC🟢 высокая

зарегистрировать члена клана участником боя

Регистрирует члена клана как участника территориального боя. Вызывается на
объекте существа (CSharedCreatureData) без дополнительных аргументов.

Сигнатура

TB_RegisterMember( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо (игрок), регистрируемое как участник территориального боя

Пример

TB_RegisterMember( talker );

Пример использования

    if ( talker.is_pledge_master != 1 ) {
        TB_RegisterMember( talker );
    } else {
        ShowPage( talker, "farm_kel_mahum_messenger_5.htm" );
    }

Связанное событие: ответ сервера приходит событием TB_REGISTER_MEMBER_RETURNED (см. NASC_HANDLERS).

TB_CheckMemberRegisterStatusNPC🟢 высокая

проверить регистрацию члена клана

Проверяет регистрацию члена клана в территориальном бою. Первый аргумент — ID
события/агита, второй — существо (CSharedCreatureData).

Сигнатура

TB_CheckMemberRegisterStatus( int nAgitId, CSharedCreatureData c )

Параметры

nAgitId (int) — id события/агита, в рамках которого проверяется регистрация (в вызовах AgitID).
c (CSharedCreatureData) — существо (игрок), чья регистрация члена клана проверяется.

Пример

TB_CheckMemberRegisterStatus( AgitID, talker );

Пример использования

if ( myself.i_ai1 == 0 ) {
    TB_CheckMemberRegisterStatus( AgitID, talker );
} else {
    ShowPage( talker, "agit_mass_teleporter001.htm" );
}

TB_GetBattleRoyalPledgeListNPC🟢 высокая

получить список кланов в боях

Возвращает список кланов, участвующих в территориальных боях. Вызывается на
объекте существа (CSharedCreatureData).

Сигнатура

TB_GetBattleRoyalPledgeList( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, в контексте которого запрашивается список кланов-участников

Пример

TB_GetBattleRoyalPledgeList( talker );

Пример использования

    if ( ask == 101 ) {
        TB_GetBattleRoyalPledgeList( talker );
    }

Связанное событие: ответ сервера приходит событием TB_GET_BATTLE_ROYAL_PLEDGE_LIST_INFORMED (см. NASC_HANDLERS).

UpdatePledgeNameValueNPC🟢 высокая

изменить репутацию клана

Изменяет репутацию клана на переданное число (отрицательное — убавляет).
Вызывается на объекте существа (CSharedCreatureData), возвращает новое значение
репутации.

Сигнатура

UpdatePledgeNameValue( CSharedCreatureData c, int nDelta )

Параметры

c (CSharedCreatureData) — существо (игрок), чьему клану меняется репутация.
nDelta (int) — величина изменения репутации со знаком (отрицательная убавляет; в вызовах -10000, i0).

Пример

UpdatePledgeNameValue( talker, -10000 );

Пример использования

if ( i0 > 0 ) {
    UpdatePledgeNameValue( talker, i0 );
}

OwnPledgeNameValueNPC🟢 высокая

узнать репутацию клана

Возвращает текущую репутацию клана талкера (CSharedCreatureData) целым числом.

Сигнатура

OwnPledgeNameValue( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо (талкер), чья клановая репутация запрашивается

Пример

if ( OwnPledgeNameValue( talker ) >= 10000 ) {

Пример использования

if ( OwnPledgeNameValue( talker) >= 5000 ) {
    UpdatePledgeNameValue( talker, -5000 );
    CreateSubPledge( talker, i0, i1, s0 );
} else {
    ShowPage( talker, "pl_err_fame.htm" );
}

GetPledgeByIndexNPC🟢 высокая

получить данные клана по индексу

Получает объект данных клана (CSharedPledgeData) по числовому индексу.

Сигнатура

GetPledgeByIndex( int nIndex )

Параметры

nIndex (int) — числовой индекс клана, по которому берутся его данные.

Пример

pledge0 = GetPledgeByIndex( i0 );

Пример использования

pledge0 = GetPledgeByIndex( i0 );
if ( IsNull( pledge0 ) == 0 ) {
    FHTML_SetStr( fhtml0, "pledge0", pledge0.name );
    FHTML_SetStr( fhtml0, "p_member_count0", IntToStr( i1 ) );
}

GetPledgeCastleSiegeDefenceCountNPC🟢 высокая

счётчик защитных попыток клана

Возвращает количество защитных попыток клана при осаде замка. Аргумент — существо
(CSharedCreatureData), возврат — целое число.

Сигнатура

GetPledgeCastleSiegeDefenceCount( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо (игрок), по чьему клану считаются защитные попытки осады

Пример

i0 = GetPledgeCastleSiegeDefenceCount(talker);

RegisterToEventListenerNPC🟢 высокая

зарегистрировать слушателя события

Подписывает данного NPC на глобальные события. По декомпилю L2NPC
(CNPC::RegisterToEventListener_48F6DC) движок регистрирует NPC в общем реестре
GlobalEventListener по типу события. В собранных скриптах используется только значение 1
(по контексту вызова ssq_event_listener == 1 — подписка на события Семи Печатей).

Сигнатура

RegisterToEventListener( int nEventType )

Параметры

nEventType (int) — тип глобального события для подписки (регистрируется в GlobalEventListener;
    в вызовах 1 — по контексту события SSQ / Семи Печатей).

Пример

RegisterToEventListener( 1 );

Пример использования

if ( ssq_event_listener == 1 ) {
    RegisterToEventListener( 1 );
}

AddPremiumPointsNPC🟢 высокая

начислить премиум-очки

Добавляет премиум-очки игроку. Первый аргумент — существо (CSharedCreatureData),
второй — количество очков (int64); ничего не возвращает.

Сигнатура

AddPremiumPoints( CSharedCreatureData cCreature, int64 points )

Параметры

cCreature (CSharedCreatureData) — существо (игрок), которому начисляются премиум-очки
points (int64) — количество добавляемых премиум-очков

Пример

AddPremiumPoints( talker, ( i7 * 3 ) );

IsUserPremiumNPC🟢 высокая

проверить наличие подписки

Возвращает 1, если у игрока активна премиум-подписка. Аргумент — существо
(CSharedCreatureData).

Сигнатура

IsUserPremium( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо (игрок), чья активная премиум-подписка проверяется

Пример

if (IsUserPremium(talker) == @FALSE)

Пример использования

if ( IsUserPremium( talker ) == @FALSE ) {
    ShowPage( talker, "npc_rim_maker001e.htm" );
    return;
}

GetPremiumLevelNPC🟢 высокая

узнать уровень премиума

Возвращает уровень премиума игрока (0 — нет, 1 и выше — уровень). Аргумент —
существо (CSharedCreatureData).

Сигнатура

GetPremiumLevel( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо (игрок), чей уровень премиума запрашивается

Пример

if (GetPremiumLevel(talker) == 2) {

Пример использования

if (GetPremiumLevel(talker) < 2) {
    ShowPage(talker, "not_enoth_vip_lvl.htm");
}

SetUserPremiumNPC🟢 высокая

активировать или продлить премиум

Активирует или продляет премиум-подписку игрока. Аргументы: существо
(CSharedCreatureData), длительность в секундах, два целочисленных параметра и
строковый параметр; ничего не возвращает.

Сигнатура

SetUserPremium( CSharedCreatureData cCreature, int nDuration, int nParam1, int nParam2, string pwsParam3 )

Параметры

cCreature (CSharedCreatureData) — существо (игрок), которому активируется/продляется премиум
nDuration (int) — длительность подписки в секундах
nParam1 (int) — дополнительный целочисленный параметр подписки
nParam2 (int) — дополнительный целочисленный параметр подписки
pwsParam3 (string) — дополнительный строковый параметр подписки

Пример

SetUserPremium( talker, ( i4 * 86400 ), 1, 1, "" );

Пример использования

if ( IsUserPremium( talker ) == 0 ) {
    SetUserPremium( talker, ( 30 * 86400 ), 1, 1, "" );
    ShowPage( talker, "obtshop_premium_ok.htm" ); 
} else {
    ShowPage( talker, "obtshop_premium_already.htm" ); 
}

ShowPremiumItemListNPC🟢 высокая

показать окно товаров премиума

Показывает игроку окно с товарами премиума. Аргумент — существо
(CSharedCreatureData).

Сигнатура

ShowPremiumItemList( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо (игрок), которому показывается окно товаров премиума

Пример

ShowPremiumItemList(talker);

Пример использования

if (reply == 1) {
    ShowPremiumItemList(talker);
}

IsMidWarMemberNPC🟢 высокая

проверить участие в промежуточных войнах

Возвращает 1, если игрок является участником промежуточных войн. Аргумент —
существо (CSharedCreatureData).

Сигнатура

IsMidWarMember( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — проверяемое существо (игрок), участие которого в промежуточных войнах определяется

Пример

if (MidWarIsEnable == @TRUE && IsMidWarMember(talker) != @FALSE)

Пример использования

if (MidWarIsEnable == @TRUE && IsMidWarMember(talker) != @FALSE)
{
    ShowPage(talker, "midwar_no_epic.htm"); 
    return;
}

IsJoinableToDawnNPC🟢 высокая

проверить возможность вступления в Альянс Света

Возвращает 1, если игрок может присоединиться к Альянсу Света. Аргумент —
существо (CSharedCreatureData).

Сигнатура

IsJoinableToDawn( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — проверяемое существо (игрок), возможность вступления которого в Альянс Света проверяется

Пример

if ( IsJoinableToDawn( talker ) ) {

Пример использования

if ( IsJoinableToDawn( talker ) ) {
    ShowPage( talker, szName + "_" + QUEST_ID + "_39a.htm" );
} else {
    ShowPage( talker, szName + "_" + QUEST_ID + "_38.htm" );
}

CheckCursedUserNPC🟢 высокая

проверить проклятие игрока

Проверяет проклятие игрока. Аргумент — существо (CSharedCreatureData); ничего не
возвращает.

Сигнатура

CheckCursedUser( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — проверяемое существо (игрок), у которого проверяется наличие проклятия

Пример

CheckCursedUser(talker);

RegisterFortressEventExMAKER🟢 высокая

привязать событие к форту

Привязывает событие к форту. Три целочисленных аргумента: ID форта, ID события и
флаг спауна; ничего не возвращает.

Сигнатура

RegisterFortressEventEx( int nFortId, int nEventId, int bSpawn )

Параметры

nFortId (int) — id форта, к которому привязывается событие.
nEventId (int) — id привязываемого события.
bSpawn (int) — флаг спавна (в вызовах is_spawnN, 0/1).

Пример

RegisterFortressEventEx( fortress_id, event_id1, is_spawn1 );
RegisterFortressEventEx( fortress_id, event_id2, is_spawn2 );
RegisterFortressEventEx( fortress_id, event_id3, is_spawn3 );
RegisterFortressEventEx( fortress_id, event_id4, is_spawn4 );

Пример использования

    if ( event_id1 > -1 ) {
        RegisterFortressEventEx( fortress_id, event_id1, is_spawn1 );
    }

Связанное событие: привязанный event_id возвращается мейкеру в поле event_id события ON_FORTRESS_EVENT, когда форт достигает соответствующего состояния (см. NASC_HANDLERS).

RegisterInstantZoneEventExMAKER🟢 высокая

привязать событие к инстанс-зоне

Привязывает событие к инстанс-зоне. Четыре целочисленных аргумента: тип зоны, ID
кластера, ID события и флаг (0/1); ничего не возвращает.

Сигнатура

RegisterInstantZoneEventEx( int nZoneType, int nClusterId, int nEventId, int nFlag )

Параметры

nZoneType (int) — тип инстанс-зоны.
nClusterId (int) — id кластера зоны.
nEventId (int) — id привязываемого события.
nFlag (int) — флаг режима: 1 — спавн, 0 — деспавн (в вызовах при spawn_event_id=1, despawn_event_id=0).

Пример

RegisterInstantZoneEventEx( inzone_type_param, inzone_cluster_id, spawn_event_id, 1 );
RegisterInstantZoneEventEx( inzone_type_param, inzone_cluster_id, despawn_event_id, 0 );
RegisterInstantZoneEventEx(inzone_type_param, inzone_cluster_id, olympiad_event_id, 0);

Пример использования

    if ( on_start_spawn == 1 ) {
        RegisterInstantZoneEventEx( inzone_type_param, inzone_cluster_id, spawn_event_id, 1 );
    }

Связанное событие: привязанный event_id возвращается мейкеру в поле event_id события ON_INSTANT_ZONE_EVENT при спавне/деспавне зоны соответствующего типа (см. NASC_HANDLERS).

RegisterAgitSiegeEventExMAKER🟢 высокая

зарегистрировать событие осады агита

Регистрирует событие осады агита. Аргумент — ID замка, возврат — целое число.

Сигнатура

RegisterAgitSiegeEventEx( int nCastleId )

Параметры

nCastleId (int) — id замка, для которого регистрируется событие осады агита (в вызовах CastleID).

Пример

    RegisterAgitSiegeEventEx( CastleID );

Связанное событие: подписывает мейкера на события осады резиденции (agit/клан-холл) для указанного замка — семейство осадных событий ON_START_SIEGE_EVENT / ON_END_SIEGE_EVENT / ON_PROCLAIM_SIEGE_EVENT / ON_CANCEL_SIEGE_EVENT (см. NASC_HANDLERS).

RegisterSiegeEventExMAKER🟢 высокая

зарегистрировать событие осады

Регистрирует событие осады. Аргумент — ID замка или доминиона, возврат — целое
число.

Сигнатура

RegisterSiegeEventEx( int nCastleOrDominionId )

Параметры

nCastleOrDominionId (int) — id замка или доминиона, для которого регистрируется событие осады (в вызовах CastleID / dominion_id).

Пример

    RegisterSiegeEventEx(dominion_id);
    RegisterSiegeEventEx(CastleID);

Связанное событие: подписывает мейкера на события осады замка — ON_START_SIEGE_EVENT, ON_END_SIEGE_EVENT, ON_PROCLAIM_SIEGE_EVENT, ON_CANCEL_SIEGE_EVENT; для доминиона — DOMINION_SIEGE_START, DOMINION_SIEGE_END, ON_DECLARE_DOMINION_EVENT (см. NASC_HANDLERS).

RegisterNpcPosEventMAKER🟢 высокая

зарегистрировать событие по имени

Регистрирует событие по имени; привязывается к позиции NPC. Аргумент — строка с
именем события, возврат — целое число.

Сигнатура

RegisterNpcPosEvent( string sEventName )

Параметры

sEventName (string) — имя события, привязываемого к позиции NPC.

Пример

RegisterNpcPosEvent( EventName );

СЕМЬ ПЕЧАТЕЙ (Seven Signs, SSQ)

18 функций

GetSSQPartGLOBAL🟢 высокая

сторона игрока

Доступна на CNPC (myself) или глобально (gg), принимает существо [CSharedCreatureData]. Сообщает, на какой стороне находится игрок: никакой, Закат или Рассвет. Возврат — шкала сторон из [manual_pch] (никакой 0, Закат 1, Рассвет 2).

Сигнатура

GetSSQPart( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, сторону которого (никакой/Закат/Рассвет) запрашивают

Пример

if ( GetSSQPart( c0 ) == 0 ) {

Пример использования

if ( GetSSQPart( talker ) != 0 ) {
    ShowMultisell( reply, talker );
}

GetSSQStatusNPC🟢 высокая

текущая фаза ивента

Доступна на CNPC (myself) и CGlobalObject (gg), без аргументов. Возвращает текущую фазу ивента из [manual_pch]: период сбора (соревнование сторон, 1), период подсчёта (2) или период действия печатей (бонусы победителю, 3). Это главный гейт всей SSQ-логики NPC, в который обёрнута почти вся остальная работа.

Сигнатура

GetSSQStatus(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if (GetSSQStatus() == 3) {

Пример использования

if ( GetSSQStatus( ) == 3 && GetSSQPart( talker ) != 2 ) {
    ShowPage( talker, szName + "083.htm" );
}

GetSSQWinnerNPC🟢 высокая

сторона-победитель цикла

Доступна на CNPC (myself) или глобально (gg), без аргументов. Возвращает сторону-победителя текущего цикла ивента. Возврат — та же шкала сторон, что и у определения стороны игрока.

Сигнатура

GetSSQWinner(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if ( GetSSQWinner( ) == 1 ) {

Пример использования

if ( GetSSQPart( talker ) != GetSSQWinner( ) ) {
    return;
}

GetSSQSealOwnerNPC🟢 высокая

владелец печати

Доступна на CNPC (myself) или глобально (gg), принимает номер печати nSeal из [manual_pch]. Возвращает, какая сторона владеет конкретной печатью; печатей семь, и у каждой своё имя-константа. Возврат — та же шкала сторон (никакой, Закат, Рассвет).

Сигнатура

GetSSQSealOwner( int nSeal )

Параметры

nSeal (int) — номер печати (manual_pch): 1 = Алчность (Avarice), 2 = Откровение (Revelation),
    3 = Раздор (Strife). Возврат — сторона-владелец: 0 = ничья/никто, 1 = Закат (Dusk), 2 = Рассвет (Dawn).

Пример

i0 = GetSSQSealOwner(SSQLoserTeleport);
i1 = GetSSQSealOwner( SSQLoserTeleport );

Пример использования

if ( GetSSQSealOwner( 1 ) == 1 ) {
    BroadcastSystemMessage( myself.sm, 0, 1215 );
}

GetTimeOfSSQNPC🟢 высокая

время границы периода SSQ

Доступна на CNPC (myself). Возвращает временную метку одной из границ периодов Семи Печатей (в тех же секундах Unix, что и GetTimeOfDay). Аргумент — это индекс поля от 0 до 3: движок хранит четыре граничные метки события (например, начало и конец сбора, проверка печатей, конец сезона), и nArg выбирает нужную; иное значение вернёт ноль. Типовое применение — посчитать, сколько осталось до конца периода: вычесть из результата текущее время GetTimeOfDay().

Сигнатура

GetTimeOfSSQ( int nIndex )

Параметры

nIndex (int) — индекс граничной метки периода SSQ, 0..3 (движок хранит 4 метки; иное значение → 0).

Пример

i1 = GetTimeOfSSQ(1) - GetTimeOfDay();

Пример использования

if ( ( ( ( i0 >= 0 && i0 < 18 ) || ( i0 >= 20 && i0 < 38 ) ) || ( i0 >= 40 && i0 < 58 ) ) || ( GetTimeOfSSQ( 1 ) - GetTimeOfDay( ) ) <= 120 ) {
    ShowPage( talker, "ssq_main_event_acolyte_q0505_22.htm" );
    RemoveMemo( talker, @blood_offering );
    return;
}

AddSSQMemberNPC🟢 высокая

запись игрока в сторону

Записывает игрока в выбранную сторону Seven Signs (SSQ) с указанием печати и начисляемых очков.
Возвращает 1, если запись принята, и 0, если игрок не передан. Начисляемые очки — 64-битные.

Сигнатура

AddSSQMember( CSharedCreatureData cCreature, int nPart, int nType, int nSeal, int64 nPoints, int nArg5 )

Параметры

cCreature (CSharedCreatureData) — игрок, записываемый в сторону SSQ.
nPart   (int) — сторона SSQ: 1 = Закат (Dusk), 2 = Рассвет (Dawn).
nType   (int) — тип записи (роль участника); в вызовах = 1.
nSeal   (int) — выбранная печать: 1 = Алчность (Avarice), 2 = Откровение (Revelation), 3 = Раздор (Strife).
nPoints (int64) — очки, начисляемые при записи.
nArg5   (int) — дополнительный параметр записи участника.

Пример

if (AddSSQMember(talker, 2, 1, 2, i3, i4) == 0) {

Пример использования

if ( AddSSQMember( talker, 2, 1, 2, i3, i4 ) == 0 ) {
    return;
}

GetDepositedSSQItemCountNPC🟢 высокая

число сданных предметов

Доступна на CNPC (myself), принимает существо [CSharedCreatureData], сторону nPart и тип предмета nType. Возвращает, сколько предметов (печатей/символов) игрок сдал. Сторона и тип передаются числами; точная семантика части аргументов выведена из вызовов.

Сигнатура

GetDepositedSSQItemCount( CSharedCreatureData cCreature, int nPart, int nType )

Параметры

cCreature (CSharedCreatureData) — игрок, чьи сданные предметы считают.
nPart (int) — сторона SSQ: 1 = Закат (Dusk), 2 = Рассвет (Dawn).
nType (int) — категория сдаваемого предмета: наблюдаются значения 0 и 1 (две категории печатей/символов).

Пример

i0 = GetDepositedSSQItemCount( talker, 2, 0 );

DepositSSQItemNPC🟢 высокая

сдать предмет

Доступна на CNPC (myself), принимает существо [CSharedCreatureData], сторону nPart, тип предмета nType, идентификатор nId и количество nCount. Сдаёт предмет (печать/символ) от имени игрока. Сторона и тип передаются числами; точная семантика части аргументов выведена из сигнатуры.

Сигнатура

DepositSSQItem( CSharedCreatureData cCreature, int nPart, int nType, int64 nId, int64 nCount )

Параметры

    cCreature (CSharedCreatureData) — игрок, от чьего имени сдаётся предмет.
    nPart  (int) — сторона SSQ: 1 = Закат (Dusk), 2 = Рассвет (Dawn).
    nType  (int) — категория сдаваемого предмета: 0/1 (две категории печатей/символов).
    nId    (int64) — идентификатор сдаваемого предмета.
    nCount (int64) — количество сдаваемого предмета.

Пример (иллюстративный):

    DepositSSQItem( talker, nPart, nType, nId, nCount );

DeleteDepositedSSQItemNPC🟢 высокая

списать сданное

Доступна на CNPC (myself), принимает существо [CSharedCreatureData], сторону nPart, тип предмета nType и количество nCount. Списывает ранее сданные предметы. Сторона и тип передаются числами; точная семантика части аргументов выведена из вызовов.

Сигнатура

DeleteDepositedSSQItem( CSharedCreatureData cCreature, int nPart, int nType, int64 nCount )

Параметры

cCreature (CSharedCreatureData) — игрок, чьи сданные предметы списывают
nPart (int) — сторона SSQ
nType (int) — тип списываемого предмета (печать/символ)
nCount (int64) — количество списываемых предметов

Пример

DeleteDepositedSSQItem(talker, 2, 0, i0);

DeleteDepositedSSQItemAndGiveRewardsNPC🟢 высокая

списать сданное с выдачей наград

Списывает у игрока ранее сданные предметы Seven Signs (печати/символы) в количестве nCount и
одновременно выдаёт ему полагающиеся награды. Сторона nPart и тип предмета nType задаются
числами (см. параметры).

Сигнатура

DeleteDepositedSSQItemAndGiveRewards( CSharedCreatureData member, int nPart, int nType, int64 nCount )

Параметры

    member (CSharedCreatureData) — игрок, чьи сданные предметы списывают и кому выдают награды
    nPart (int) — сторона SSQ
    nType (int) — тип списываемого предмета (печать/символ)
    nCount (int64) — количество списываемых предметов

Пример (иллюстративный):

    DeleteDepositedSSQItemAndGiveRewards( talker, nPart, nType, nCount );

GetSSQMemberCountNPC🟢 высокая

число членов стороны

Возвращает число участников, записанных в указанную сторону Seven Signs (SSQ): 1 = Закат (Dusk),
2 = Рассвет (Dawn).

Сигнатура

GetSSQMemberCount( int nPart )

Параметры

    nPart (int) — сторона SSQ, число участников которой возвращают: 1 = Закат (Dusk), 2 = Рассвет (Dawn).

Пример (иллюстративный):

    GetSSQMemberCount( nPart );

GetSSQSealSelectionCountNPC🟢 высокая

число выборов печати

Возвращает, сколько участников указанной стороны Seven Signs выбрали указанную печать (см.
параметры — стороны и печати).

Сигнатура

GetSSQSealSelectionCount( int nPart, int nSeal )

Параметры

    nPart (int) — сторона SSQ: 1 = Закат (Dusk), 2 = Рассвет (Dawn).
    nSeal (int) — печать: 1 = Алчность (Avarice), 2 = Откровение (Revelation), 3 = Раздор (Strife).

Пример (иллюстративный):

    GetSSQSealSelectionCount( nPart, nSeal );

GetSSQTotalPointNPC🟢 высокая

суммарные очки стороны

Возвращает суммарные очки указанной стороны Seven Signs, набранные в текущем цикле: 1 = Закат
(Dusk), 2 = Рассвет (Dawn).

Сигнатура

GetSSQTotalPoint( int nPart )

Параметры

    nPart (int) — сторона SSQ, суммарные очки которой возвращают: 1 = Закат (Dusk), 2 = Рассвет (Dawn).

Пример (иллюстративный):

    GetSSQTotalPoint( nPart );

GetSSQPrevWinnerNPC🟢 высокая

предыдущий победитель

Возвращает сторону-победителя предыдущего цикла Seven Signs: 1 = Закат (Dusk), 2 = Рассвет
(Dawn), 0 — ничья/нет победителя. Скрипты сравнивают результат с 2, чтобы узнать, победил ли
Рассвет.

Сигнатура

GetSSQPrevWinner(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if (GetSSQPrevWinner() == 2) {

GetSSQRoundNumberNPC🟢 высокая

номер раунда

Возвращает номер текущего периода (раунда) Seven Signs — счётчик состязательных циклов. В
примере используется как подтип предмета: «соглашение лорда мануфактуры» действует в рамках
своего раунда.

Сигнатура

GetSSQRoundNumber(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if (IsInCategory(@third_class_group, talker.occupation) == 1 && OwnItemCountEx(talker, 5708, GetSSQRoundNumber()) > 0) {

Пример использования

if ( IsInCategory( @third_class_group, talker.occupation ) == 1 && OwnItemCountEx( talker, @the_lord_of_manor_s_agreement, GetSSQRoundNumber( ) ) > 0 ) {
    ShowPage( talker, szName + "_" + QUEST_ID + "_07.htm" );
}

GetTicketBuyCountNPC🟢 высокая

количество купленных билетов

Возвращает число уже купленных игроком talker билетов за текущий период (дневной лимит). Метод существа (myself).

Сигнатура

GetTicketBuyCount( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок (`talker`), у которого считают купленные билеты

Пример

if ( GetTicketBuyCount( talker ) < ( SSQ_DawnTicketQuantity / SSQ_DawnTicketBundle ) ) {

SetTicketBuyCountNPC🟢 высокая

установить количество билетов

Устанавливает игроку talker счётчик купленных билетов в значение count (обычно текущее значение плюс один). Возврата нет. Метод существа (myself).

Сигнатура

SetTicketBuyCount( CSharedCreatureData c, int nCount )

Параметры

c (CSharedCreatureData) — игрок (talker), которому задают счётчик билетов.
nCount (int) — новое значение счётчика купленных билетов (обычно текущее + 1).

Пример

SetTicketBuyCount( talker, ( GetTicketBuyCount( talker ) + 1 ) );
SetTicketBuyCount(talker, GetTicketBuyCount(talker) + 1);

DepositSSQItemExNPC🟢 высокая

зачислить средства на счёт SSQ-манора

Зачисляет деньги на счёт манора SSQ при торговле семенами и урожаем. Принимает
получателя (talker), тип операции и три значения количества, а также итоговый
расчётный коэффициент; вызывается на myself. Возвращает признак успеха (1/0).

Сигнатура

DepositSSQItemEx( CSharedCreatureData cCreature, int nPart, int64 nCount1, int64 nCount2, int64 nCount3, int64 nCalcTotal )

Параметры

cCreature  (CSharedCreatureData) — существо-получатель операции (talker).
nPart      (int) — сторона SSQ: 1 = Закат (Dusk), 2 = Рассвет (Dawn). В вызовах = 2.
nCount1    (int64) — первое количество (напр. число сдаваемых печатей/семян; в вызовах reply или i0).
nCount2    (int64) — второе количество (в вызовах 0, если не используется).
nCount3    (int64) — третье количество (в вызовах 0, если не используется).
nCalcTotal (int64) — итоговое расчётное значение — взвешенная сумма количеств
                     (напр. (nCount1 + nCount2) + nCount3 * 10).

Пример

if ( DepositSSQItemEx( talker, 2, i0, i1, i2, ( ( i0 + i1 ) + ( i2 * 10 ) ) ) ) {

Пример использования

if ( DepositSSQItemEx( talker, 2, reply, 0, 0, i0 ) ) {
    DeleteItem1( talker, @blue_sealstone, reply );
    ShowPage( talker, szName + "_" + QUEST_ID + "_25.htm" );
} else {
    ShowSystemMessage( talker, 1279 );
}

Time Attack

7 функций

GetTimeAttackRecordInfoGLOBAL🟢 высокая

получить запись о рекорде забега

Метод глобального объекта CGlobalObject. По трём числовым ключам (event_id, stage_id, rank) и порядковому индексу возвращает строку с информацией о рекорде забега на время — имя игрока, время прохождения, дату.

Сигнатура

GetTimeAttackRecordInfo( int nEventId, int nStageId, int nRank, int nIndex )

Параметры

nEventId (int) — идентификатор события забега (`event_id`)
nStageId (int) — идентификатор этапа забега (`stage_id`)
nRank    (int) — ранг рекорда (`rank`)
nIndex   (int) — порядковый индекс рекорда в списке

Пример

s0 = GetTimeAttackRecordInfo( RoomIndex, i1, 1, 0 );

GetTimeAttackRewardFlagGLOBAL🟢 высокая

проверить, выдана ли награда

Проверяет для существа, получил ли оно уже награду за забег с заданным event_id; возврат: 1 — получил, 0 — нет.

Сигнатура

GetTimeAttackRewardFlag( CSharedCreatureData cCreature, int nEventId )

Параметры

cCreature (CSharedCreatureData) — существо, у которого проверяют факт получения награды
nEventId  (int) — идентификатор события забега (`event_id`)

Пример

if ( GetTimeAttackRewardFlag( talker, 1 ) ) {

Пример использования

if ( GetTimeAttackRewardFlag( talker, 1 ) ) {
    ShowPage( talker, "ssq_main_event_acolyte_q0505_19.htm" );
    return;
}

IsWinnerOfTimeAttackEventGLOBAL🟢 высокая

проверить, победитель ли забега

Проверяет, является ли существо победителем забега с заданным event_id; возврат: 1 — да.

Сигнатура

IsWinnerOfTimeAttackEvent( CSharedCreatureData cCreature, int nEventId )

Параметры

cCreature (CSharedCreatureData) — существо, которое проверяют на победу в забеге
nEventId  (int) — идентификатор события забега (`event_id`)

Пример

if ( IsWinnerOfTimeAttackEvent( talker, 1 ) == 0 ) {

Пример использования

if ( IsWinnerOfTimeAttackEvent( talker, 1 ) == 0 ) {
    ShowPage( talker, "ssq_main_event_acolyte_q0505_17.htm" );
    return;
}

GetTimeAttackFeeNPC🟢 высокая

узнать стоимость входа в забег

По числовому event_id возвращает стоимость входа в забег на время (в адене). Вызывается на объекте NPC.

Сигнатура

GetTimeAttackFee( int nEventId )

Параметры

nEventId (int) — идентификатор события забега, стоимость входа которого возвращают (в адене).

Пример

i1 = GetTimeAttackFee( i0 );

AddTimeAttackFeeNPC🟢 высокая

внести плату за вход в забег

Вносит плату (очки) за вход в забег на время. По обработчику L2Server (AtomicAddTimeAttackFee::Do →
TimeAttackBoard::AddFee_6BBFB0) сервер находит «комнату» забега по номеру события и ПРИБАВЛЯЕТ
переданную сумму к накопленному значению платы для этой комнаты (с проверкой: неверная комната
или слишком большое значение, свыше ~100 млрд, отклоняются с ошибкой в лог). Первый аргумент —
номер события/комнаты, остальное формирует накапливаемую сумму платы. Возвращает результат (1 — успех).

Сигнатура

AddTimeAttackFee( int nEventId, int nFee, int nPartyId )

Параметры

nEventId (int) — номер события/комнаты забега (в вызовах 1; ищется на доске тайм-атаки).
nFee (int) — сумма платы, прибавляемая к накопленному значению комнаты (в вызовах 2700).
nPartyId (int) — id участника/группы, вносящего плату (в вызовах party0.id).

Пример

AddTimeAttackFee( 1, 2700, party0.id );

AddTimeAttackRecordNPC🟢 высокая

записать новый рекорд забега

Записывает рекорд забега на время, привязанный к Семи Печатям (SSQ). Роли аргументов раскрывает
серверная функция (L2Server: AtomicAddTimeAttackRecord::Do → TimeAttackBoard::AddRecord), её
сигнатура: AddRecord(nRoomNo, SSQPart nPartType, nPartySID, nPoint, nRecordTime, nElapsedTime).
Сервер проверяет, что сторона SSQ равна 1 или 2 и что все члены группы принадлежат этой стороне
(иначе системное сообщение 1367), прибавляет очки к накопленным очкам SSQ этой стороны (с проверкой
лимита) и пишет запись в БД. Возвращает 1 при успехе.

Сигнатура

AddTimeAttackRecord( int nRoomNo, int nSSQPart, int nPartySID, int nPoint, int nRecordTime, int nElapsedTime )

Параметры

nRoomNo (int) — номер комнаты/события забега (в вызовах 1).
nSSQPart (int) — сторона Семи Печатей: 1 = Закат (Dusk), 2 = Рассвет (Dawn) (в вызовах 2).
nPartySID (int) — SID группы участников (в вызовах party0.id; все члены должны быть этой стороны SSQ).
nPoint (int) — очки, начисляемые стороне SSQ (в вызове OwnItemCount(@q_blood_of_offering); с проверкой лимита).
nRecordTime (int) — время рекорда (в вызове GetTimeOfDay()).
nElapsedTime (int) — затраченное время (в вызове GetMemoState(@blood_offering)).

Пример

AddTimeAttackRecord( 1, 2, party0.id, OwnItemCount( talker, @q_blood_of_offering ), GetTimeOfDay( ), GetMemoState( talker, @blood_offering ) );

GiveTimeAttackRewardNPC🟢 высокая

выдать награду за забег

Выдаёт существу награду за забег: event_id, предмет (item_id) и количество; возврат: 1 — успех. Вызывается на объекте NPC.

Сигнатура

GiveTimeAttackReward( CSharedCreatureData c, int nEventId, int nItemId, int nCount )

Параметры

c (CSharedCreatureData) — существо, которому выдают награду.
nEventId (int) — идентификатор события забега.
nItemId (int) — идентификатор предмета награды.
nCount (int) — количество предмета награды.

Пример

GiveTimeAttackReward( talker, 1, 5575, i1 );

Ивент-комнаты (Event Room)

3 функций

GetPartyFromEventRoomGLOBAL🟢 высокая

взять партию из комнаты события

По ключу room_id и порядковому индексу party_index возвращает партию из виртуальной комнаты события.

Сигнатура

GetPartyFromEventRoom( int nRoomId, int nPartyIndex )

Параметры

nRoomId     (int) — идентификатор комнаты события (room_id)
nPartyIndex (int) — порядковый индекс партии в комнате

Пример

party0 = GetPartyFromEventRoom( RoomIndex, SSQPart );

Пример использования

party0 = GetPartyFromEventRoom( RoomIndex, SSQPart );
if ( IsNull( party0 ) ) { return; }

AddPartyToEventRoomGLOBAL🟢 высокая

добавить партию в комнату события

Добавляет партию в виртуальную комнату события по ключам room_id и party_id со служебным параметром; возврат: 1 — успех.

Сигнатура

AddPartyToEventRoom( int nRoomId, int nPartyId, int nArg )

Параметры

nRoomId  (int) — идентификатор комнаты события (room_id)
nPartyId (int) — идентификатор добавляемой партии (party_id)
nArg     (int) — служебный параметр добавления (в вызовах — id объекта партии party0.id)

Пример

if ( AddPartyToEventRoom( 1, 2, party0.id ) ) {

ClearEventRoomGLOBAL🟢 высокая

очистить комнату события

Очищает виртуальную комнату события по ключу room_id с двумя служебными параметрами; возвращает результат.

Сигнатура

ClearEventRoom( int nRoomId, int nArg1, int nArg2 )

Параметры

nRoomId (int) — идентификатор комнаты события (room_id)
nArg1   (int) — служебный параметр очистки
nArg2   (int) — служебный параметр очистки

Пример

ClearEventRoom( room_index, part_type, 1 );
ClearEventRoom( room_index, part_type, 0 );

Подарки и годовщины (Gifts)

5 функций

IsCreateDateGLOBAL🟢 высокая

проверка дня создания персонажа

Проверяет, приходится ли текущий день на дату создания персонажа. Принимает
получателя (talker); возвращает 1 (да) или 0 (нет).

Сигнатура

IsCreateDate( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо-игрок (talker), чья дата создания проверяется

Пример

if ( IsCreateDate( talker ) == 1 ) {

CanGetBirthdayGiftGLOBAL🟢 высокая

можно ли выдать подарок ко дню рождения

Проверяет, может ли игрок получить подарок ко дню рождения. Принимает получателя
(talker); возвращает 1 (да) или 0 (нет).

Сигнатура

CanGetBirthdayGift( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо-игрок (talker), проверяемое на право получить подарок

Пример

if ( CanGetBirthdayGift( talker ) == 1 ) {

SaveGetBirthdayGiftTimeGLOBAL🟢 высокая

сохранить время выдачи подарка ко дню рождения

Сохраняет время получения подарка ко дню рождения (для последующего кулдауна).
Принимает получателя (talker); ничего не возвращает.

Сигнатура

SaveGetBirthdayGiftTime( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо-игрок (talker), которому сохраняется время выдачи подарка

Пример

SaveGetBirthdayGiftTime( talker );

CanGet5YearGiftGLOBAL🟢 высокая

можно ли выдать награду за 5 лет игры

Проверяет, может ли игрок получить награду за 5 лет игры. Принимает получателя
(talker); возвращает 1 (да) или 0 (нет).

Сигнатура

CanGet5YearGift( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо-игрок (talker), проверяемое на право получить награду за 5 лет

Пример

if (CanGet5YearGift(talker) == 1) {

Пример использования

if (CanGet5YearGift(talker) == 1) {
    GiveItem1( talker, @adena, ( 300 * QuestAdenaRate ) );
    SaveGet5YearGiftTimeCount(talker);
    ShowPage(talker, "event_master_yogi_5th_success_q01_23.htm");
} else {
    ShowPage(talker, "event_master_yogi_5th_failed_q01_24.htm");
}

SaveGet5YearGiftTimeCountGLOBAL🟢 высокая

сохранить счётчик выдач награды за 5 лет

Сохраняет (инкрементирует) счётчик получений награды за 5 лет игры. Принимает
получателя (talker); ничего не возвращает.

Сигнатура

SaveGet5YearGiftTimeCount( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо-игрок (talker), которому инкрементируется счётчик выдач награды

Пример

SaveGet5YearGiftTimeCount(talker);

Бинго (Bingo)

6 функций

SelectBingoNumberNPC🟢 высокая

выбрать номер на доске бинго

Выбирает ячейку nCell на доске бинго игрока talker; возвращает результат выбора (код успеха/ошибки). Метод существа (myself).

Сигнатура

SelectBingoNumber( CSharedCreatureData c, int nCell )

Параметры

c (CSharedCreatureData) — игрок (talker), на доске которого выбирают ячейку.
nCell (int) — индекс выбираемой ячейки доски бинго.

Пример

SelectBingoNumber( talker, 1 );

IsSelectedBingoNumberNPC🟢 высокая

проверить, выбран ли номер

Проверяет, выбран ли номер в ячейке nCell на доске игрока talker; возвращает 1 если выбран, 0 иначе. Метод существа (myself).

Сигнатура

IsSelectedBingoNumber( CSharedCreatureData c, int nCell )

Параметры

c (CSharedCreatureData) — игрок (talker), на доске которого проверяют ячейку.
nCell (int) — индекс проверяемой ячейки доски бинго.

Пример

if ( IsSelectedBingoNumber( talker, i1 ) == 1 ) {

Пример использования

if ( IsSelectedBingoNumber( talker, i1 ) == 1 ) {
    FHTML_SetInt( fhtml0, "Cell" + ( i0 + 1 ), i1 );
} else {
    FHTML_SetStr( fhtml0, "Cell" + ( i0 + 1 ), "?" );
}

GetNumberFromBingoBoardNPC🟢 высокая

получить номер из ячейки доски

Извлекает значение номера из ячейки nCell доски бинго игрока talker (по индексу); возвращает сам номер. Метод существа (myself).

Сигнатура

GetNumberFromBingoBoard( CSharedCreatureData c, int nCell )

Параметры

c (CSharedCreatureData) — игрок (talker), с доски которого читают номер.
nCell (int) — индекс ячейки доски бинго.

Пример

i1 = GetNumberFromBingoBoard( talker, i0 );

Пример использования

i1 = GetNumberFromBingoBoard( talker, i0 );
if ( IsSelectedBingoNumber( talker, i1 ) == 1 ) {
    FHTML_SetInt( fhtml0, "Cell" + ( i0 + 1 ), i1 );
} else {
    FHTML_SetStr( fhtml0, "Cell" + ( i0 + 1 ), "?" );
}

GetBingoSelectCountNPC🟢 высокая

количество выбранных номеров

Возвращает количество уже выбранных номеров на доске игрока talker. Метод существа (myself).

Сигнатура

GetBingoSelectCount( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок (`talker`), у которого считают число выбранных номеров

Пример

i3 = GetBingoSelectCount( talker );

ClearBingoBoardNPC🟢 высокая

очистить доску бинго

Сбрасывает доску бинго игрока talker: обнуляет выбор и счётчик выбранных. Возврата нет. Метод существа (myself).

Сигнатура

ClearBingoBoard( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок (`talker`), чью доску бинго сбрасывают

Пример

ClearBingoBoard( talker );

GetMatchedBingoLineCountNPC🟢 высокая

количество совпавших линий

Возвращает число совпавших линий (горизонтальных, вертикальных или диагональных) на доске игрока talker. Метод существа (myself).

Сигнатура

GetMatchedBingoLineCount( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок (`talker`), у которого считают совпавшие линии

Пример

i3 = GetMatchedBingoLineCount( talker );

Лото (Lotto)

11 функций

CanLottoNPC🟢 высокая

доступна ли лотерея на сервере

Проверяет, включена ли на сервере система лотереи; возвращает 1 (@TRUE) если доступна, 0 иначе. Вызывается без объекта.

Сигнатура

CanLotto(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if (CanLotto() == @TRUE)

Lotto_GetStateNPC🟢 высокая

состояние лотереи

Возвращает текущее состояние лотереи (закрыта/открыта и т.д.). Аргументов нет. Метод существа (myself).

Сигнатура

Lotto_GetState(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if ( myself.i_ai0 != Lotto_GetState( ) ) {

Пример использования

if ( Lotto_GetState( ) != 3 ) {
    return;
}

Lotto_GetRoundNumberNPC🟢 высокая

номер текущего раунда лотереи

Возвращает номер текущего раунда (тиража) лотереи. Аргументов нет. Метод существа (myself).

Сигнатура

Lotto_GetRoundNumber(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

Shout( MakeFString( 1000284, "" + Lotto_GetRoundNumber( ), Lotto_GetChosenNumber( ), "", "", "" ) );

Lotto_GetChosenNumberNPC🟢 высокая

выигрышные номера раунда

Возвращает строку выигрышных номеров текущего раунда лотереи (числа). Аргументов нет. Метод существа (myself).

Сигнатура

Lotto_GetChosenNumber(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

Shout( MakeFString( 1000284, "" + Lotto_GetRoundNumber( ), Lotto_GetChosenNumber( ), "", "", "" ) );

Lotto_GetAccumulatedRewardNPC🟢 высокая

накопленный приз лотереи

Возвращает общую сумму накопленного джекпота (приза) в лотерее. Аргументов нет. Метод существа (myself).

Сигнатура

Lotto_GetAccumulatedReward(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

FHTML_SetInt( fhtml0, "current_reward", Lotto_GetAccumulatedReward( ) );

Lotto_BuyTicketNPC🟢 высокая

купить билет лотереи

Покупает игроку talker лотерейный билет с выбранными номерами и списывает стоимость. По
декомпилю L2NPC (CNPC::Lotto_BuyTicket_4A1CF0) второй аргумент — битовая маска выбранных
номеров: движок считает установленные биты и требует ровно 5 (иначе пишет в лог
«invalid bit flag. hack?»), а третий аргумент — стоимость в адене (списывается предмет
57=адена на эту сумму). Продажа возможна только в состоянии LTS_SELLING. Возврата нет.

Сигнатура

Lotto_BuyTicket( CSharedCreatureData c, int nNumbersMask, int nCost )

Параметры

c (CSharedCreatureData) — игрок (talker), которому покупают лотерейный билет.
nNumbersMask (int) — битовая маска выбранных лотерейных номеров (ровно 5 бит; в вызовах reply).
nCost (int) — стоимость билета в адене (списывается; в вызовах 2000).

Пример

Lotto_BuyTicket( talker, reply, 2000 );

Lotto_GiveRewardNPC🟢 высокая

выплатить награду лотереи

Выплачивает игроку talker награду по результату reply (номеру выигрыша). Возврата нет. Метод существа (myself).

Сигнатура

Lotto_GiveReward( CSharedCreatureData c, int nResult )

Параметры

c (CSharedCreatureData) — игрок (talker), которому выплачивают награду.
nResult (int) — результат/номер выигрыша (в вызовах reply).

Пример

Lotto_GiveReward( talker, reply );

Пример использования

if ( ask == -801 ) {
    Lotto_GiveReward( talker, reply );
    Lotto_ShowCurRewardPage( talker, 0 );
}

Lotto_ShowBuyingPageNPC🟢 высокая

показать страницу покупки билетов

Генерирует HTML-страницу интерфейса покупки билетов для игрока talker (номер страницы page) и заполняет объект fhtml. Возврата нет. Метод существа (myself).

Сигнатура

Lotto_ShowBuyingPage( CSharedCreatureData c, int nPage, CFHTML fhtml )

Параметры

c (CSharedCreatureData) — игрок (talker), которому показывают страницу покупки.
nPage (int) — номер страницы интерфейса.
fhtml (CFHTML) — объект HTML для заполнения.

Пример

Lotto_ShowBuyingPage( talker, 0, fhtml0 );
Lotto_ShowBuyingPage( talker, talker.param1, fhtml0 );

Lotto_ShowCurRewardPageNPC🟢 высокая

показать текущие награды

Показывает игроку talker список текущих (активных) наград/выигрышей по странице page. Возврата нет. Метод существа (myself).

Сигнатура

Lotto_ShowCurRewardPage( CSharedCreatureData c, int nPage )

Параметры

c (CSharedCreatureData) — игрок (talker), которому показывают текущие награды.
nPage (int) — номер страницы списка.

Пример

Lotto_ShowCurRewardPage( talker, 0 );
Lotto_ShowCurRewardPage( talker, reply );

Lotto_ShowPrevRewardPageNPC🟢 высокая

показать прошлые награды

Показывает игроку talker архив прошлых раундов и их результатов по странице page. Возврата нет. Метод существа (myself).

Сигнатура

Lotto_ShowPrevRewardPage( CSharedCreatureData c, int nPage )

Параметры

c (CSharedCreatureData) — игрок (talker), которому показывают архив прошлых раундов.
nPage (int) — номер страницы архива.

Пример

Lotto_ShowPrevRewardPage( talker, 0 );
Lotto_ShowPrevRewardPage( talker, reply );

Lotto_MakeFinalRewardFHTMLNPC🟢 высокая

построить итоговый HTML результатов

Генерирует итоговый HTML-отчёт о результатах лотереи и заполняет объект fhtml. Возврата нет. Метод существа (myself).

Сигнатура

Lotto_MakeFinalRewardFHTML( CFHTML fhtml )

Параметры

fhtml (CFHTML) — объект HTML для заполнения итоговым отчётом.

Пример

Lotto_MakeFinalRewardFHTML( fhtml0 );

Мини-игра MG (MG)

4 функций

MG_JoinGameNPC🟢 высокая

присоединиться к мини-игре

Регистрирует игрока talker на участие в мини-игре и инициирует подготовку. Возврата нет. Метод существа (myself).

Сигнатура

MG_JoinGame( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок (`talker`), которого регистрируют на участие в мини-игре

Пример

MG_JoinGame( talker );

Пример использования

    if ( ask == -200 ) {
        MG_JoinGame( talker );
    }

Связанное событие: ответ сервера приходит событием MG_JOIN_GAME_RETURNED (см. NASC_HANDLERS).

MG_SetWinnerNPC🟢 высокая

объявить победителя

Объявляет клан clanObj победителем мини-игры (по контексту — выплата приза и обновление статуса). Возврата нет. Метод существа (myself).

Сигнатура

MG_SetWinner( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — объект клана-победителя мини-игры (`clanObj`)

Пример

MG_SetWinner( c0 );
MG_SetWinner( c1 );

Пример использования

if ( IsNullCreature( c1 ) == 0 && DistFromMe( c1 ) < 1000 ) {
    MG_SetWinner( c1 );
    BroadcastScriptEvent( 0, 20002, 8000 );
    return;
}

MG_UnregisterPledgeNPC🟢 высокая

отменить регистрацию в мини-игре

Снимает регистрацию игрока/клана talker с участия в мини-игре (отмена ставки). Возврата нет. Метод существа (myself).

Сигнатура

MG_UnregisterPledge( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок/клан (`talker`), чью регистрацию в мини-игре снимают

Пример

    MG_UnregisterPledge( talker );

Связанное событие: ответ сервера приходит событием MG_UNREGISTER_PLEDGE_RETURNED (см. NASC_HANDLERS).

MG_GetUnreturnedPointNPC🟢 высокая

невозвращённые очки

Возвращает количество очков, не выплаченных игроку talker. Семантика "невозвращённых очков" восстановлена из единственного вызова. Вызывается без объекта.

Сигнатура

MG_GetUnreturnedPoint( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок (`talker`), которому считают невыплаченные очки

Пример

    MG_GetUnreturnedPoint(talker);

Связанное событие: ответ сервера приходит событием MG_GET_UNRETURNED_POINT_RETURNED (см. NASC_HANDLERS).

Lucky Game

1 функций

ShowLuckyGameNPC🟢 высокая

показать Lucky Game

Открывает игроку talker интерфейс Lucky Game; аргумент mode задаёт тип/режим (например, 2). Возврата нет. Вызывается без объекта.

Сигнатура

ShowLuckyGame( CSharedCreatureData cCreature, int nGameType )

Параметры

cCreature (CSharedCreatureData) — игрок (`talker`), которому открывают интерфейс Lucky Game
nGameType (int) — тип/режим игры (`mode`)

Пример

ShowLuckyGame( talker, 2 );
ShowLuckyGame( talker, 1 );

РЫБОЛОВНЫЙ ИВЕНТ (Fishing)

4 функций

GetFishingEventRankingNPC🟢 высокая

место игрока в рейтинге рыбалки

Возвращает место игрока в рейтинге рыболовного ивента. Принимает один аргумент — игрока (talker) типа CSharedCreatureData. Возвращает целое число.

Сигнатура

GetFishingEventRanking( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, чьё место в рейтинге рыболовного ивента запрашивают

Пример

i0 = GetFishingEventRanking(talker);

Пример использования

i0 = GetFishingEventRanking(talker);
if (i0 == 0) {
    Say("");
} else {
    Say(IntToStr(i0) + "");
}

ShowHtmlFishingEventRankingNPC🟢 высокая

показать окно рейтинга

Показывает игроку окно рейтинга рыболовного ивента. Принимает один аргумент — игрока (talker) типа CSharedCreatureData. Возвращает целое число.

Сигнатура

ShowHtmlFishingEventRanking( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, которому показывают окно рейтинга рыболовного ивента

Пример

ShowHtmlFishingEventRanking(talker);

GiveFishingEventPrizeNPC🟢 высокая

выдать приз за участие

Выдаёт игроку приз за участие в рыболовном ивенте — отправляет серверу команду начисления
награды указанному игроку. Принимает один аргумент — игрока (talker) типа CSharedCreatureData.
Функция реальна и рабочая (просто в собранных боевых скриптах ивент не задействован); прочие
функции рыбалки рядом (рейтинг, время до награды, окно рейтинга) — тоже настоящие.

Сигнатура

GiveFishingEventPrize( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — игрок, которому выдают приз за рыболовный ивент

Пример

GiveFishingEventPrize(talker);

GetFishingEventRewardRemainTimeNPC🟢 высокая

время до следующей выдачи наград

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

Сигнатура

GetFishingEventRewardRemainTime(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if (GetFishingEventRewardRemainTime() == @FALSE)

Пример использования

if (GetFishingEventRewardRemainTime() == 0) {
    ShowPage(talker, "no_fish_event_reward001.htm");
} else {
    GiveFishingEventPrize(talker);
}

PvP-матчи (PvP Match)

10 функций

UpdatePVPPointNPC🟢 высокая

изменить PvP-очки игрока

Изменяет количество PvP-очков существа на величину delta (может быть отрицательной). Возврата нет.

Сигнатура

UpdatePVPPoint( CSharedCreatureData c, int nDelta )

Параметры

c (CSharedCreatureData) — существо, которому изменяют PvP-очки.
nDelta (int) — величина изменения PvP-очков со знаком (в вызовах -5000, i4).

Пример

UpdatePVPPoint(talker, i4);

Пример использования

if (IsInCategory(@third_class_group, talker.occupation) || IsInCategory(@fourth_class_group, talker.occupation) && talker.level >= 40) {
    UpdatePVPPoint(talker, -5000);
    IncrementParam(talker, 9, -1);
    ShowPage(talker, fnPkDownSuccess);
} else {
    ShowPage(talker, fnNoPvpPoint);
}

GetPVPPointNPC🟢 высокая

получить PvP-очки игрока

Возвращает текущее количество PvP-очков существа.

Сигнатура

GetPVPPoint( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, чьи PvP-очки возвращают

Пример

if (GetPVPPoint(talker) < 0)

Пример использования

if (GetPVPPoint(talker) < 0) {
    ShowPage(talker, fnNoPvpPoint);
} else {
    ShowMultisell(638, talker);
}

RegisterUserPVPMatchNPC🟢 высокая

записать игрока в PvP-матч

Регистрирует существо для участия в матче PvP. Возврата нет.

Сигнатура

RegisterUserPVPMatch( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, регистрируемое на матч PvP

Пример

RegisterUserPVPMatch( talker );

Пример использования

    if ( talker.level >= 70 && talker.level <= 75 ) {
        RegisterUserPVPMatch( talker ); 
    } else {
        ShowPage( talker, "cratae_teleport_npc010.htm" ); 
    }

Связанное событие: ответ сервера приходит событием REGISTER_USER_PVP_MATCH_RESULT (см. NASC_HANDLERS).

UnregisterUserPVPMatchNPC🟢 высокая

снять игрока с PvP-матча

Отменяет регистрацию существа в матче PvP. Возврата нет.

Сигнатура

UnregisterUserPVPMatch( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, чью регистрацию на матч PvP отменяют

Пример

UnregisterUserPVPMatch( talker );
UnregisterUserPVPMatch( creature );
UnregisterUserPVPMatch( c0 );

Пример использования

    if ( InMyTerritory( c0 ) == 0 ) {
        UnregisterUserPVPMatch( c0 ); 
    }

Связанное событие: ответ сервера приходит событием UNREGISTER_USER_PVP_MATCH_RESULT (см. NASC_HANDLERS).

IsUserPVPMatchingNPC🟢 высокая

проверить участие в PvP-матче

Диагностическая функция: проверяет, зарегистрировано ли существо в матче PvP.

Сигнатура

IsUserPVPMatching( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, которое проверяют на регистрацию в матче PvP

Пример

IsUserPVPMatching( creature );

Пример использования

    if ( creature.is_pc == @TRUE ) {
        IsUserPVPMatching( creature ); 
    }

Связанное событие: ответ сервера приходит событием IS_USER_PVPMATCHING_RESULT (см. NASC_HANDLERS).

CheckRegisterUserPVPMatchNPC🟢 высокая

проверить условия записи в PvP-матч

Диагностическая функция: валидирует предусловия регистрации существа в PvP-матч.

Сигнатура

CheckRegisterUserPVPMatch( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, для которого проверяют предусловия регистрации в PvP-матч

Пример

    CheckRegisterUserPVPMatch( talker );

Связанное событие: ответ сервера приходит событием CHECK_REGISTER_USER_RESULT (см. NASC_HANDLERS).

AddKillPointUserPVPMatchNPC🟢 высокая

начислить очки за убийство

Добавляет существу очки за убийство в матче PvP (kill_points). Возврата нет.

Сигнатура

AddKillPointUserPVPMatch( CSharedCreatureData c, int nKillPoints )

Параметры

c (CSharedCreatureData) — существо, которому добавляют очки за убийство.
nKillPoints (int) — количество добавляемых очков за убийство.

Пример

AddKillPointUserPVPMatch( c0, i0 );
AddKillPointUserPVPMatch(c0, my_point);

Пример использования

if ( IsNullCreature( c0 ) == 0 ) {
    AddKillPointUserPVPMatch( c0, i0 ); 
    AddHateInfo( c0, i0, 0, 1, 1 ); 
}

GetRankUserPVPMatchNPC🟢 высокая

получить ранг в PvP-рейтинге

Диагностическая функция: возвращает текущий рейтинг/ранг существа в PvP-рейтинге.

Сигнатура

GetRankUserPVPMatch( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо, чей ранг в PvP-рейтинге возвращают

Пример

GetRankUserPVPMatch( c0 );

Пример использования

    if ( IsNullCreature( c0 ) == 0 ) {
        GetRankUserPVPMatch( c0 ); 
    }

Связанное событие: ответ сервера приходит событием GET_RANK_USER_PVP_MATCH_RESULT (см. NASC_HANDLERS).

UnregisterPVPMatchNPC🟢 высокая

снять партию с командного матча

Отменяет регистрацию партии из командного матча PvP; принимает партию и существо. Возврата нет.

Сигнатура

UnregisterPVPMatch( CSharedPartyData party, CSharedCreatureData c )

Параметры

party (CSharedPartyData) — партия, снимаемая с регистрации на матч.
c (CSharedCreatureData) — существо (инициатор/представитель партии), от которого идёт отмена.

Пример

UnregisterPVPMatch(party0, c0);
UnregisterPVPMatch(party1, c2);
UnregisterPVPMatch(party0, talker);

Пример использования

    if (IsNullCreature(c1) == 0) {
        UnregisterPVPMatch(party0, c0);
    }

Связанное событие: ответ сервера приходит событием UNREGISTER_PVP_MATCH_RESULT (см. NASC_HANDLERS).

GetStatusForOlympiadFieldNPC🟢 высокая

получить статус олимпийского поля

По числовому field_id возвращает статус олимпийского поля: 0 — свободно, 1 — занято. Вызывается на объекте NPC.

Сигнатура

GetStatusForOlympiadField( int nFieldId )

Параметры

nFieldId (int) — номер олимпийского поля, статус которого запрашивается (возврат: 0 — свободно, 1 — занято).

Пример

if ( GetStatusForOlympiadField( i0 ) == 0 ) {

Пример использования

if (GetStatusForOlympiadField(i0) == 0) {
    FHTML_SetStr(fhtml0, "Status" + i0, "&$906;");
}

Командные ивенты (Team Event)

10 функций

TeamGetMembersCountNPC🟢 высокая

число членов в команде

По ключам event_id и team_id возвращает количество членов в команде.

Сигнатура

TeamGetMembersCount( int nEventId, int nTeamId )

Параметры

nEventId (int) — идентификатор командного события
nTeamId (int) — идентификатор команды внутри события

Пример

i8 = TeamGetMembersCount( my_Event, i0 );
i9 = TeamGetMembersCount( my_Event, 1 );
i9 = TeamGetMembersCount( my_Event, 2 );
i3 = TeamGetMembersCount( my_Event, talker.m_nPvP_Event_TeamId );

Пример использования

i3 = TeamGetMembersCount( my_Event, talker.m_nPvP_Event_TeamId ); 
if ( i1 == 0 ) { i2 = myself.sm.subjob0_class + myself.sm.subjob1_class; i3 = TeamGetMembersCount( my_Event, 1 ) + TeamGetMembersCount( my_Event, 2 ); }

TeamEventGetStatusNPC🟢 высокая

статус командного события

По event_id возвращает статус командного события: 0 — неактивно, 1 — активно.

Сигнатура

TeamEventGetStatus( int nEventId )

Параметры

nEventId (int) — идентификатор командного события, чей статус запрашивается

Пример

if ( TeamEventGetStatus( my_Event ) == @TEAMEVENT_STATUS_BATTLE ) {

Пример использования

if ( TeamEventGetStatus( my_Event ) == @TEAMEVENT_STATUS_NOMINATION ) {
    SendScriptEventEx( myself.sm, seDirectorShowPage, pageNomination, talker.id ); // показать страничку вывода результатов
}

TeamEventSetStatusNPC🟢 высокая

задать статус командного события

Устанавливает статус командного события по event_id и значению status. Возврата нет.

Сигнатура

TeamEventSetStatus( int nEventId, int nStatus )

Параметры

nEventId (int) — идентификатор командного события
nStatus (int) — новый статус события (0 — неактивно, 1 — активно)

Пример

TeamEventSetStatus( my_Event, @TEAMEVENT_STATUS_REGISTRATION);

Пример использования

if ( timer_id == timer_teleport ) { // телепорт команд в город
    TeamEventSetStatus( my_Event, @TEAMEVENT_STATUS_NOMINATION );
    TeamInstantTeleport(my_Event, 1, Return_X, Return_Y, Return_Z );
    TeamInstantTeleport(my_Event, 2, Return_X, Return_Y, Return_Z );
    InstantTeleportInMyTerritory( Return_X, Return_Y, Return_Z, 50 );
}

TeamShowSystemMessage2NPC🟢 высокая

системное сообщение всей команде

Показывает системное сообщение всем членам команды: event_id, team_id, msg_id, число параметров и сами параметры (неиспользуемые — _blank).

Сигнатура

TeamShowSystemMessage2( int nEventId, int nTeamId, int nSysMsgNo, int nParamCount, string pwsParam1, string pwsParam2, string pwsParam3, string pwsParam4, string pwsParam5, string pwsParam6, string pwsParam7 )

Параметры

nEventId (int) — идентификатор командного события
nTeamId (int) — идентификатор команды, которой шлётся сообщение
nSysMsgNo (int) — номер системного сообщения
nParamCount (int) — количество заполненных параметров сообщения
pwsParam1 (string) — 1-й параметр-подстановка в системное сообщение
pwsParam2 (string) — 2-й параметр-подстановка в системное сообщение
pwsParam3 (string) — 3-й параметр-подстановка в системное сообщение
pwsParam4 (string) — 4-й параметр-подстановка в системное сообщение
pwsParam5 (string) — 5-й параметр-подстановка в системное сообщение
pwsParam6 (string) — 6-й параметр-подстановка в системное сообщение
pwsParam7 (string) — 7-й параметр-подстановка в системное сообщение

Пример

TeamShowSystemMessage2( my_Event, 1, 1983, 1, s0, _blank, _blank, _blank, _blank, _blank, _blank );

Пример использования

if ( timer_id == 33328 ) { // сообщение: Телепорт через 1
    TeamShowSystemMessage2( my_Event, my_Team, sysCenterRed, 1, MakeFString( 3223119, "1", _blank, _blank, _blank, _blank ), _blank, _blank, _blank, _blank, _blank, _blank );
    AddTimerEx( 33323, 1000 );
}

TeamGetMemberByIndexNPC🟢 высокая

получить члена команды по индексу

По ключам event_id, team_id и member_index возвращает существо — члена команды.

Сигнатура

TeamGetMemberByIndex( int nEventId, int nTeamId, int nMemberIndex )

Параметры

nEventId (int) — идентификатор командного события
nTeamId (int) — идентификатор команды внутри события
nMemberIndex (int) — порядковый индекс члена команды

Пример

c0 = TeamGetMemberByIndex( my_Event, i0, 0 );
c0 = TeamGetMemberByIndex( my_Event, i0, i1 );
c0 = TeamGetMemberByIndex( my_Event, 1, i8 );
c0 = TeamGetMemberByIndex( my_Event, 2, i8 );

Пример использования

c0 = TeamGetMemberByIndex( my_Event, i0, i1 ); 
if ( IsNullCreature( c0 ) == 0 ) {
    GiveItem1( c0, defaultCostID, defaultCostAmount ); // возвращаем взнос
}

TeamAddMemberNPC🟢 высокая

добавить игрока в команду

Добавляет существо в команду по ключам event_id и team_id; возвращает результат.

Сигнатура

TeamAddMember( int nEventId, int nTeamId, CSharedCreatureData target )

Параметры

nEventId (int) — идентификатор командного события
nTeamId (int) — идентификатор команды, в которую добавляют
target (CSharedCreatureData) — существо (игрок), добавляемое в команду

Пример

TeamAddMember( my_Event, 1, c0 );
TeamAddMember( my_Event, 2, c0 );
TeamAddMember( my_Event, 3, talker );
TeamAddMember( my_Event, 4, talker );

Пример использования

if ( TeamGetMembersCount( my_Event, 4) < 100 ) { // если команда 4 еще не полна - пишем в нее
    TeamAddMember( my_Event, 4, talker );
}

TeamRemoveMemberNPC🟢 высокая

удалить игрока из команды

Удаляет существо из команды; возвращает результат.

Сигнатура

TeamRemoveMember( CSharedCreatureData target )

Параметры

target (CSharedCreatureData) — существо (игрок), удаляемое из команды

Пример

TeamRemoveMember( c0 );
TeamRemoveMember( target );

Пример использования

if ( IsNullCreature( c0 ) == 0 ) {
    TeamRemoveMember( c0 );
    if ( myself.i_quest4 > 0 ) {
        GiveItem1( c0, myself.i_quest3, myself.i_quest4 );
    }
}

TeamSetRestartPointNPC🟢 высокая

точка возрождения команды

Устанавливает точку возрождения для команды по ключам event_id, team_id и координатам x, y, z; возвращает результат.

Сигнатура

TeamSetRestartPoint( int nEventId, int nTeamId, int nX, int nY, int nZ )

Параметры

nEventId (int) — идентификатор командного события
nTeamId (int) — идентификатор команды, которой задают точку возрождения
nX (int) — координата X точки возрождения
nY (int) — координата Y точки возрождения
nZ (int) — координата Z точки возрождения

Пример

TeamSetRestartPoint(my_Event, 1, 147574, 46717, -3400);
TeamSetRestartPoint(my_Event, 2, 151496, 46717, -3400);

TeamGetInactiveCharactersNPC🟢 высокая

получить неактивных членов команды

По ключам event_id, team_id и порогу простоя в секундах (timeout_sec) возвращает неактивных членов команды.

Сигнатура

TeamGetInactiveCharacters( int nEventId, int nTeamId, int nInactiveTimeSec )

Параметры

nEventId (int) — идентификатор командного события
nTeamId (int) — идентификатор команды
nInactiveTimeSec (int) — порог простоя в секундах, после которого член считается неактивным

Пример

TeamGetInactiveCharacters( my_Event, 1, checkInnactiveCharPeriod * 60 );
TeamGetInactiveCharacters( my_Event, 2, checkInnactiveCharPeriod * 60 );

Пример использования

if ( TeamEventGetStatus( my_Event ) == @TEAMEVENT_STATUS_BATTLE ) {
    TeamGetInactiveCharacters( my_Event, 1, checkInnactiveCharPeriod * 60 );
    TeamGetInactiveCharacters( my_Event, 2, checkInnactiveCharPeriod * 60 );

    AddTimerEx( 33319, checkInnactiveCharPeriod * 60000 );
}

TeamEventAddMembersWithBalanceNPC🟢 высокая

добавить членов с балансировкой

Добавляет членов в событие с автоматической балансировкой: event_id, список членов, число команд (teams_count) и диапазон категорий (category_from, category_to); возвращает результат.

Сигнатура

TeamEventAddMembersWithBalance( int nEventId, CIntList pIntList, int nTeamsNumber, int nBalanceCategoryFrom, int nBalanceCategoryTo )

Параметры

nEventId (int) — идентификатор командного события
pIntList (CIntList) — список идентификаторов добавляемых членов
nTeamsNumber (int) — число команд, по которым распределяют участников
nBalanceCategoryFrom (int) — нижняя граница категории балансировки
nBalanceCategoryTo (int) — верхняя граница категории балансировки

Пример

i0 = TeamEventAddMembersWithBalance( my_Event, myself.db_int_list, 2, tvt_group_start, tvt_group_end );

Ущелье (Cleft)

5 функций

GetCleftStateNPC🟢 высокая

состояние Cleft-зоны

Геттер (CNPC) без аргументов. Возвращает int — текущее состояние Cleft-зоны (расселины).

Сигнатура

GetCleftState(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if ( GetCleftState( ) != 2 ) {

Пример использования

if ( GetCleftState( ) != 2 ) {
    return;
}

CleftManagerEnterNPC🟢 высокая

инициализация менеджера расселины

Инициализирует менеджер расселины (Cleft); вызывается при создании зоны.
Аргументов не принимает и ничего не возвращает.

Сигнатура

CleftManagerEnter(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

CleftManagerEnter();

CleftUserEnterNPC🟢 высокая

регистрация игрока в расселине

Регистрирует игрока в системе расселины для отслеживания участников. Принимает
получателя (talker); ничего не возвращает.

Сигнатура

CleftUserEnter( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо-игрок (talker), регистрируемое в системе расселины

Пример

CleftUserEnter(talker);

Пример использования

if (IsCleftUser(talker) == 0) {
    CleftUserEnter(talker);
} else {
    ShowPage(talker, fnNoEnter);
}

IsCleftUserNPC🟢 высокая

проверка участия в расселине

Проверяет, является ли игрок участником расселины. Принимает получателя
(talker); возвращает 0 (нет) или 1 (да).

Сигнатура

IsCleftUser( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо-игрок (talker), проверяемое на участие в расселине

Пример

if (IsCleftUser(talker) == 0) {

Пример использования

if (IsCleftUser(talker) == 0) {
    CleftUserEnter(talker);
} else {
    ShowPage(talker, fnNoEnter);
}

CleftCenterDestroyedNPC🟢 высокая

обработчик уничтожения центра расселины

Обрабатывает уничтожение центра расселины и запускает события завершения.
Принимает тип зоны, существо и точку разрушения; ничего не возвращает.

Сигнатура

CleftCenterDestroyed( int nZoneType, CSharedCreatureData c, int nDestroyPoint )

Параметры

nZoneType (int) — тип зоны расселины.
c (CSharedCreatureData) — существо, связанное с уничтожением центра.
nDestroyPoint (int) — точка (значение позиции) разрушения центра.

Пример

CleftCenterDestroyed( ZoneType, myself.c_ai0, DestroyPoint );

Блок-чекер (Block Upset)

6 функций

BlockUpsetNPC🟢 высокая

инициализация мини-игры «перевёртыш»

Регистрирует участника мини-игры BlockUpset на площадке. По обработчику L2Server
(NpcSocket::NpcBlockUpset_756428) пакет opcode 187 — это диспетчер под-команд по первому полю;
вызову BlockUpset соответствует под-команда 1 → CBlockUpsetManager::AddBlockUpsetPoint (добавляет
точку/участника на площадку GroundID). Обработчик использует существо-участника и id площадки;
второй аргумент (nInitParam) во всех вызовах равен 0 и путём регистрации не потребляется —
зарезервированное поле. Ничего не возвращает.

Сигнатура

BlockUpset( int nGroundId, int nInitParam, CSharedCreatureData c, int nStartPoint )

Параметры

nGroundId (int) — идентификатор площадки игры (GroundID).
nInitParam (int) — зарезервированное служебное поле (в вызовах всегда 0; сервером при регистрации не используется).
c (CSharedCreatureData) — существо-участник (speller), добавляемое на площадку.
nStartPoint (int) — начальная точка участника (BlockUpsetPoint).

Пример

BlockUpset( GroundID, 0, speller, BlockUpsetPoint );
BlockUpset( GroundID, 0, GetCreatureFromIndex( script_event_arg2 ), BlockUpsetPoint );

Пример использования

if ( script_event_arg1 == 9999 ) {
    BlockUpset( GroundID, 0, GetCreatureFromIndex( script_event_arg2 ), BlockUpsetPoint );
    SetVisible( 0 );
    AddTimerEx( 1000, 3000 );
}

BlockUpsetChangeAmountNPC🟢 высокая

задать количество блоков

Меняет количество блоков в текущей игре (14, 16 или 20). Принимает идентификатор
площадки (GroundID) и количество; ничего не возвращает.

Сигнатура

BlockUpsetChangeAmount( int nGroundId, int nBlockCount )

Параметры

nGroundId (int) — идентификатор площадки игры (GroundID).
nBlockCount (int) — количество блоков (14, 16 или 20).

Пример

BlockUpsetChangeAmount( GroundID, 16 );
BlockUpsetChangeAmount( GroundID, 20 );
BlockUpsetChangeAmount( GroundID, 14 );

Пример использования

if ( timer_id == 2000 ) {
    BlockUpsetChangeAmount( GroundID, 14 );
}

BlockUpsetChangeColorNPC🟢 высокая

переключить цвет блоков

Переключает цвет блоков (0 или 1) для смены уровня сложности. Принимает
идентификатор площадки (GroundID) и идентификатор цвета (ColorID); ничего не
возвращает.

Сигнатура

BlockUpsetChangeColor( int nGroundId, int nColorId )

Параметры

nGroundId (int) — идентификатор площадки игры (GroundID).
nColorId (int) — идентификатор цвета блоков (ColorID, 0 или 1).

Пример

BlockUpsetChangeColor( GroundID, ColorID );

BlockUpsetRegisterMeNPC🟢 высокая

зарегистрировать NPC в инстансе игры

Регистрирует текущего NPC как часть инстанса игры. Принимает идентификатор
площадки (GroundID); ничего не возвращает.

Сигнатура

BlockUpsetRegisterMe( int nGroundId )

Параметры

nGroundId (int) — идентификатор площадки игры (GroundID), к которой привязывается NPC.

Пример

BlockUpsetRegisterMe( GroundID );

BlockUpsetUserEnterNPC🟢 высокая

вход игрока в инстанс игры

Вводит игрока в инстанс BlockUpset и подготавливает его состояние. Принимает
идентификатор площадки (GroundID) и получателя (talker); ничего не возвращает.

Сигнатура

BlockUpsetUserEnter( int nGroundId, CSharedCreatureData c )

Параметры

nGroundId (int) — идентификатор площадки игры (GroundID).
c (CSharedCreatureData) — существо-игрок (talker), вводимое в инстанс.

Пример

BlockUpsetUserEnter( GroundID, talker );

BlockUpsetManagerEnterNPC🟢 высокая

инициализация менеджера игры

Инициализирует менеджер игры; вызывается один раз при создании инстанса.
Принимает идентификатор площадки (GroundID); ничего не возвращает.

Сигнатура

BlockUpsetManagerEnter( int nGroundId )

Параметры

nGroundId (int) — идентификатор площадки игры (GroundID), для которой создаётся менеджер.

Пример

BlockUpsetManagerEnter( GroundID );

Прочие ивенты и системное (Misc)

11 функций

IsUserLockedGLOBAL🟢 высокая

проверка статуса блокировки игрока

Проверяет, находится ли игрок в статусе блокировки. Принимает получателя
(talker); возвращает 1 (заблокирован) или 0 (нет).

Сигнатура

IsUserLocked( CSharedCreatureData c )

Параметры

c (CSharedCreatureData) — существо-игрок, проверяемое на статус блокировки

Пример

if ( IsUserLocked( talker ) ) {

Пример использования

if ( IsUserLocked( talker ) ) {
    ShowPage( talker, "locked_user.htm" );
    return;
}

GetRank_RimKamarokaGLOBAL🟢 высокая

ранг игрока в рейтинге босса

Возвращает строку с данными игрока в рейтинге босса Rim/Kamaroka. Принимает
уровень и тип запроса (2 — ранг, 4 — XP); возвращает строку.

Сигнатура

GetRank_RimKamaroka( int nRimType, int nLevel )

Параметры

nRimType (int) — тип запроса данных рейтинга (2 — ранг, 4 — XP)
nLevel (int) — уровень, по которому запрашиваются данные рейтинга

Пример

if ( IsSameString( GetRank_RimKamaroka( i6, 2 ), _blank ) == 1 ) {

Пример использования

if ( i6 >= 7 && i6 <= 14 && IsSameString( GetRank_RimKamaroka( ( i6 - 5 ), 2 ), _blank ) != 1 ) {
    if ( babble_mode == 1 ) { Shout( "Rank propagation " + IntToStr( i6 - 5 ) ); }
    s0 = MakeFString( 1800200, _blank, _blank, _blank, _blank, _blank );
    Say( MakeFString( 1800202, GetRank_RimKamaroka( ( i6 - 5 ), 2 ), s0, _blank, _blank, _blank ) );
} else {
    if ( babble_mode == 1 ) { Shout( "Rank propagation failed" ); }
}

Party_GetSubLeaderGLOBAL🟢 высокая

получить заместителя лидера группы

Возвращает заместителя лидера группы игрока. Принимает получателя (talker);
возвращает объект/существо (в примере присваивается переменной типа существа).

Сигнатура

Party_GetSubLeader( CSharedCreatureData cCreature )

Параметры

cCreature (CSharedCreatureData) — существо-игрок (talker), чью группу опрашивают на заместителя лидера

Пример

c1 = Party_GetSubLeader(talker);

BroadCastUIEventNpcStrGLOBAL🟢 высокая

разослать UI-событие всем игрокам в зоне

Рассылает UI-событие (например дирижабля) всем игрокам в зоне. Принимает NPC,
идентификатор события и набор числовых и строковых параметров (координаты,
сообщение); ничего не возвращает.

Сигнатура

BroadCastUIEventNpcStr( CSharedCreatureData cCreature, int nRange, int nShowTimer, int nUnk1, int nUnk2, string pwsTimerType, string pwsStartTimeMin, string pwsStartTimeSec, int nNpcStringId, string pwsEndTimeMin, string pwsEndTimeSec )

Параметры

cCreature (CSharedCreatureData) — NPC-источник рассылаемого UI-события
nRange (int) — радиус рассылки события вокруг NPC
nShowTimer (int) — признак отображения таймера
nUnk1 (int) — служебный числовой параметр события
nUnk2 (int) — служебный числовой параметр события
pwsTimerType (string) — тип таймера события
pwsStartTimeMin (string) — минуты начального времени таймера
pwsStartTimeSec (string) — секунды начального времени таймера
nNpcStringId (int) — идентификатор NPC-строки для сообщения
pwsEndTimeMin (string) — минуты конечного времени таймера
pwsEndTimeSec (string) — секунды конечного времени таймера

Пример

    BroadCastUIEventNpcStr( myself.sm, 2000, 0, 0, 0, "0", IntToStr( myself.i_ai2 ), "00", SUMMON_AIRSHIP_MESSAGE_ID + 3 , "0", "0" );





================================================================================
================================================================================
ЧАСТЬ II.  ФУНКЦИИ NPC
================================================================================
================================================================================

Методы самого персонажа (NPC). Вызываются в скриптах NPC; запись короткая,
без `myself.` (получатель — сам персонаж).

CheckRegisterParty2NPC🟢 высокая

проверить две партии для командного матча

Диагностическая функция: валидирует, могут ли две партии зарегистрироваться на командный матч.

Сигнатура

CheckRegisterParty2( CSharedPartyData party1, CSharedPartyData party2 )

Параметры

party1 (CSharedPartyData) — первая партия, регистрируемая на командный матч.
party2 (CSharedPartyData) — вторая партия, проверяемая на возможность совместной регистрации.

Пример

CheckRegisterParty2(party0, party1);

Пример использования

if (myself.i_quest0 == 1 && myself.i_quest3 == 1) {
    CheckRegisterParty2(party0, party1);
}

IsEventDropTimeNPC🟢 высокая

действует ли событийное время дропа

Проверяет, действует ли сейчас событийное время дропа. Аргументов не принимает;
возвращает 1 (да) или 0 (нет).

Сигнатура

IsEventDropTime(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

if ( IsEventDropTime( ) == 1 ) {

Пример использования

if ( IsEventDropTime( ) == 1 ) {
    ShowPage( talker, fnHi );
} else {
    ShowPage( talker, fnHi2 );
}

SetPrivateIDNPC🟢 высокая

установить приватный ID объекта

Задаёт приватный идентификатор для NPC/объекта. Принимает значение ID (часто
произведение part_type на room_index); вызывается на myself, ничего не
возвращает.

Сигнатура

SetPrivateID( int nId )

Параметры

nId (int) — приватный идентификатор, присваиваемый NPC/объекту (часто part_type * room_index).

Пример

SetPrivateID( ( part_type * room_index ) );

GetPlayingUserCountNPC🟢 высокая

количество активных игроков на сервере

Возвращает количество активных игроков на сервере. Аргументов не принимает;
возвращаемое значение в декодированных скриптах не используется явно.

Сигнатура

GetPlayingUserCount(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

GetPlayingUserCount( );

IsAutoMacroUseNPC🟢 высокая

проверка использования макросов

Проверяет, использует ли игрок макросы. Принимает цель (target); возвращает
1 (да) или 0 (нет), в примере сравнивается с @TRUE.

Сигнатура

IsAutoMacroUse( CSharedCreatureData c )

Параметры

c (CSharedCreatureData) — существо-цель (target), проверяемое на использование макросов

Пример

if (HaveMemo(target, @c_development_quest70) == @TRUE && GetMemoState(target, @c_development_quest70) == 2 && IsAutoMacroUse( target ) == @TRUE)

Пример использования

if (HaveMemo(target, @c_development_quest70) == @TRUE && GetMemoState(target, @c_development_quest70) == 2 && IsAutoMacroUse( target ) == @TRUE)
{
    i0 = @c_development_quest70;
    i1 = @c_development_item7;
    i2 = 100;
    i3 = 15;
}

RegisterPledgeUpEventListenerNPC🟢 высокая

зарегистрировать слушателя событий клана

Регистрирует слушателя событий повышения уровня клана. Аргументов не принимает и
ничего не возвращает.

Сигнатура

RegisterPledgeUpEventListener(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

RegisterPledgeUpEventListener();

XMasEventManagerEnterNPC🟢 высокая

инициализация рождественского события

Инициализирует рождественское событие (Xmas). Аргументов не принимает и ничего
не возвращает.

Сигнатура

XMasEventManagerEnter(  )

Параметры

(нет — функция вызывается без аргументов)

Пример

XMasEventManagerEnter();

Пример использования

    if (is_main_manager) {
        XMasEventManagerEnter();
    }





================================================================================
================================================================================
ЧАСТЬ III.  ФУНКЦИИ MAKER (СПАВНЕР)
================================================================================
================================================================================

Методы спавнера/макера (NpcMaker) — порождение и переспаун NPC, регистрация
событий территорий. Вызываются в скриптах NpcMaker.

ЖУРНАЛИРОВАНИЕ (Log)

8 функций

AddLogGLOBAL🟢 высокая

запись в журнал действий игрока

Добавляет запись в журнал действий игрока: первым аргументом передаётся nLogType —
код типа записи, вторым — игрок c, третьим — связанный идентификатор nParam. Тип
определяет смысл: 1 — приём квеста, 2 — обновление прогресса, 3 — завершение (три самых
частых), 6 — получение предмета; прочие коды (4, 7–11 и именованные константы вида
@LOG_* из [manual_pch]) отвечают за иные категории. Важная тонкость: namespace
третьего аргумента зависит от типа — для квестовых 1/2/3 это id квеста [quest_pch], а
для 6 это id предмета [item_pch], который только что выдали; функция ничего значимого
не возвращает.

Сигнатура

AddLog( int nLogType, CSharedCreatureData cCreature, int nParam )

Параметры

nLogType  (int) — код категории записи журнала. Именованные константы [manual_pch] @LOG_*:
    1 GET_NOBLESS_GATE_PASS · 2 ERROR · 3 DEBUG · 4 OF_TIMEATTACK ·
    7 ENTER_CREVICE_OF_THE_DIMENSION · 8 LEAVE_CREVICE · 9 ENTER_ROYAL_RUSH ·
    10 CASTLE_WIZARD_TELEPORT · 111 PCCAFE_POINT_BUFF · 324 USE_CHANCE_CARD.
    NB: наблюдаемое использование мелких значений с квестом НЕ совпадает с этими именами
    (1/2/3 массово идут с quest_id — по контексту этапы квеста приём/прогресс/завершение,
    6 — с id предмета), т.е. первый аргумент трактуется как код категории лога, и часть
    значений (5, 6, 11) вообще без именованной константы.
cCreature (CSharedCreatureData) — игрок.
nParam    (int) — связанный id; namespace зависит от категории: для квестовых значений — [quest_pch],
    для «получения предмета» (6) — [item_pch].

Пример

AddLog( 2, talker, @deliver_goods );

AddLogExGLOBAL🟢 высокая

расширенная запись журнала с дополнительным числовым полем

Расширенная версия AddLog с дополнительным числовым полем nParam2. Принимает nLogType
(код типа события), игрока c и два связанных значения nParam и nParam2; namespace
полей зависит от типа события. Принадлежит глобальному объекту.

Сигнатура

AddLogEx( int nLogType, CSharedCreatureData cCreature, int nParam, int nParam2 )

Параметры

nLogType  (int) — код категории записи журнала (то же пространство, что у AddLog: константы @LOG_*
    из [manual_pch], напр. @LOG_USE_CHANCE_CARD=324; встречаются и скриптовые вроде Log_pc_LevDiff).
cCreature (CSharedCreatureData) — связанный с записью игрок
nParam    (int) — первое связанное значение записи (namespace зависит от категории)
nParam2   (int) — второе связанное значение записи

Пример

AddLogEx(@LOG_USE_CHANCE_CARD, talker, RoomIndex, i0);

Пример использования

if ( log_mode == 1 ) {
    AddLogEx( Log_pc_LevDiff, attacker, i0, 0 );
}

AddScriptLogGLOBAL🟢 высокая

произвольная строковая запись в скрипт-лог

Записывает произвольную строковую запись в скрипт-лог: отладочное и диагностическое
сообщение с числовым тегом nLogId и текстом sText. Служит для трассировки логики
скрипта и игроку не видно. Принадлежит глобальному объекту.

Сигнатура

AddScriptLog( int nLogId, string sText )

Параметры

nLogId (int) — числовой тег записи. Встречаются @LOG_ERROR (2) и «сырые» 2/3; произвольный тег
               категории отладочного лога (не влияет на геймплей).
sText  (string) — текст лога.

Пример

AddScriptLog( 3, "... all ok" );

Пример использования

if (i2 > 5) {
    AddScriptLog(3, "[" + myself.sm.name + "] try return 5000 CRP to [ " + talker.name + "]");
}

AddLogExWithoutCreatureGLOBAL🟢 высокая

расширенная запись без привязки к существу

Расширенная версия журналирования, пишущая запись, не привязанную к существу, — для
системных и глобальных событий, где конкретного игрока нет. Принимает nLogType (код
типа события) и два связанных значения nParam и nParam2. Принадлежит глобальному
объекту.

Пример

AddLogExWithoutCreature(Log_NoKilling, i0, 0);
AddLogExWithoutCreature(Log_ChainSpawnSuccess, i0, 0);
AddLogExWithoutCreature(Log_MobClearing, i0, 0);

Пример использования

if (log_mode == 1) {
    AddLogExWithoutCreature(Log_ChainSpawnSuccess, i0, 0);
}

AddLogByNpcNPC🟢 высокая

журналирование от лица NPC

Журналирование от лица NPC: запись атрибутируется конкретному NPC, а не глобальной
системе. Сервер лишь записывает тег и два числа в журнал (на геймплей не влияет),
поэтому тег — открытый набор аналитических кодов, задаваемых соглашением скрипта, а
не фиксированный enum. Принадлежит NPC.

Сигнатура

AddLogByNpc( int nLogTag, CSharedCreatureData c, int nParam1, int nParam2 )

Параметры

nLogTag (int) — тег/тип записи журнала (открытый аналитический набор; в вызовах
    встречаются 122, 326, 413, 414, 416, 899, 8057 и др. — смысл задаёт скрипт-аналитика).
c (CSharedCreatureData) — связанный с записью игрок.
nParam1 (int) — первое число записи (аналитическое значение по смыслу тега).
nParam2 (int) — второе число записи (аналитическое значение по смыслу тега).

Пример

AddLogByNpc(122, talker, 1, 0);

AddLogByNpc2NPC🟢 высокая

детальная аналитическая запись от лица NPC

Детальная версия журналирования от лица NPC для подробной телеметрии его действий
(награды, продажи, события). Принимает nLogId (тип/тег записи), связанного игрока c,
два строковых поля s1 и s2 и до шести больших числовых полей nP1..nP6 (int64).
Принадлежит NPC.

Сигнатура

AddLogByNpc2( int nLogId, CSharedCreatureData pCreatureShared, string sStr1, string sStr2, int64 nParam1, int64 nParam2, int64 nParam3, int64 nParam4, int64 nParam5, int64 nParam6 )

Параметры

nLogId (int) — тип/тег записи журнала
pCreatureShared (CSharedCreatureData) — связанный с записью игрок
sStr1 (string) — первое строковое поле записи
sStr2 (string) — второе строковое поле записи
nParam1 (int64) — первое большое числовое поле записи
nParam2 (int64) — второе большое числовое поле записи
nParam3 (int64) — третье большое числовое поле записи
nParam4 (int64) — четвёртое большое числовое поле записи
nParam5 (int64) — пятое большое числовое поле записи
nParam6 (int64) — шестое большое числовое поле записи

Пример

AddLogByNpc2(127, target, "ADDLOG", "RANGE_OVER", 0, 0, 0, 0, 0, 0);

Пример использования

if ( babble_mode > 0 ) {
    AddLogByNpc2( 127, myself.sm, "antaras_test", "MY_DYING: dead and combat terminated", 0, 0, 0, 0, 0, 1 );
}

GetNPCLogByIDNPC🟢 высокая

чтение счётчика убийств/сбора по квесту

Читает текущее значение встроенного счётчика «убито/собрано X» для квеста — отдельной
от memo-state таблицы на персонаже (до 40 слотов). Ключ записи — тройка из nQuestId
(квест [quest_pch]), nQuestState (стадия квеста) и nNpcId (класс NPC, чьи убийства
считаются); первым аргументом передаётся игрок pTalker. Возвращает накопленное
значение счётчика. Принадлежит NPC.

Сигнатура

GetNPCLogByID( CSharedCreatureData pTalker, int nQuestId, int nQuestState, int nNpcId )

Параметры

pTalker (CSharedCreatureData) — 2.
nQuestId (int) — 2.
    значения — из словаря [quest_pch]
nQuestState (int) — стадия квеста — часть ключа счётчика
nNpcId (int) — 4 (Increase).

Пример

if (GetNPCLogByID(last_attacker, @one_stroke_one_kill, 0, i3) < 10)

Пример использования

if (_from_choice == 0 || (HaveMemo(talker, @one_stroke_one_kill) == @TRUE && GetMemoState(talker, @one_stroke_one_kill) == 1 && GetNPCLogByID(talker, @one_stroke_one_kill, 0, 1018879) < 1 && GetNPCLogByID(talker, @one_stroke_one_kill, 0, 1018886) < 1 && GetNPCLogByID(talker, @one_stroke_one_kill, 0, 1018893) < 1 && GetNPCLogByID(talker, @one_stroke_one_kill, 0, 1018900) < 1)) {
    SetCurrentQuestID(@one_stroke_one_kill);
    ShowPage(talker, "keleia_q0458_13.htm");
}

IncreaseNPCLogByIDNPC🟢 высокая

увеличение счётчика убийств/сбора по квесту

Увеличивает встроенный счётчик «убито/собрано X» на 1, но не выше потолка nMaxValue
(удобно для задач «убей N мобов»: дойдя до потолка, счётчик больше не растёт). Ключ
записи — тройка из nQuestId (квест [quest_pch]), nQuestState (стадия квеста) и nNpcId
(класс NPC), первым аргументом передаётся игрок pTarget, пятым — nMaxValue (потолок).
Принадлежит NPC.

Сигнатура

IncreaseNPCLogByID( CSharedCreatureData pTarget, int nQuestId, int nQuestState, int nNpcId, int nMaxValue )

Параметры

pTarget (CSharedCreatureData) — игрок, на персонаже которого хранится счётчик
nQuestId (int) — квест — часть ключа счётчика; выбор квеста из словаря [quest_pch]
    значения — из словаря [quest_pch]
nQuestState (int) — стадия квеста — часть ключа счётчика
nNpcId (int) — класс NPC, чьи убийства/сбор считаются — часть ключа счётчика
nMaxValue (int) — потолок счётчика, выше которого он не растёт

Пример

IncreaseNPCLogByID( target, 453, 0, @kiriona, 20 );
Ничего не найдено

Таймеры и скрипт-события

6 событий

TIMER_FIRED_EXNPCid 11🟢 высокая

сработал отложенный таймер

Срабатывает по истечении таймера, заведённого через AddTimerEx. Движок заполняет: timer_id — id сработавшего таймера.

Инициируется: AddTimerEx (см. NASC_FUNCTIONS).

Пример использования

EventHandler TIMER_FIRED_EX(timer_id)
{
    if (timer_id == 1001) {
    }
    super;
}

SCRIPT_EVENTNPCid 51🟢 высокая

пришёл скриптовый сигнал

Срабатывает при получении скрипт-сигнала (разосланного через Broadcast/SendScriptEvent). Движок заполняет: sev_arg1 — аргумент сигнала 1; sev_arg2 — аргумент сигнала 2; sev_arg3 — аргумент сигнала 3.

Инициируется: SendScriptEvent/BroadcastScriptEvent (см. NASC_FUNCTIONS).

Пример использования

EventHandler SCRIPT_EVENT( script_event_arg1, script_event_arg2, script_event_arg3, i0 )
{
    if ( script_event_arg1 == 10022) {
        i0 = GetIndexFromCreature( myself.c_ai0 );
        if ( i0 == script_event_arg2 ) {
            if ( myself.i_ai1 < script_event_arg3 ) {
                Despawn( );
            }
        }
    }
}

ON_SCRIPT_EVENTMAKERid 3🟢 высокая

скриптовый сигнал в спавнере

Судя по имени и аргументам, обрабатывает скрипт-сигнал на стороне спавнера. Движок заполняет: sev_arg1 — аргумент сигнала 1; sev_arg2 — аргумент сигнала 2; sev_arg3 — аргумент сигнала 3.

Инициируется: SendMakerScriptEvent/def.SendScriptEvent (см. NASC_FUNCTIONS).

Пример использования

EventHandler ON_SCRIPT_EVENT(script_event_arg1, script_event_arg2, script_event_arg3, i0, def0)
{
    super;
    if (script_event_arg1 == 21150002) {
        def0.SendScriptEvent(21150002, script_event_arg2, script_event_arg3);
    }
}

ON_TIMERMAKERid 5🟢 высокая

таймер спавнера

Срабатывает по таймеру спавнера. Движок заполняет: timer_id — id сработавшего таймера.

Инициируется: AddTimerEx (мейкер) (см. NASC_FUNCTIONS).

Пример использования

EventHandler ON_TIMER( timer_id )
{
    if (timer_id == 3384) {
        SendMakerScriptEvent(myself, 1000, 0, 0);
    }
    super;
}

TIMER_FIREDNPCid 10🟢 высокая

сработал простой таймер

Срабатывает при срабатывании простого таймера (устаревший механизм). Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Инициируется: AddTimer (см. NASC_FUNCTIONS).

Пример использования

EventHandler TIMER_FIRED( i6 )
{
    i6 = Rand( 90 );
    if ( i6 > 60 ) {
        InstantTeleport( myself.sm, 178849, -184342, -342 );
    } else {
        if ( i6 > 30 ) {
            InstantTeleport( myself.sm, 154132, -220070, -3404 );
        } else {
            InstantTeleport( myself.sm, 151572, -174829, -1781 );
        }
    }
}

DOMINION_SCRIPT_EVENTNPCid 161🟢 высокая

скрипт-сигнал режима Dominion

Приходит как скрипт-сигнал внутри подсистемы Dominion. Движок заполняет: talker — игрок; sev_arg1 — аргумент сигнала 1; sev_arg2 — аргумент сигнала 2; sev_arg3 — аргумент сигнала 3.

Пример использования

EventHandler DOMINION_SCRIPT_EVENT(talker, script_event_arg1, script_event_arg2, script_event_arg3, i0, i1, i2, i3, i4, i5, c0, c1, c2)
{
    c0 = GetCreatureFromIndex(script_event_arg1);
    i0 = GetDominionSiegeID(talker);
    i1 = script_event_arg3 % 100;
    i2 = script_event_arg3 / 100;
    i3 = GetCurrentTick();
    if (i0 == script_event_arg2)
    {
        if (GetDominionWarState(script_event_arg2) == 5)
        {
            if (i1 == 1)
            {
                if (i2 == 729)
                {
                    if (HaveNRMemo(talker, @defend_catapult_of_dom) == @FALSE && talker.level >= 40 && (IsInCategory(@third_class_group, talker.occupation) || IsInCategory(@fourth_class_group, talker.occupation)))
                    {
                        SetNRMemo(talker, @defend_catapult_of_dom);
                        SetNRMemoState(talker, @defend_catapult_of_dom, i0);
                        SetNRMemoStateEx(talker, @defend_catapult_of_dom, 1, i3);
    // ... (полное тело опущено)
}

Квесты

8 событий

QUEST_ACCEPTEDNPCid 30🟢 высокая

игрок принял квест

Срабатывает в момент принятия игроком квеста у NPC. Движок заполняет: talker — игрок; quest_id — квест [quest].

Пример использования

EventHandler QUEST_ACCEPTED(quest_id, talker)
{
    if (quest_id == 11111)
    {
        if (HaveMemo(talker, @eternal_weapon_quest) == @FALSE && talker.level >= 82)
        {
            SetCurrentQuestID(quest_id);
            SetMemo(talker, quest_id);
            SetMemoState(talker, quest_id, 1);
            AddLog(1, talker, quest_id);
            SoundEffect(talker, "ItemSound.quest_accept");
            ShowPage(talker, "eternal_quest_collector_legnar_002.htm");
            SetFlagJournal(talker, quest_id, 1);
            ShowQuestMark(talker, quest_id);
        }
        return;
    }
    super;
}

TELEPORT_REQUESTEDNPCid 27🟢 высокая

запрос на телепортацию

Судя по имени и аргументу, срабатывает, когда игрок запрашивает у NPC телепортацию. Движок заполняет: talker — игрок.

Пример использования

EventHandler TELEPORT_REQUESTED(talker)
{
    InstantTeleport(talker, PosX, PosY, PosZ);
}

LEARN_SKILL_REQUESTEDNPCid 32🟢 высокая

запрос на изучение умения

Судя по имени и аргументу, срабатывает, когда игрок запрашивает у NPC изучение умения. Движок заполняет: talker — игрок.

Пример использования

EventHandler LEARN_SKILL_REQUESTED(talker)
{
    ShowSkillList(talker, "");
}

ENCHANT_SKILL_REQUESTEDNPCid 33🟢 высокая

игрок запросил заточку умения

Срабатывает, когда игрок обращается к NPC с запросом на заточку (enchant) умения. Движок заполняет: talker — игрок; action_id — код действия.

Пример использования

EventHandler ENCHANT_SKILL_REQUESTED(talker, action_id)
{
    if (talker.transformID == 312 || talker.transformID == 313 || talker.transformID == 314 || talker.transformID == 315 || talker.transformID == 316 || talker.transformID == 317 || talker.transformID == 318) {
        ShowPage(talker, "skillenchant_notvang.htm");
    } else {
        ShowEnchantSkillList(talker, action_id);
    }
}

CLASS_CHANGE_REQUESTEDNPCid 37🟢 высокая

игрок запросил смену класса

Срабатывает, когда игрок обращается к NPC с запросом на смену класса/профессии. Движок заполняет: talker — игрок; occupation_name_id — id профессии.

Пример использования

EventHandler CLASS_CHANGE_REQUESTED( talker, occupation_name_id )
{
    ClassChange( talker, occupation_name_id );
    SoundEffect( talker, "ItemSound.quest_fanfare_2" );
    ShowPage( talker, fnAfterClassChange );
}

QUESTION_MARK_CLICKEDNPCid 53🟢 высокая

клик по знаку вопроса

Срабатывает, когда игрок нажимает на значок вопроса (подсказка туториала/интерфейса). Движок заполняет: talker — игрок; question_id — id вопрос-маркера.

Инициируется: ShowQuestionMark (см. NASC_FUNCTIONS).

Пример использования

EventHandler QUESTION_MARK_CLICKED( talker, question_id, i0 )
{
    i0 = ( GetMemoState( talker, @tutorial_quest ) & 2147483392 );
    select ( question_id ) {
        case 1 : {
            myself.VoiceEffect( talker, "tutorial_voice_007", 3500 );
            myself.SetMemoStateEx( talker, @tutorial_quest, 1, -5 );
            if ( talker.occupation == @fighter ) {
                myself.ShowTutorialHTML( talker, "tutorial_human_fighter007.htm" );
                myself.ShowRadar( talker, -71424, 258336, -3109, 2 );
            } else
            if ( talker.occupation == @mage ) {
                myself.ShowTutorialHTML( talker, "tutorial_human_fighter007.htm" );
                myself.ShowRadar( talker, -91036, 248044, -3568, 2 );
            } else
            if ( talker.occupation == @elven_fighter || talker.occupation == @elven_mage ) {
                myself.ShowTutorialHTML( talker, "tutorial_human_fighter007.htm" );
                myself.ShowRadar( talker, 46112, 41200, -3504, 2 );
            } else
            if ( talker.occupation == @dark_fighter || talker.occupation == @dark_mage ) {
    // ... (полное тело опущено)
}

ON_DYNAMIC_QUEST_EVENTMAKERid нет🟡 средняя

событие динамического квеста

Событие подсистемы динамических квестов (Dynamic/Crusade Quest; серверные пакеты 0x9302+), приходит в контексте спавнера. reply — код события/фаза; success — признак успеха; def0 — спавн-дефайн (CNpcSpawnDefineEx); maker0 — спавнер; i0, i1 — сопутствующие значения. Отдельной фабрики в разобранных сборках нет — поля по реальному использованию.

Пример использования

EventHandler ON_DYNAMIC_QUEST_EVENT(reply, success, def0, i0, i1, maker0)
{
    if (reply == 1)
    {
        myself.i_ai0 = 0;
        for (i0 = 0; i0 < myself.def_count; ++i0)
        {
            def0 = GetSpawnDefine(i0);
            if (IsNull(def0) == @FALSE)
            {
                if (myself.maximum_npc >= (myself.npc_count + def0.total))
                {
                    if (AtomicIncreaseTotal(def0, def0.total, 1))
                    {
                        def0.Spawn2(def0.total, 0, 0);
                    }
                }
            }
        }
        AddTimerEx(DoRespawn_Timer, 1000);
    // ... (полное тело опущено)
}

ON_DYNAMIC_QUEST_INFOMAKERid нет🟡 средняя

информация о динамическом квесте

Информационное событие подсистемы динамических квестов (Dynamic/Crusade Quest). quest_id — идентификатор квеста; event_id — идентификатор события/этапа; def0 — спавн-дефайн; i0 — сопутствующее значение. Отдельной фабрики в разобранных сборках нет — поля по реальному использованию.

Пример использования

EventHandler ON_DYNAMIC_QUEST_INFO(quest_id, event_id, i0, def0)
{
    myself.i_ai2 = event_id;
    myself.i_ai1 = quest_id;
}

Осады, форты, доминион, ТБ

29 событий

TB_REGISTER_PLEDGE_RETURNEDNPCid 79🟢 высокая

ответ на регистрацию клана (Territory Battle)

Срабатывает по приходу ответа сервера на регистрацию клана в территориальной битве. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply (L2Server: синхронно NpcRegisterTeamBattle + async ReplyNewTeamBattleAgitPledge): -1 — регистрация не удалась (клан уже участник в синхронной ветке, либо ошибка БД-контекста); 0,1,2,3,4 — УСПЕХ, номер назначенной команды/слота (у агита 5 слотов — тот же диапазон, что у TB_GET_PLEDGE_REGISTER_STATUS; скрипт по нему показывает messenger_4a..4e). При 5+ зарегистрированных кланах — sys.msg 1007.

Инициируется: TB_RegisterPledge (см. NASC_FUNCTIONS).

Пример использования

EventHandler TB_REGISTER_PLEDGE_RETURNED( talker, reply )
{
    if ( reply < 0 ) { ShowPage( talker, "farm_kel_mahum_messenger_3.htm" ); } else
    if ( reply == 0 ) { ShowPage( talker, "farm_kel_mahum_messenger_4a.htm" ); } else
    if ( reply == 1 ) { ShowPage( talker, "farm_kel_mahum_messenger_4b.htm" ); } else
    if ( reply == 2 ) { ShowPage( talker, "farm_kel_mahum_messenger_4c.htm" ); } else
    if ( reply == 3 ) { ShowPage( talker, "farm_kel_mahum_messenger_4d.htm" ); } else
    if ( reply == 4 ) { ShowPage( talker, "farm_kel_mahum_messenger_4e.htm" ); }
}

TB_GET_PLEDGE_REGISTER_STATUS_INFORMEDNPCid 83🟢 высокая

получен статус регистрации клана (Territory Battle)

Срабатывает по приходу сведений о статусе регистрации клана в территориальной битве. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply (L2Server NpcQueryTeamBattlePledge): 0..4 — клан зарегистрирован (номер слота команды); -1 — не найден, но есть свободные слоты; -2 — не найден, все слоты заняты; -3 — у клана нет такого суб-пледжа. Ранние отказы: клан ждёт роспуска (sys.msg 1114), нельзя (2240).

Инициируется: TB_GetPledgeRegisterStatus (см. NASC_FUNCTIONS).

Пример использования

EventHandler TB_GET_PLEDGE_REGISTER_STATUS_INFORMED( talker, reply )
{
    if ( reply == -2 ) {
        ShowPage( talker, "agit_oel_mahum_messeger_21.htm" );
    } else
    if ( reply == -1 ) {
        if ( IsMyLord( talker ) ) {
            ShowPage( talker, "agit_oel_mahum_messeger_22.htm" );
        } else {
            TB_RegisterPledge( talker );
        }
    } else
    if ( reply == 0 ) {
        ShowPage( talker, "agit_oel_mahum_messeger_4a.htm" );
    } else
    if ( reply == 1 ) {
        ShowPage( talker, "agit_oel_mahum_messeger_4b.htm" );
    } else
    if ( reply == 2 ) {
        ShowPage( talker, "agit_oel_mahum_messeger_4c.htm" );
    // ... (полное тело опущено)
}

TB_REGISTER_MEMBER_RETURNEDNPCid 80🟢 высокая

ответ на регистрацию участника (Territory Battle)

Срабатывает по приходу ответа сервера на регистрацию участника в территориальной битве. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply (L2Server NpcRegisterTeamBattle, sub 63, member): 0 — успех (или клан не найден); 1 — участник уже зарегистрирован под другой командой; 2 — достигнут лимит участников (18).

Инициируется: TB_RegisterMember (см. NASC_FUNCTIONS).

Пример использования

EventHandler TB_REGISTER_MEMBER_RETURNED( talker, reply )
{
    if ( reply == 0 ) { ShowPage( talker, "farm_kel_mahum_messenger_7.htm" ); } else
    if ( reply == 1 ) { ShowPage( talker, "farm_kel_mahum_messenger_8.htm" ); } else
    if ( reply == 2 ) { ShowPage( talker, "farm_kel_mahum_messenger_9.htm" ); }
}

TB_SET_NPC_TYPE_RETURNEDNPCid 82🟢 высокая

ответ на установку типа NPC (Territory Battle)

Срабатывает по приходу ответа сервера на установку типа NPC в контексте территориальной битвы. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply (L2Server NpcQueryTeamBattleNpc, SET): -1 — некорректные аргументы (нет клана или type<0); 0..5 — тип установлен (эхо назначенного).

Инициируется: TB_SetNpcType (см. NASC_FUNCTIONS).

Пример использования

EventHandler TB_SET_NPC_TYPE_RETURNED( talker, reply )
{
    if ( reply == -1 ) { ShowPage( talker, "farm_kel_mahum_messenger_7.htm" ); } else
    if ( reply >= 1 && reply <= 5 ) { ShowPage( talker, "farm_kel_mahum_messenger_9.htm" ); }
}

TB_GET_NPC_TYPE_INFORMEDNPCid 81🟢 высокая

получен тип NPC (Territory Battle)

Срабатывает по приходу сведений о типе NPC в контексте территориальной битвы. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply (L2Server NpcQueryTeamBattleNpc, GET): -1 — тип не назначен / клана нет; 0..5 — назначенный тип NPC.

Инициируется: TB_GetNpcType (см. NASC_FUNCTIONS).

Пример использования

EventHandler TB_GET_NPC_TYPE_INFORMED( talker, reply )
{
    if ( reply == -1 ) {
        ShowPage( talker, "agit_oel_mahum_messeger_7.htm" );
    } else
    if ( reply == 0 ) {
        if ( talker.is_pledge_master == 1 ) {
            ShowPage( talker, "agit_oel_mahum_messeger_6.htm" );
        } else {
            ShowPage( talker, "agit_oel_mahum_messeger_10.htm" );
        }
    } else
    if ( reply == 1 ) {
        ShowPage( talker, "agit_oel_mahum_messeger_16.htm" );
    } else
    if ( reply == 2 ) {
        ShowPage( talker, "agit_oel_mahum_messeger_17.htm" );
    } else
    if ( reply == 3 ) {
        ShowPage( talker, "agit_oel_mahum_messeger_18.htm" );
    // ... (полное тело опущено)
}

SET_AGIT_DECO_RETURNEDNPCid 90🟢 высокая

ответ на установку декора резиденции

Срабатывает по приходу ответа сервера на установку декора (украшения) резиденции. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply (L2Server CSetResidenceDeco server-job): 1 — декор клан-холла установлен, 0 — нет.

Пример использования

EventHandler SET_AGIT_DECO_RETURNED(talker, reply)
{
    if (reply) {
        if (OwnItemCount(talker, 57) >= GetCookie(talker, "AgitDecoFee")) {
            DeleteItem1(talker, 57, GetCookie(talker, "AgitDecoFee"));
            ShowPage(talker, fnAfterSetDeco);
        } else {
            ShowPage(talker, fnNotEnoughAdena);
        }
    } else {
        ShowPage(talker, fnFailtoSetDeco);
    }
}

RESET_AGIT_DECO_RETURNEDNPCid 91🟢 высокая

ответ на сброс декора резиденции

Срабатывает по приходу ответа сервера на сброс декора резиденции к исходному состоянию. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply (L2Server CResetResidenceDeco server-job): 1 — декор сброшен, 0 — нет.

Пример использования

EventHandler RESET_AGIT_DECO_RETURNED(talker, reply)
{
    if (reply) {
        ShowPage(talker, fnAfterResetDeco);
    } else {
        ShowPage(talker, fnFailtoResetDeco);
    }
}

TB_GET_BATTLE_ROYAL_PLEDGE_LIST_INFORMEDNPCid 84🟢 высокая

получен список кланов королевской битвы (Territory Battle)

Срабатывает по приходу списка кланов-участников королевской битвы. Движок заполняет: talker — игрок; i0..i11 — таблица кланов (см. ниже).

Значения i0..i11 (L2Server NpcGetBattleRoyalPledgeList, опкод 75): пары (pledge-id,
статус регистрации) для 5 атакующих кланов и клана-владельца:
i0 = pledge-id атак. клана 1; i1 = его статус регистрации
i2 = pledge-id атак. клана 2; i3 = его статус
i4 = pledge-id атак. клана 3; i5 = его статус
i6 = pledge-id атак. клана 4; i7 = его статус
i8 = pledge-id атак. клана 5; i9 = его статус
i10 = pledge-id клана-владельца; i11 = его статус
Пустой слот атакующего клана приходит как -1. Статус — регистрационный признак клана
в этой битве (по внутренней таблице резиденции).

Инициируется: TB_GetBattleRoyalPledgeList (см. NASC_FUNCTIONS).

Пример использования

EventHandler TB_GET_BATTLE_ROYAL_PLEDGE_LIST_INFORMED(talker, fhtml0, i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, pledge0)
{
    FHTML_SetFileName(fhtml0, fnBRList);
    if (i0 >= 0) {
        pledge0 = GetPledgeByIndex(i0);
        if (IsNull(pledge0) == 0) {
            FHTML_SetStr(fhtml0, "pledge0", pledge0.name);
            FHTML_SetStr(fhtml0, "p_member_count0", IntToStr(i1));
        }
    } else {
        FHTML_SetStr(fhtml0, "pledge0", MakeFString(1000495, "", "", "", "", ""));
    }
    if (i2 >= 0) {
        pledge0 = GetPledgeByIndex(i2);
        if (IsNull(pledge0) == 0) {
            FHTML_SetStr(fhtml0, "pledge1", pledge0.name);
            FHTML_SetStr(fhtml0, "p_member_count1", IntToStr(i3));
        }
    } else {
        FHTML_SetStr(fhtml0, "pledge1", MakeFString(1000495, "", "", "", "", ""));
    // ... (полное тело опущено)
}

ON_END_SIEGE_EVENTMAKERid 10🟢 высокая

завершение осады

Срабатывает при завершении осады связанной резиденции. Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример использования

EventHandler ON_END_SIEGE_EVENT( def0, maker0, i0 )
{
    for ( i0 = 1; i0 < myself.def_count; ++i0 ) {
        def0 = GetSpawnDefine( i0 );
        if ( AtomicIncreaseTotal( def0, def0.total, 1 ) ) {
            def0.Spawn2( def0.total, 0, 0 );
        }
    }
}

FORTRESS_UPGRADE_FACILITY_RETURNEDNPCid 127🟢 высокая

ответ на улучшение постройки крепости

Срабатывает по приходу ответа сервера на улучшение сооружения крепости. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply (L2Server CDx*FortressFacility): 1 — установка уровня строения (set); 0 — сброс (reset). Само применение уровня — асинхронно.

Пример использования

EventHandler FORTRESS_UPGRADE_FACILITY_RETURNED(talker, reply, i0, i1)
{
    if (reply == 1) {
        ShowPage(talker, fnUpgradeSuccess);
    } else {
        if (reply == 0) {
            ShowPage(talker, fnUpgradeFail);
        }
    }
}

ON_FORTRESS_EVENTMAKERid 16🟢 высокая

событие крепости

Срабатывает при наступлении события, связанного с крепостью. Движок заполняет: residence_id — id резиденции; event_id — привязанный id события (тот, что задали в RegisterFortressEventEx); s0 — строка.

Инициируется: привязкой события к форту через RegisterFortressEventEx(fortress_id, event_id, is_spawn) — при достижении состояния мейкер получает это событие (см. NASC_FUNCTIONS).

Пример использования

EventHandler ON_FORTRESS_EVENT(residence_id, event_id, reply, i0, i1, s0, def0, maker0)
{
    AddScriptLog(3, "[" + myself.name + "[fortress_event][res_id][" + IntToStr(residence_id) + "]" + IntToStr(event_id) + "]" + IntToStr(reply) + "]");
    myself.enabled = reply;
    if (event_id <= 2) {
        myself.i_ai0 = Fortress_GetOwnerPledgeId(fortress_id);
    }
    i0 = Fortress_GetOwnerPledgeId(fortress_id);
    if (i0 > 0) {
        if (is_npc_own == 1 && i0 == myself.i_ai0) {
            return;
        }
    } else {
        if (is_npc_own == -1 && i0 == myself.i_ai0) {
            return;
        }
    }
    if (facility_level > -1 && facility_type > -1) {
        i0 = Fortress_GetFacilityLevel(fortress_id, facility_type);
        if (i0 < facility_level) {
    // ... (полное тело опущено)
}

TB_CHECK_MEMBER_REGISTER_STATUSNPCid 111🟢 высокая

статус регистрации участника командного боя

Срабатывает при проверке статуса регистрации участника в подсистеме командных сражений (TB). Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply (L2Server NpcTBAgitCheckMemberRegisterStatus): числового кода нет — reply=1 фиксирует «проверка выполнена»; результат defender/offender шлётся игроку отдельно.

Пример использования

EventHandler TB_CHECK_MEMBER_REGISTER_STATUS( reply, talker, pledge0 )
{
    if (reply == 1) {
        myself.i_ai1 = myself.i_ai1 + 1;
        if (myself.i_ai1 == 1) {
            if (Rand(100) < 50) {
                InstantTeleport(talker, Pos_x1, Pos_y1, Pos_z1);
            } else {
                InstantTeleport(talker, Pos_x2, Pos_y2, Pos_z2);
            }
        }
        AddTimerEx( 1001, (60 * 1000) );
    } else {
        ShowPage(talker, "agit_mass_teleporter002.htm");
    }
}

CONTROLTOWER_LEVEL_INFORMEDNPCid 78🟢 высокая

уведомление об уровне контрольной башни

Срабатывает при получении сведений об уровне контрольной башни (осадного объекта). Движок заполняет: talker — игрок; level — уровень.

Инициируется: GetControlTowerLevel (см. NASC_FUNCTIONS).

Пример использования

EventHandler CONTROLTOWER_LEVEL_INFORMED(talker, level, i0, i1, i2, fhtml0)
{
    if (Castle_IsUnderSiege() || GetDominionWarState(dominion_id) == 5)
    {
        ShowPage(talker, fnSiegeStoppedFunction);
    }
    else if (IsMyLord(talker) == @TRUE || ((HavePledgePower(talker, 23) && Castle_GetPledgeId() == talker.pledge_id && talker.pledge_id != 0)))
    {
        i0 = GetCookie(talker, "dmgzone_price");
        i1 = GetCookie(talker, "dmgzone_level");
        i2 = GetCookie(talker, "dmgzone_num");
        if (level >= (2 * i1))
        {
            FHTML_SetFileName(fhtml0, fnCurrentDmgzoneLevelHigher);
            FHTML_SetInt(fhtml0, "dmglevel", (level / 2));
            ShowFHTML(talker, fhtml0);
        }
        else if (OwnItemCount(talker, @adena) >= i0)
        {
            DeleteItem1(talker, @adena, i0);
    // ... (полное тело опущено)
}

ON_START_SIEGE_EVENTMAKERid 9🟢 высокая

старт осады

Срабатывает при начале осадного события. Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример использования

EventHandler ON_START_SIEGE_EVENT( def0, i0 )
{
    for ( i0 = 1; i0 < ( myself.def_count - 1 ); ++i0 ) {
        def0 = GetSpawnDefine( i0 );
        if ( AtomicIncreaseTotal( def0, def0.total, 1 ) ) {
            def0.Spawn2( def0.total, 0, 0 );
        }
    }
    Castle_GateOpenClose2( DoorName1, 1 );
    Castle_GateOpenClose2( DoorName2, 1 );
    Castle_GateOpenClose2( DoorName3, 1 );
    Castle_GateOpenClose2( DoorName4, 1 );
    Castle_GateOpenClose2( DoorName5, 1 );
}

ON_START_TEAMBATTLEAGIT_FINAL_EVENTMAKERid 14🟢 высокая

старт финала командной битвы за резиденцию

Срабатывает при старте финального этапа командного сражения за резиденцию (teambattle agit). Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример использования

EventHandler ON_START_TEAMBATTLEAGIT_FINAL_EVENT( def0, i0 )
{
    for ( i0 = 1; i0 < myself.def_count; ++i0 ) {
        def0 = GetSpawnDefine( i0 );
        if ( AtomicIncreaseTotal( def0, def0.total, 1 ) ) {
            def0.Spawn2( def0.total, 0, 0 );
        }
    }
    Castle_GateOpenClose2( DoorName1, 1 );
    Castle_GateOpenClose2( DoorName2, 1 );
    Castle_GateOpenClose2( DoorName3, 1 );
    Castle_GateOpenClose2( DoorName4, 1 );
    Castle_GateOpenClose2( DoorName5, 1 );
}

FORTRESS_CONTRACT_CASTLE_RETURNEDNPCid 126🟢 высокая

результат заключения контракта крепости с замком

Срабатывает как ответ на запрос привязки крепости к замку по контракту. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply (L2Server CFortress::ContractWithCastle): -1 — контракт с замком заключён (успех); 0 — отказ (замок не связан с крепостью / уже есть контракт / уже есть замок-владелец).

Инициируется: Fortress_ContractCastle (см. NASC_FUNCTIONS).

Пример использования

EventHandler FORTRESS_CONTRACT_CASTLE_RETURNED( talker, reply )
{
    if (reply == -1) {
        ShowPage(talker, fnContractSuccess);
        AddTimerEx( 7792, (3 * 1000) );
    } else
    if (reply == 0) {
        ShowPage(talker, fnContractFail);
    } else
    if (reply == 1) {
        ShowPage(talker, fnHi1);
        AddTimerEx( 7792, (3 * 1000) );
    } else
    if (reply == 2) {
        ShowPage(talker, fnIndepFail);
    } else
    if (reply == 3) {
        ShowPage(talker, fnIndepAlready);
    }
}

FORTRESS_SIEGE_REGISTER_RETURNEDNPCid 124🟢 высокая

результат регистрации на осаду крепости

Срабатывает как ответ на запрос регистрации на осаду крепости. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply (L2Server CFortress::RegisterSiege): -1 — регистрация на осаду успешна (sys.msg 2169); 3 — крепость не принимает регистрацию (не то состояние); 4 — клан уже зарегистрирован; 0 — нельзя регистрировать.

Пример использования

EventHandler FORTRESS_SIEGE_REGISTER_RETURNED(talker, reply, i0)
{
    if (reply == -1) {
        i0 = GetCookie(talker, "commission");
        if (i0 == commission) {
            if (OwnItemCount( talker, @adena ) >= i0) {
                DeleteItem1( talker, @adena , i0);
            } else {
                ShowPage(talker, fnHi3);
                return;
            }
        }
        ShowPage(talker, fnRegisterSuccess);
    } else {
        if (reply == 3) {
            ShowPage(talker, fnNoRegisterPeriod);
        } else {
            if (reply == 4) {
                ShowPage(talker, fnAlreadyRegistered);
            } else {
    // ... (полное тело опущено)
}

FORTRESS_SIEGE_UNREGISTER_RETURNEDNPCid 125🟢 высокая

результат отмены регистрации на осаду крепости

Срабатывает как ответ на запрос снятия регистрации на осаду крепости. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply (L2Server CFortress::UnregisterSiege): -1 — снятие успешно; 3 — не то состояние крепости; 4 — клан не зарегистрирован.

Пример использования

EventHandler FORTRESS_SIEGE_UNREGISTER_RETURNED(talker, reply)
{
    if (reply == -1) {
        ShowPage(talker, fnCancelSuccess);
    } else {
        if (reply == 3) {
            ShowPage(talker, fnNoRegisterPeriod);
        } else {
            if (reply == 4) {
                ShowPage(talker, fnNotARegistered);
            } else {
                ShowPage(talker, fnCancelFail);
            }
        }
    }
    super;
}

DOMINION_SIEGE_STARTNPCid 153🟢 высокая

старт осады в режиме Dominion

Срабатывает при начале осады территории в режиме Dominion. Движок заполняет: talker — игрок; i0 — регион Доминиона.

Пример использования

EventHandler DOMINION_SIEGE_START(talker, i0, i1)
{
    // Big War Castles
    RegisterDBSavingMap(@gm_supply_carriage, 111111111);
    RegisterDBSavingMap(@gm_supply_box, 111111111);
    RegisterDBSavingMap(@gm_guard_proxy, 111111111);
    RegisterDBSavingMap(@gm_priest_proxy, 111111111);
    RegisterDBSavingMap(@gm_trader_proxy, 111111111);
    // Mid War Castles
    RegisterDBSavingMap(@gm_supply_carriage_midwar, 1111111);
    RegisterDBSavingMap(@gm_supply_box_midwar, 1111111);
    RegisterDBSavingMap(@gm_guard_proxy_midwar, 1111111);
    RegisterDBSavingMap(@gm_priest_proxy_midwar, 1111111);
    RegisterDBSavingMap(@gm_trader_proxy_midwar, 1111111);

    if (HaveNRMemo(talker, @dominion_war_state) == @FALSE)
    {
        SetNRMemo(talker, @dominion_war_state);
        AddLog(1, talker, @dominion_war_state);
        SetNRMemoState(talker, @dominion_war_state, 0);
    // ... (полное тело опущено)
}

DOMINION_SIEGE_ENDNPCid 154🟢 высокая

завершение осады в режиме Dominion

Срабатывает при завершении осады территории в режиме Dominion. Движок заполняет: talker — игрок; i0 — регион Доминиона.

Пример использования

EventHandler DOMINION_SIEGE_END(talker, i0, i1, i2, i3, i4, i5, i6, i7)
{
    if (HaveNRMemo(talker, @dominion_war_state) == @FALSE)
    {
        SetNRMemo(talker, @dominion_war_state);
        AddLog(1, talker, @dominion_war_state);
    }

    i1 = 1;    // маска
    i2 = 0; i3 = 0; i4 = 0; i5 = 0;
    select (i0)
    {
        // Big War Castles
        case @gludio_dominion:     { i1 = 1;         i2 = @for_the_gludio;      i3 = @gm_supply_carriage;    break; }
        case @dion_dominion:       { i1 = 10;        i2 = @for_the_dion;        i3 = @gm_supply_carriage;    break; }
        case @giran_dominion:      { i1 = 100;       i2 = @for_the_giran;       i3 = @gm_supply_carriage;    break; }
        case @oren_dominion:       { i1 = 1000;      i2 = @for_the_oren;        i3 = @gm_supply_carriage;    break; }
        case @aden_dominion:       { i1 = 10000;     i2 = @for_the_aden;        i3 = @gm_supply_carriage;    break; }
        case @innadrile_dominion:  { i1 = 100000;    i2 = @for_the_innadrille;  i3 = @gm_supply_carriage;    break; }
        case @godad_dominion:      { i1 = 1000000;   i2 = @for_the_godard;      i3 = @gm_supply_carriage;    break; }
    // ... (полное тело опущено)
}

DOMINION_SUPPLY_DESTRUCTEDNPCid 168🟢 высокая

уничтожен снабжающий объект Dominion

Срабатывает при уничтожении объекта снабжения (supply) в режиме Dominion. Движок заполняет: attacker — разрушивший объект; i0 — регион Доминиона.

Пример использования

EventHandler DOMINION_SUPPLY_DESTRUCTED(attacker, i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, c0, c1)
{
    if (i0 == @gludio_dominion) {
        i1 = GetDBSavingMap(@gm_supply_carriage);
        if ((i1 % 10) >= 1) {
            i2 = i1 - 1;
            RegisterDBSavingMap(19, i2);
        }
    } else

    if (i0 == @dion_dominion) {
        i1 = GetDBSavingMap(@gm_supply_carriage);
        if ((i1 % 100) >= 10) {
            i2 = i1 - 10;
            RegisterDBSavingMap(19, i2);
        }
    } else

    if (i0 == @giran_dominion) {
        i1 = GetDBSavingMap(@gm_supply_carriage);
    // ... (полное тело опущено)
}

DOMINION_SIEGE_PC_KILLEDNPCid 155🟢 высокая

убийство игрока в осаде Dominion

Срабатывает при гибели игрока во время осады в режиме Dominion. Движок заполняет: talker — убитый; attacker — убийца; i0 — регион Доминиона.

Пример использования

EventHandler DOMINION_SIEGE_PC_KILLED(target, talker, attacker, i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, c0, c1, party0, always_list, code_info)
{
    if (IsNull(attacker) != @FALSE || IsNull(talker) != @FALSE)
        return;

    always_list = AllocCodeInfoList();
    party0 = GetParty(attacker);
    if (IsNullParty(party0) == @FALSE)
    {
        for (i9 = 0; i9 < party0.member_count; ++i9)
        {
            target = GetMemberOfParty(party0, i9);
            always_list.SetInfo(0, target);
        }
    }
    else
    {
        always_list.SetInfo(0, attacker);
    }

    // ... (полное тело опущено)
}

ON_DECLARE_DOMINION_EVENTMAKERid 21🟢 высокая

объявление события Dominion

Срабатывает при объявлении (старте) события Dominion. Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример использования

EventHandler ON_DECLARE_DOMINION_EVENT(i0, def0)
{
    for (i0 = 0; i0 < myself.def_count; ++i0)
    {
        def0 = GetSpawnDefine(i0);
        if (IsNull(def0) == @FALSE)
        {
            if (AtomicIncreaseTotal(def0, def0.total, 1))
            {
                def0.Spawn2(def0.total, 0, 0);
            }
        }
    }
}

AUCTION_AGIT_GET_COST_INFO_RETURNEDNPCid 92🟢 высокая

возврат данных о стоимости резиденции (аукцион)

Приходит как ответ с информацией о стоимости резиденции (clan hall / agit) на аукционе. Движок заполняет: talker — игрок; reply — код ответа/выбор; s0 — строка.

Значения reply: reply/s0 — НЕ код, а payload: несут СТОИМОСТЬ клан-холла (L2Server NpcAuctionAgitGetCostInfo); шлётся только для валидного агита с положительной стоимостью.

Пример использования

EventHandler AUCTION_AGIT_GET_COST_INFO_RETURNED( talker, reply, s0, fhtml0 )
{
    if (Castle_GetPledgeId() == talker.pledge_id && talker.pledge_id != 0) {
        FHTML_SetFileName(fhtml0, fnWarehouse);
        FHTML_SetInt( fhtml0, "agit_lease", reply );
        FHTML_SetStr(fhtml0, "pay_time", s0);
        ShowFHTML(talker, fhtml0);
    }
}

ON_PROCLAIM_SIEGE_EVENTMAKERid 11🟢 высокая

объявление осады

Срабатывает при объявлении осады. Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример использования

EventHandler ON_PROCLAIM_SIEGE_EVENT(def0)
{
    def0 = GetSpawnDefine(1);
    if (AtomicIncreaseTotal(def0, def0.total, 1))
    {
        def0.Spawn2(def0.total, 0, 0);
    }
}

ON_DESTRUCT_CTRL_TOWER_EVENTMAKERid 12🟢 высокая

разрушение контрольной башни

Срабатывает при разрушении контрольной башни (control tower) в ходе осады. Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример использования

EventHandler ON_DESTRUCT_CTRL_TOWER_EVENT(def0)
{
    def0 = GetSpawnDefine(1);
    if (GetDominionWarState(dominion_id) != 5)
    {
        if (def0.npc_count == 1)
        {
            def0.SendScriptEvent(10100, 1, 0);
            def0 = GetSpawnDefine(0);
            def0.SendScriptEvent(10101, 1, 0);
        }
        else
        {
            if (IsNull(def0) == 0 && def0.has_dbname)
            {
                def0.LoadDBNpcInfo(10);
            }
        }
    }
}

ON_CANCEL_SIEGE_EVENTMAKERid 13🟢 высокая

отмена осады

Срабатывает при отмене осады. Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример использования

EventHandler ON_CANCEL_SIEGE_EVENT(def0)
{
    def0 = GetSpawnDefine(1);
    def0.Despawn();
}

PLEDGE_CASTLE_SIEGE_DEFENCE_COUNT_DECREASE_RETURNEDNPCid 129🟢 высокая

возврат уменьшения числа защит замка

Приходит как ответ на запрос уменьшения счётчика защитных осад замка для клана. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply — числового кода в NPC нет (внутренний DB-callback подтверждения обороны замка); при отказе — sys.msg 640/641 (счётчик обороны не изменён).

Пример использования

EventHandler PLEDGE_CASTLE_SIEGE_DEFENCE_COUNT_DECREASE_RETURNED(talker, reply)
{
    if (reply == 0) {
        ShowPage(talker, fnDecreaseCountFailed);
        return;
    } else {
        if (reply == 1) {
            ShowPage(talker, fnGetMedalSuccess);
            return;
        }
    }
}

Кланы, подклассы, академия

22 событий

SUBJOB_CHANGEDNPCid 87🟢 высокая

смена сабкласса

Срабатывает при смене игроком сабкласса (дополнительной профессии). Движок заполняет: talker — игрок; reply — класс суб-джоба; level — уровень.

Значения reply: reply (async ReplyChangeSubJob): при УСПЕХЕ = новый ClassId саб-джоба (не код!); -1 — отказ (смена не удалась, imm default).

Инициируется: ChangeSubJob (см. NASC_FUNCTIONS).

Пример использования

EventHandler SUBJOB_CHANGED(talker,reply,level)
{
    if( reply == -1 ) {
        ShowPage( talker, "master_lv3_hef_18.htm" );
    } else {
        ShowPage( talker, "master_lv3_hew_05.htm" );
    }
}

SUBJOB_LIST_INFORMEDNPCid 85🟢 высокая

получен список сабклассов

Приходит как ответ сервера со сведениями о классах персонажа (основной + сабклассы). Движок заполняет: talker — игрок; ask — под-запрос; i0..i8 — таблица классов персонажа (см. ниже).

Значения i0..i8 — таблица классов персонажа (L2Server ReplyLoadSubJob, опкод 66). Движок
шлёт 4 слота, каждый парой (ClassId, уровень): слот 0 — основной класс, слоты 1..3 —
сабклассы. Порядок значений:
i0 = класс основного (slot 0); i1 = его уровень
i2 = класс саб-класса 1; i3 = его уровень
i4 = класс саб-класса 2; i5 = его уровень
i6 = класс саб-класса 3; i7 = его уровень
Незанятый слот приходит как -1 (движок инициализирует пустые слоты в -1). ClassId —
это id класса (ср. class_id/occupation существа). i8 — служебное поле (в пакете есть
маршрутные d-поля); точное соответствие i-индексов задаёт фабрика L2NPC, но состав и порядок
пар (класс, уровень) для 4 слотов доказаны дизасмом ReplyLoadSubJob.

Инициируется: GetSubJobList (см. NASC_FUNCTIONS).

Пример использования

EventHandler SUBJOB_LIST_INFORMED(talker,ask,i0,i1,i2,i3,i4,i5,i6,i7,i8,fhtml0)
{
    if ( talker.transformID > 0 ) {
        ShowPage(talker,"transform_forbidden.htm");
        return;
    }
    if ( talker.race == @race_kamael ) {
        ShowPage(talker,"kamael_forbidden.htm");
        return;
    }
    // отмена квестов на третью профессию
    if ((ask>=1) && (ask<=3) && (i8>0)) {
        if (((i8==1) && (i3>=40)) || ((i8==2) && (i5>=40)) || ((i8==3) && (i7>=40))) {
            myself.c_ai4 = talker;
            SendScriptEvent( myself.sm, 101, i8);
        }
    }

    if( ask == 1 ) {
        if( i8 == 0 ) {
    // ... (полное тело опущено)
}

SUBJOB_CREATEDNPCid 86🟢 высокая

создан сабкласс

Судя по имени и аргументам, срабатывает после создания игроку нового сабкласса. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply (по реальным скриптам): reply (L2Server ReplyCreateSubJob): пакет несёт только индексы маршрутизации, БЕЗ числа успех/отказ; успех сопровождается sys.msg 1269 игроку. NPC-скрипт числового кода результата не получает.

Инициируется: CreateSubJob (см. NASC_FUNCTIONS).

Пример использования

EventHandler SUBJOB_CREATED(talker,reply)
{
    if( reply == -1 ) {
        ShowPage( talker, "master_lv3_hef_17.htm" );
    } else {
        ShowPage( talker, "master_lv3_de_06.htm" );
    }
}

SUBJOB_RENEWEDNPCid 88🟢 высокая

сабкласс обновлён

Судя по имени и аргументам, срабатывает при обновлении/смене активного сабкласса. Движок заполняет: talker — игрок; reply — код ответа/выбор; i0 — целое (i0).

Значения reply: reply (L2Server ReplyRenewSubJob): при успехе = новый класс саб-класса (+ sys.msg 1269 «подкласс добавлен»); 0 — отказ (лог «renew subjob failed»).

Инициируется: RenewSubJob (см. NASC_FUNCTIONS).

Пример использования

EventHandler SUBJOB_RENEWED( talker, reply, i0 )
{
    if ( reply == -1 ) {
        ShowPage( talker, "master_lv3_hef_18.htm" );
    } else
    if ( i0 == @cardinal ) {
        DeleteItem1( talker, @potion_of_experience_bishop, OwnItemCount( talker, @potion_of_experience_bishop ) );
    } else
    if ( i0 == @evas_saint ) {
        DeleteItem1( talker, @potion_of_experience_elder, OwnItemCount( talker, @potion_of_experience_elder ) );
    } else
    if ( i0 == @shillien_saint ) {
        DeleteItem1( talker, @potion_of_experience_silien_elder, OwnItemCount( talker, @potion_of_experience_silien_elder ) );
    }

    ShowPage( talker, "master_lv3_hew_05.htm" );
}

PLEDGE_MASTER_TRANSFERNPCid 109🟢 высокая

передача лидерства в клане

Срабатывает при подтверждении передачи прав лидера клана. Движок заполняет: talker — игрок; reply — код ответа/выбор; s0 — строка.

Значения reply: reply: -2 — клан ждёт роспуска (синхронно). Остальные коды (-8,-4,-1,0,1) приходят из SQL-процедуры БД через byref (ReplyPledgeMasterTransfer ретранслирует nResult, в бинаре как imm не выделены). Прочие синхронные отказы — член во входе командного боя (2241), нет клана/не мастер (236).

Пример использования

EventHandler PLEDGE_MASTER_TRANSFER( talker, reply )
{
    if (reply == 1) { ShowPage(talker, "pl_transfer_success.htm"); } else
    if (reply == 0) { ShowPage(talker, "pl_err_sm2.htm"); } else
    if (reply == -1) { ShowPage(talker, "pl_err_master.htm"); } else
    if (reply == -2) { ShowPage(talker, "pl_transfer_already.htm"); } else
    if (reply == -4) { ShowPage(talker, "pl_err_agit_owner.htm"); } else
    if (reply == -8) { ShowPage(talker, "pl_already_transfer.htm"); } else
    if (reply <= -3) { ShowPage(talker, "pl_err_master_transfer.htm"); }
}

PLEDGE_MASTER_TRANSFER_CANCELNPCid 110🟢 высокая

отмена передачи лидерства в клане

Срабатывает при отмене процедуры передачи прав лидера клана. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply: коды (-4,-2,-1,1) — из SQL-процедуры БД через byref (ReplyPledgeMasterTransferCancel ретранслирует nResult). Синхронно — отказы (клан ждёт роспуска / нет клана-не мастер, 236).

Пример использования

EventHandler PLEDGE_MASTER_TRANSFER_CANCEL(talker, reply)
{
    if (reply == 1) { ShowPage(talker, "pl_cancel_success.htm"); } else
    if (reply == -1) { ShowPage(talker, "pl_err_master.htm"); } else
    if (reply == -2) { ShowPage(talker, "pl_transfer_already.htm"); } else
    if (reply == -4) { ShowPage(talker, "pl_not_transfer.htm"); } else
    if (reply <= -3) { ShowPage(talker, "pl_err_master_transfer.htm"); }
}

SET_SUBJOB_AS_MAINNPCid 188🟢 высокая

установка сабкласса основным

Срабатывает при установке дополнительной профессии (сабкласса) в качестве основной. Движок заполняет: talker — игрок; reply — код ответа/выбор; level — уровень.

Пример использования

EventHandler SET_SUBJOB_AS_MAIN( talker, reply, level, s0 )
{
    if ( reply > 0 ) {
        SetDbData( "SUB_USER", talker.name, "MAIN: " + talker.subjob0_class, "SUB1: " + talker.subjob1_class, "SUB2: " + talker.subjob2_class, "SUB3: " + talker.subjob3_class, "LV: " + talker.level, IntToStr( talker.dbid ), "reply: " + reply , "level: " + level );
    } else {
        SetDbData( "SUB_USER", talker.name, "Error on SET_SUBJOB_AS_MAIN", _blank, _blank, _blank, _blank, _blank, _blank, _blank );
    }
}

LEVEL_UP_PLEDGENPCid 47🟢 высокая

повышение уровня клана

Срабатывает при повышении уровня клана. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply (по реальным скриптам): reply (L2Server CPledge::PledgeLevelUpByNpc): при успехе передаётся ТЕКУЩИЙ уровень клана (скрипт по нему запускает апгрейд); -1 — отказ (клан ждёт роспуска, sys.msg 551; или нет клана/не мастер, 236).

Пример использования

EventHandler LEVEL_UP_PLEDGE( talker, reply )
{
    if ( reply == 0 ) {
        myself.PledgeLevelUp( talker, 1 );
    } else
    if ( reply == 1 ) {
        myself.PledgeLevelUp( talker, 2 );
    } else
    if ( reply == 2 ) {
        myself.PledgeLevelUp( talker, 3 );
    } else
    if ( reply == 3 ) {
        myself.PledgeLevelUp( talker, 4 );
    } else
    if ( reply == 4 ) {
        myself.PledgeLevelUp( talker, 5 );
    }
}

CHECK_CURSED_USER_RETURNEDNPCid 105🟢 высокая

ответ на проверку проклятого игрока

Срабатывает по приходу ответа на проверку игрока на проклятие (например, владение проклятым оружием). Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply (L2Server NpcCheckCursedUser): 0 — игрок НЕ несёт проклятое оружие (проверка пройдена), 1 — несёт (по счётчику CCursedWeaponMgr).

Инициируется: CheckCursedUser (см. NASC_FUNCTIONS).

Пример использования

EventHandler CHECK_CURSED_USER_RETURNED(talker, reply, fhtml0)
{
    if (reply == 0)
    {
        ShowPage(talker, "tournament_operator001.htm");
    }
    else
    {
        ShowPage(talker, "tournament_operator002.htm");    // Обладатель проклятого меча не может участвовать
    }
}

CHECK_SUBJOB_AS_MAINNPCid 195🟢 высокая

проверка сабкласса как основного

Срабатывает при проверке текущего активного класса персонажа на признак основного при работе с системой двойных профессий (сабклассов). Движок заполняет: talker — игрок; reply — код ответа/выбор; i0 — целое (i0).

Пример использования

EventHandler CHECK_SUBJOB_AS_MAIN( talker, reply, i0, i1 )
{
            if ( reply > 0 ) {
                AddScriptLog( 2, "BooksLog: "+talker.name+" SubJobAsMain" );

                // чистим книги
                if ( OwnItemCount( talker, @sb_subclass_beginner ) > 0 ) { DeleteItem1( talker, @sb_subclass_beginner, OwnItemCount( talker, @sb_subclass_beginner ) ); }
                if ( OwnItemCount( talker, @sb_subclass_expert ) > 0 ) { DeleteItem1( talker, @sb_subclass_expert, OwnItemCount( talker, @sb_subclass_expert ) ); }
    //            if ( OwnItemCount( talker, @sb_subclass_summoner ) > 0 ) { DeleteItem1( talker, @sb_subclass_summoner, OwnItemCount( talker, @sb_subclass_summoner ) ); }
                // чистим состояния взятия книг
                for ( i0 = flag_subjob_start; i0 <= flag_subjob_end; ++i0 ) {
                    SetOneTimeQuestFlag( talker, i0, @FALSE );
                }
                // мочим скиллы
                DeleteAcquireSkills( talker, @subjob_skill_acquire );
                myself.av_quest1.Exchange( reply );
                AddTimerEx( 234567, 1000 );
            } else {
                myself.av_quest0.Exchange(0);
                ShowPage( talker, "subjob_transfer04.htm" );
    // ... (полное тело опущено)
}

MG_UNREGISTER_PLEDGE_RETURNEDNPCid 99🟢 высокая

результат отмены регистрации клана

Срабатывает как возврат результата операции снятия регистрации клана в подсистеме MG. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Инициируется: MG_UnregisterPledge (см. NASC_FUNCTIONS).

Пример использования

EventHandler MG_UNREGISTER_PLEDGE_RETURNED( talker, reply, i0 )
{
    if (reply > 0) {
        ShowPage(talker, "messenger_yetti005.htm");
        GiveItem1( talker, @hs_agit_war_joining_certificate, (reply / 2) );
    }
    select ( reply ) {
        case -2: {
            ShowPage(talker, "messenger_yetti010.htm");
            break;
        }
        case -11: {
            ShowPage(talker, "messenger_yetti016.htm");
            break;
        }
        case -12: {
            ShowPage(talker, "messenger_yetti017.htm");
            break;
        }
    }
}

MG_REGISTER_PLEDGE_RETURNEDNPCid 98🟢 высокая

результат регистрации клана

Срабатывает как возврат результата операции регистрации клана в подсистеме MG. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Пример использования

EventHandler MG_REGISTER_PLEDGE_RETURNED( talker, reply, i0 )
{
    select ( reply ) {
        case 0 : {
            i0 = OwnItemCount( talker, @hs_agit_war_joining_certificate );
            myself.DeleteItem1( talker, @hs_agit_war_joining_certificate, i0 );
            myself.ShowPage( talker, "messenger_yetti009.htm" );
            break;
        }
        case -1 : { myself.ShowPage( talker, "messenger_yetti010.htm" ); break; }
        case -2 : { myself.ShowPage( talker, "messenger_yetti010.htm" ); break; }
        case -7 : { myself.ShowPage( talker, "messenger_yetti011.htm" ); break; }
        case -8 : { myself.ShowPage( talker, "messenger_yetti012.htm" ); break; }
        case -9 : { myself.ShowPage( talker, "messenger_yetti011.htm" ); break; }
        case -10 : { myself.ShowPage( talker, "messenger_yetti011.htm" ); break; }
        case -11 : { myself.ShowPage( talker, "messenger_yetti013.htm" ); break; }
        case -12 : { myself.ShowPage( talker, "messenger_yetti014.htm" ); break; }
        case -13 : { myself.ShowPage( talker, "messenger_yetti008.htm" ); break; }
    }
}

CREATE_PLEDGENPCid 44🟢 высокая

результат создания клана

Срабатывает как ответ на запрос создания клана. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply (по реальным скриптам): reply (L2Server ReplyCreatePledgeByNpc): 1 — клан создан, 0 — отказ (имя нельзя использовать, sys.msg 752).

Пример использования

EventHandler CREATE_PLEDGE(talker, reply)
{
    if (reply == 1) {
        ShowPage(talker, "pl006.htm");
    }
}

CREATE_ALLIANCENPCid 50🟢 высокая

результат создания альянса

Срабатывает как ответ на запрос создания альянса. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply (по реальным скриптам): reply (L2Server CAlliance::CreateAllianceByNpc): 1 — альянс создан; 0 — отказ. Причины отказа (sys.msg): не мастер клана (504), уровень клана < 5 (549), уже есть альянс (502), нельзя создавать (505), имя нельзя использовать (752/506), имя > 16 символов (507), клан ждёт роспуска/война (550/721).

Пример использования

EventHandler CREATE_ALLIANCE( talker, reply )
{
    if (reply == 1) {
        ShowPage(talker, "al006.htm");
    }
}

DISMISS_PLEDGENPCid 45🟢 высокая

результат роспуска клана

Срабатывает как ответ на запрос роспуска клана. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply: числовой reply в NPC НЕ шлётся вовсе — сервер выполняет роспуск по DB-флагу успеха (ReplyDeletePledge) + штрафы; NPC узнаёт косвенно (клана больше нет). Синхронно (CPledge::DismissPledgeByNpc) шлётся только ОТКАЗ (код 0) с причинами: не мастер (236), уже ждёт роспуска (263), штраф-таймаут (728), заявки (554), война (264), замок/крепость (266), осада (265).

Пример использования

EventHandler DISMISS_PLEDGE(talker, reply)
{
    if (reply == 1) {
        ShowPage(talker, "pl009.htm");
    }
}

CREATE_ACADEMYNPCid 103🟢 высокая

результат создания академии клана

Срабатывает как ответ на запрос создания академии (учебного подразделения клана). Движок заполняет: talker — игрок; s0 — строка; reply — код ответа/выбор.

Значения reply: reply: 1 — заявка принята (синхронно CPledge::CreateAcademyByNpc); 2 — академия СОЗДАНА (async ReplyCreateAcademy, imm); -2 — имя уже используется (sys.msg 1855); 0 — отказ (нет клана/прав/имя).

Пример использования

EventHandler CREATE_ACADEMY(talker, reply, i0, i1, i2, pledge0, s0, s1)
{
    pledge0 = GetPledge(talker);
    if (IsNull(pledge0) == @FALSE)
    {
        i0 = pledge0.skill_level;
        i1 = 0;
        i2 = 0;
        s1 = "";

        if (reply == 0) {
            ShowPage(talker, "pl_err_aca.htm");
        } else if (reply == 1) {
            if (talker.is_pledge_master == @TRUE || HavePledgePower(talker, @PP_MANAGE_GROWTH) == @TRUE && talker.pledge_id > 0 && i0 >= 5) {
                CreateAcademy(talker, s0);
            } else if (i0 < 5) {
                ShowPage(talker, "pl_err_plv.htm");
            } else if (talker.is_pledge_master != 1 || HavePledgePower(talker, @PP_MANAGE_MASTER) == 0) {
                ShowPage(talker, "pl_err_master.htm");
            } else {
    // ... (полное тело опущено)
}

CREATE_SUBPLEDGENPCid 104🟢 высокая

результат создания подразделения клана

Срабатывает как ответ на запрос создания клан-подразделения (subpledge). Движок заполняет: talker — игрок; reply — код ответа/выбор; i0 — целое (i0); i1 — целое (i1); s0 — строка.

Значения reply: reply: коды -2..2 — из SQL-процедуры БД через byref (ReplyCreateSubPledge ретранслирует поле результата). Синхронные причины отказа (лог-строки): нельзя создать академию/главный клан; нужен апгрейд навыка или уже создан; недопустимое/слишком длинное имя; имя занято (1855); нет кандидата в мастера; уже есть суб-мастер; нет прав/клана.

Пример использования

EventHandler CREATE_SUBPLEDGE(talker, reply, i0, i1, i2, pledge0, s0)
{
    if (reply == -1)
    {
        ShowPage(talker, "pl_err_man.htm");
    }
    else if (reply == 0)
    {
        ShowPage(talker, "pl_err_subname.htm");
    }
    else if (reply == 1)
    {
        if ((talker.is_pledge_master == @TRUE || HavePledgePower(talker, @PP_MANAGE_GROWTH) == @TRUE) && talker.pledge_id > 0)
        {
            if (i0 < 1000 && i0 >= 100) {
                if (HasSubPledge(talker, i0) == 1) {
                    ShowPage(talker, "pl_err_fame.htm");
                    return;
                }

    // ... (полное тело опущено)
}

UPDATE_SUBPLEDGE_MASTERNPCid 106🟢 высокая

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

Срабатывает как ответ на запрос назначения/смены руководителя клан-подразделения. Движок заполняет: talker — игрок; reply — код ответа/выбор; i0 — целое (i0).

Значения reply: reply (async ReplyUpdateSubPledgeMaster, imm): 1 — успех (глава суб-пледжа обновлён), 0 — провал; -1 — дефолт при отсутствии ответа (синхронный отказ NpcServer::Send без числа).

Пример использования

EventHandler UPDATE_SUBPLEDGE_MASTER(talker, reply, i0)
{
    if (reply == -1) {
        if (i0 < 1000) {
            ShowPage(talker, "pl_err_sm3.htm");
        } else {
            ShowPage(talker, "pl_err_sm4.htm");
        }
    } else if (reply == 0) {
        if (i0 < 1000) {
            ShowPage(talker, "pl_err_sm3.htm");
        } else {
            ShowPage(talker, "pl_err_sm4.htm");
        }
    } else if (reply == 1) {
        ShowPage(talker, "pl_create_ok_submaster.htm");
    }
}

RENAME_SUBPLEDGENPCid 112🟢 высокая

результат переименования подразделения

Срабатывает как ответ на запрос переименования клан-подразделения. Движок заполняет: talker — игрок; reply — код ответа/выбор; s0 — строка; i0 — целое (i0).

Значения reply: reply (L2Server): 1 — переименование успешно (async ReplyRenameSubpledge, imm). Отрицательные -9..-1 — сырой результат SQL-процедуры БД (в бинаре не материализуется). Синхронные причины отказа (CPledge::RenameSubPledgeByNpc, лог-строки): нет клан-права; главный клан; нет суб-пледжа; недопустимое/слишком длинное имя.

Пример использования

EventHandler RENAME_SUBPLEDGE(talker, reply, i0)
{
    if (reply == 1) {
        if (i0 == -1) {
            ShowPage(talker, "pl_rename_ok_aca.htm");
        } else if (i0 < 1000) {
            ShowPage(talker, "pl_rename_ok_sub1.htm");
        } else {
            ShowPage(talker, "pl_rename_ok_sub2.htm");
        }
    } else if (reply == -1) {
        ShowPage(talker, "pl_err_master.htm");
    } else if (reply == -2) {
        ShowPage(talker, "pl_err_rename_disband.htm");
    } else if (reply == -3) {
        ShowPage(talker, "pl_err_rename_main.htm");
    } else if (reply == -4) {
        if (i0 == -1) {
            ShowPage(talker, "pl_err_rename_aca.htm");
        } else if (i0 < 1000) {
    // ... (полное тело опущено)
}

UPGRADE_SUBPLEDGE_MEMBER_COUNTNPCid 107🟢 высокая

результат расширения лимита подразделения

Срабатывает как ответ на запрос увеличения предельного числа участников клан-подразделения. Движок заполняет: talker — игрок; reply — код ответа/выбор; i0 — целое (i0).

Значения reply: reply (async ReplyUpgradeSubPledgeMemberCount): 1 — успех апгрейда (byref из БД), 0 — провал (imm). Синхронные отказы (уровень<9, не хватает адены 5000/7500, нет прав/суб-пледжа) — до async.

Пример использования

EventHandler UPGRADE_SUBPLEDGE_MEMBER_COUNT(talker, reply)
{
    if (reply == 0) {
        ShowPage(talker, "pl_upgrade_err_sub2.htm");
    } else if (reply == 1) {
        ShowPage(talker, "pl_upgrade_ok_sub2.htm");
    }
}

SET_HERO_RETURNEDNPCid 95🟢 высокая

результат присвоения статуса героя

Срабатывает как ответ на запрос установки персонажу статуса героя. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply (L2Server DxSaveHeroType server-job) = применённый hero-type: 2 — стал героем (выданы геройские/клан-скиллы), 0 — снятие героя. reply==2 в скриптах = «герой подтверждён».

Инициируется: SetHero (см. NASC_FUNCTIONS).

Пример использования

EventHandler SET_HERO_RETURNED( talker, reply )
{
    if ( reply == 2 ) {
        Announce( MakeFString( ( 1000376 + talker.subjob0_class ), talker.name, "", "", "", "" ) );
    }
}

REVIVE_PLEDGENPCid 46🟢 высокая

воскрешение клана

Срабатывает в рамках процедуры воскрешения членов клана (pledge). Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply (по реальным скриптам): reply (L2Server CPledge::RevivePledgeByNpc): успех — если клан ждал роспуска (роспуск отменяется); отказ — клан НЕ в роспуске (sys.msg 267) или нет клана/не мастер (236). Отдельного числа-кода в хвосте пакета нет.

Пример использования

EventHandler REVIVE_PLEDGE( talker, reply )
{
    if (reply == 1) {
        ShowPage(talker, "pl012.htm");
    }
}

Зоны, инстансы, двери, ловушки

16 событий

INZONE_ALL_USERNPCid 192🟢 высокая

обход всех игроков инстанс-зоны

Перебор/обработка всех игроков внутри инстанс-зоны. Движок заполняет: target — игрок в зоне; i0 — всего игроков.

Пример использования

EventHandler INZONE_ALL_USER( target, i0, i1, c0, s0 )
{
    if (IsNullCreature(target) == @FALSE) {
        i1 = InstantZone_GetId( );
        if (target.instant_zone_id == i1) {
            if (myself.sm.flag == 2) {
                SendUIEventFStr(target, 2, 0, 0, p_sNoTimer, IntToStr(myself.av_ai0.GetValue()), IntToStr(inst_duration), p_sPercent, "0", p_iTitleUI, _blank, _blank, _blank, _blank, _blank);
            } else {
                SendUIEventFStr(target, 5, 0, 0, p_sNoTimer, IntToStr(myself.av_ai0.GetValue()), IntToStr(inst_duration), p_sPercent, "0", p_iTitleUI, _blank, _blank, _blank, _blank, _blank);
            }

            // пишем итоги в базу
            if ( myself.sm.param1 == 1 ) {
                myself.sm.param1 = 0;

                i0 = MPCC_GetMPCCId( target );
                if ( i0 > 0 ) {
                    c0 = MPCC_GetMaster( i0 );
                    if ( IsNullCreature( c0 ) ) { c0 = target; } // если вдруг игрок выпал из ЦЦ и лидер не найден

    // ... (полное тело опущено)
}

INSTANT_ZONE_ENTER_RETURNEDNPCid 123🟢 высокая

ответ на запрос входа в инстанс-зону

Ответ на попытку входа игрока в инстанс-зону. Движок заполняет: talker — игрок; reply — успех входа; state — связанный id.

Значения reply (по реальным скриптам): reply = nSuccess: 0 — вход отклонён, 1 — вход разрешён.

Инициируется: вход в инстанс-зону (InstantZone_Enter) (см. NASC_FUNCTIONS).

Пример использования

EventHandler INSTANT_ZONE_ENTER_RETURNED( talker, reply, state, party0, i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, c0, s0, s1, pledge0 )
{
    if ( state == 0 ) {
    } else
    if ( state == 1 ) {
    }
    if ( reply == 0 ) {
    } else
    if ( reply == 1 ) {
        if ( state == 0 ) {
            s1 = IntToStr(GetDateTime(0,0))+"-"+IntToStr(GetDateTime(0,1))+"-"+IntToStr(GetDateTime(0,2))+" "+IntToStr(GetDateTime(0,3))+":"+IntToStr(GetDateTime(0,4))+":"+IntToStr(GetDateTime(0,5));
            SetDbData( "instance_log", "enter_181", talker.name, IntToStr( talker.dbid ), s0, "", IntToStr( talker.occupation ), IntToStr( reply ), IntToStr( talker.level ), s1 ); // detail
        }
    }
}

ON_INSTANT_ZONE_EVENTMAKERid 17🟢 высокая

событие инстанс-зоны

Судя по имени и аргументам, передаёт событие, связанное с инстанс-зоной. Движок заполняет: inzone_type_id — тип инстанс-зоны; event_id — id арены/зоны/поля.

Значения inzone_type_id — это НЕ мелкий enum, а идентификатор типа зоны (nInZoneTypeId в
движке, ср. CNPC::SharedInstantZone_Enter(..., int nInZoneTypeId, ...)): каждая инстанс-зона
описана строкой в instantzonedata.txt со своим type-id, по нему скрипт и различает зоны
(как id полевого цикла). Перечня фиксированных значений нет — берётся из instantzonedata.txt.

Инициируется: привязкой события к зоне через RegisterInstantZoneEventEx(type, cluster, event_id, flag) — при спавне/деспавне зоны мейкер получает это событие с тем же event_id (см. NASC_FUNCTIONS).

Пример использования

EventHandler ON_INSTANT_ZONE_EVENT(inzone_type_id, inzone_id, event_id, reply, i0, def0)
{
    AddScriptLog(3, "[" + myself.name + "]" + IntToStr(inzone_type_id) + "" + IntToStr(event_id) + "" + IntToStr(reply) + "" + IntToStr(i0) + "]");
    if (event_id == olympiad_event_id) {
        if (i0 == field_status_waitmatch) {
            for (i0 = 0; i0 < myself.def_count; i0 = i0 + 1)
            {
                def0 = GetSpawnDefine(i0);
                if (IsNull(def0) == 0) {
                    if (myself.maximum_npc >= myself.npc_count + def0.total) {
                        if (AtomicIncreaseTotal(def0, def0.total, 1)) {
                            def0.Spawn2(def0.total, 0, 0);
                        }
                    }
                }
            }
        } else {
            for (i0 = 0; i0 < myself.def_count; i0 = i0 + 1)
            {
                def0 = GetSpawnDefine(i0);
    // ... (полное тело опущено)
}

TRAP_STEP_INNPCid 116🟢 высокая

кто-то наступил на ловушку

Срабатывает, когда существо попадает в зону действия ловушки. Движок заполняет: i0 — id существа, попавшего в ловушку; i1 — доп. параметр взаимодействия. (Фабрика L2NPC CreateTrapStepInEvent: i0/i1 из пакета TrapCreatureStepInOut; метка «creature» в AI_EVENTS_REFERENCE ошибочна.)

Пример использования

EventHandler TRAP_STEP_IN(i0, i1, c0)
{
    c0 = GetCreatureFromID(i0);
    Shout(MakeFString(1800077, "", "", "", "", ""));
}

ON_FIELD_CYCLE_CHANGED_EVENTMAKERid 15🟢 высокая

сменился цикл/фаза поля

Срабатывает при смене цикла (фазы) игрового поля/зоны. Движок заполняет: event_id — id арены/зоны/поля; state — новая фаза цикла (номер nStep; сырое число, задаёт скрипт).

Инициируется: сменой фазы через SetStep_FieldCycle / SetStepWithoutActor_FieldCycle; подписка — RegisterFieldCycleEventEx / RegisterAsFieldCycleManager (см. NASC_FUNCTIONS).

Пример использования

EventHandler ON_FIELD_CYCLE_CHANGED_EVENT(event_id, state, i1)
{
    if (event_id == 1) {
        if (state >= 1 && state <= 8) {
        }
    }
}

ON_DOOR_EVENTMAKERid 8🟢 высокая

событие двери

Срабатывает при изменении состояния связанной двери (например, открыта/закрыта). Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример использования

EventHandler ON_DOOR_EVENT( enabled, i0, i1, i2, def0, maker0 )
{
    if ( enabled ) {
        if ( myself.enabled ) {
            return;
        }
        myself.enabled = 1;
        if ( room_index == 1 ) {
            i2 = GetInZoneID( );
            maker0 = InstantZone_GetNpcMaker( i2, alarm_maker_name );
            if ( IsNull( maker0 ) == @FALSE ) {
                SendMakerScriptEvent( maker0, @SPAWN_ALL_INSTANT, 0, 0 );
                SendMakerScriptEvent( maker0, 12566, room_index, 0 );
            }
            AddTimerEx( 2004, ( 20 * 1000 ) );
        }
        if ( room_index == 8 ) {
            AddTimerEx( 2003, 3000 );
        }
        for( i0 = 0; i0 < myself.def_count; ++i0 ) {
    // ... (полное тело опущено)

TRAP_DEFUSEDNPCid 119🟢 высокая

ловушка обезврежена

Срабатывает, когда связанная ловушка была обезврежена. Движок заполняет: i0 — целое (i0).

Пример использования

EventHandler TRAP_DEFUSED(i0)
{
    myself.c_ai0 = GetCreatureFromID(i0);
    ShowSystemMessage(myself.c_ai0, 2285);
}

TRAP_DETECTEDNPCid 120🟢 высокая

ловушка обнаружена

Срабатывает, когда связанная ловушка была обнаружена. Движок заполняет: i0 — целое (i0).

Пример использования

EventHandler TRAP_DETECTED( i0, i1 )
{
    SetVisible( 1 );
}

TRAP_ACTIVATEDNPCid 118🟢 высокая

ловушка активирована

Срабатывает, когда связанная ловушка сработала (активировалась). Движок заполняет: i0 — целое (i0).

Пример использования

EventHandler TRAP_ACTIVATED( i0 )
{

}

INSTANT_ZONE_REMAIN_DURATIONNPCid 191🟢 высокая

оставшееся время инстанс-зоны

Срабатывает по приходу сведений об оставшейся длительности доступа к инстанс-зоне. Движок заполняет: reply — код ответа/выбор.

Пример использования

EventHandler INSTANT_ZONE_REMAIN_DURATION(reply)
{
    myself.av_ai0.Exchange(reply);
}

TRAP_STEP_OUTNPCid 117🟢 высокая

выход из зоны ловушки

Срабатывает, когда существо покинуло зону действия связанной ловушки. Движок заполняет: i0 — целое (i0); i1 — целое (i1).

Пример использования

EventHandler TRAP_STEP_OUT(i0, i1, c0)
{
    c0 = GetCreatureFromID(i0);
    SetWorldTrapVisibleByClassId(myself.sm.class_id, show_step_out);
}

DOOR_HP_LEVEL_INFORMEDNPCid 77🟢 высокая

уведомление об уровне HP ворот

Срабатывает при получении сведений об уровне прочности (HP) двери/ворот. Движок заполняет: talker — игрок; level — уровень.

Инициируется: GetDoorHpLevel (см. NASC_FUNCTIONS).

Пример использования

EventHandler DOOR_HP_LEVEL_INFORMED(talker, level, i0, i1, i2, fhtml0)
{
    if (Castle_IsUnderSiege() || GetDominionWarState(dominion_id) == 5)
    {
        ShowPage(talker, fnSiegeStoppedFunction);
    }
    else if (IsMyLord(talker) == @TRUE || ((HavePledgePower(talker, 23) && Castle_GetPledgeId() == talker.pledge_id && talker.pledge_id != 0)))
    {
        i0 = GetCookie(talker, "gate_price");
        i1 = GetCookie(talker, "gate_level");
        i2 = GetCookie(talker, "gate_num");
        if (level >= i1)
        {
            FHTML_SetFileName(fhtml0, fnCurrentDoorLevelHigher);
            FHTML_SetInt(fhtml0, "doorlevel", level);
            ShowFHTML(talker, fhtml0);
        }
        else if (OwnItemCount(talker, @adena) >= i0)
        {
            DeleteItem1(talker, @adena, i0);
    // ... (полное тело опущено)
}

MPCC_TELEPORTEDNPCid 108🟢 высокая

телепортация командного канала

Срабатывает при телепортации участников MPCC (объединённого командного канала). Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply (L2Server TeleportMPCCToLocation) = число реально телепортированных участников командного альянса (MPCC); >0 — кто-то перемещён.

Пример использования

EventHandler MPCC_TELEPORTED( talker, reply, i0, i1, c0 )
{
    i0 = GetGlobalMap(3);
    if (i0 != -1) {
        c0 = GetCreatureFromIndex(i0);
        i1 = MPCC_GetMPCCId(talker);
        if (talker == MPCC_GetMaster(i1) && IsNullCreature(c0) == 0 && c0.alive) {
            if (reply >= 99) {
                SendScriptEvent(c0, 99999999, i1);
                myself.i_ai1 = i1;
            }
            if (reply > 0) {
                myself.i_ai0 = myself.i_ai0 + reply;
                SetDBValue(myself.sm, myself.i_ai0);
                if (c0.db_value == 0) {
                    MPCC_SetMasterPartyRouting(myself.i_ai1, c0, 0);
                    SendScriptEvent(c0, 0, 0);
                }
            }
        }
    // ... (полное тело опущено)
}

ON_NPCPOS_EVENTMAKERid 7🟢 высокая

событие позиции NPC

Срабатывает при событии, связанном с позицией/появлением NPC. Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример использования

EventHandler ON_NPCPOS_EVENT( enabled, i0, def0 )
{
    if ( enabled ) {
        if ( myself.enabled ) {
            return;
        }
        myself.enabled = 1;
        for( i0 = 0; i0 < myself.def_count; ++i0 ) {
            def0 = GetSpawnDefine( i0 );
            if ( IsNull( def0 ) == @FALSE ) {
                if ( AtomicIncreaseTotal( def0, def0.total, 1 ) ) {
                    def0.Spawn2( def0.total, 0, 0 );
                }
            }
        }
    } else {
        if ( myself.enabled == 0 ) {
            return;
        }
        myself.enabled = 0;
    // ... (полное тело опущено)

FIELD_CYCLE_STEP_EXPIREDNPCid 186🟢 высокая

истечение шага полевого цикла

Срабатывает по истечении таймера очередной фазы циклического полевого события. Движок заполняет: event_id — id арены/зоны/поля; i0 — номер истёкшей фазы; i1 — целое (доп. параметр).

Инициируется: истечением таймера фазы цикла; подписка — RegisterFieldCycleEventEx / RegisterAsFieldCycleManager; смену фазы делает SetStep_FieldCycle (см. NASC_FUNCTIONS).

Пример использования

EventHandler FIELD_CYCLE_STEP_EXPIRED(event_id, i0, i1)
{
    if (event_id == RaceCycleID)
    {
        if (i0 == 0 || i0 == 1)
        {
            if (i1 == 0)
            {
                SetStep_FieldCycle(RaceCycleID, 2, 8, myself.sm);
            }
        }
    }
}

TELEPORT_TO_USER_RESNPCid 114🟢 высокая

ответ на телепорт к игроку

Приходит как ответ на запрос телепортации к игроку. Движок заполняет: talker — игрок; i0 — id резиденции; success — успех.

Инициируется: TeleportToUser (см. NASC_FUNCTIONS).

Пример использования

EventHandler TELEPORT_TO_USER_RES(talker, i0, success, c0)
{
    if (success == @FALSE)
    {
        AddLog(10, talker, success);
    }
    else
    {
        c0 = GetCreatureFromID(i0);
        if (IsNullCreature(c0) == @FALSE)
        {
            AddLog(10, talker, 3);
        }
        else
        {
            AddLog(10, talker, 3);
        }
        ShowPage(talker, "court_magician003.htm");
    }
}

Диалоги, меню, обучение

9 событий

MENU_SELECTEDNPCid 31🟢 высокая

игрок выбрал пункт меню диалога

Срабатывает, когда игрок кликает по пункту в открытом меню NPC. Движок заполняет: talker — игрок; ask — раздел меню; reply — выбранный вариант; state — состояние/статус; action_id — код действия.

ОТКУДА БЕРУТСЯ ЧИСЛА ask/reply. Их назначает автор диалога: html-страница NPC
содержит ссылку вида

<a action="bypass -h menu_select?ask=635&reply=1">...</a>

Клик игрока по такой ссылке и порождает MENU_SELECTED с этими ask/reply. Сами
ссылки лежат во внешних html-файлах диалогов (поэтому в .nasc этих чисел «не
видно» — они приходят из html); скрипт может и сам вписать такую ссылку в
страницу через FHTML_SetStr (см. NASC_FUNCTIONS, группа FHTML). Пары ask/reply —
произвольное соглашение между html и обработчиком, но в реальных скриптах
устоялись конвенции:

ask > 0 (частый случай) номер КВЕСТА, которому принадлежит ветка диалога:
страницы квеста N называются *_q0NNN_MM.htm, ссылки
в них шлют ask=N, а обработчик в ветке ask == N
сразу вызывает SetCurrentQuestID(@квест)
ask == -1000 базовое меню жителя (citizen): reply 0 —
приветствие, reply 1 — сведения о владении/налоге
ask == -303 выбор мультиселла: reply — id мультиселла,
передаётся прямо в ShowMultisell(reply, talker)
ask == -301 бафф-меню (ссылки строит скрипт через FHTML_SetStr)

Значения reply (по реальным скриптам): reply — НЕ код результата, а id выбранного пункта меню (произвольный, задаётся html-страницей; в скриптах — сотни значений).

Инициируется: html-меню (ShowPage/ссылки в html вида bypass -h menu_select?ask=N&reply=M) (см. NASC_FUNCTIONS).

Пример использования

EventHandler MENU_SELECTED( talker, ask, reply, state, i0, s0 )
{
    if ( myself.sm.flag < 2 ) { return; }

    if ( ask == 1002 ) {
        if ( reply == 3 && state > 0 ) {
            if( ( GetCurrentTick() - talker.quest_last_reward_time ) < 2 ) { return; }
            talker.quest_last_reward_time = GetCurrentTick();

            if ( OwnItemCount( talker, @adena ) >= 75000000 * state ) {
                DeleteItem1( talker, @adena, 75000000 * state );
                i0 = @s_atb_b_f_buff1 + Rand(5);
                CastBuffForQuestReward( myself.c_ai0, i0 );
                GiveItem1( talker, @atb_black_friday_box_a, 1 * state );
                ShowPage( talker, "atb_black_friday003.htm" );
            } else {
                ShowPage( talker, "atb_black_friday004.htm" );
                myself.c_ai1 = myself.c_ai0;
                myself.c_ai0 = GetNullCreature( );
                myself.sm.flag = 0;
    // ... (полное тело опущено)
}

TALK_SELECTEDNPCid 4🟢 высокая

игрок кликнул по NPC

Срабатывает, когда игрок выбирает NPC щелчком (выделяет цель для разговора). Движок заполняет: talker — игрок; _from_choice — _from_choice; _code — _code.

Пример использования

EventHandler TALK_SELECTED( fhtml0, i0, talker )
{
    if ( _from_choice == 0 ) {

        if ( _choiceN > 1 ) {
            myself.ShowChoicePage( talker, 1 );
            return;
        }
    }

    if ( _from_choice || _choiceN == 1 ) {
        if ( myself.GetInventoryInfo( talker, 0 ) >= ( myself.GetInventoryInfo( talker, 1 ) * 0.800000 ) || myself.GetInventoryInfo( talker, 2 ) >= ( myself.GetInventoryInfo( talker, 3 ) * 0.800000 ) ) {
            myself.ShowSystemMessage( talker, 1118 );
            return;
        }

        select ( _code ) {
        }
        return;
    }
    // ... (полное тело опущено)
}

TALKEDNPCid 3🟢 высокая

игрок начал разговор с NPC

Срабатывает, когда игрок инициирует диалог с NPC. Движок заполняет: talker — игрок; _from_choice — _from_choice; _code — _code.

Пример использования

EventHandler TALKED( talker )
{
    if ( _from_choice == 0 ) {
        if ( HaveMemo( talker, @bak_event ) == 0 ) {
            _choiceN = ( _choiceN + 1 );
            _code = 0;
            AddChoiceFStrEx(0, 101, @QCCE_START);    // Letters of Love
        }
        if ( _choiceN > 1 ) {
            ShowChoicePage( talker, 0 );
            return;
        }
    }
    if ( _from_choice || _choiceN == 1 ) {
        if ( _code == 0 ) {
            if ( _from_choice == 0 || HaveMemo( talker, @bak_event ) == 0 ) {
                SetCurrentQuestID( @gourd_event );
                if (GetInventoryInfo(talker, @IPT_CURRENT_WEIGHT) >= (GetInventoryInfo(talker, @IPT_MAX_CARRY_WEIGHT) * 0.900000) || GetInventoryInfo(talker, @IPT_CURRENT_SLOT_COUNT) >= (GetInventoryInfo(talker, @IPT_MAX_SLOT_COUNT) * 0.900000))
                {
                    ShowSystemMessage(talker, 3262);
    // ... (полное тело опущено)
}

ONE_SKILL_SELECTEDNPCid 34🟢 высокая

выбрано конкретное умение

Судя по имени и аргументам, срабатывает при выборе игроком одного умения (например, из списка к изучению). Движок заполняет: talker — игрок; skill_name_id — умение [skill]; need_quest — признак квеста; i0 — целое (i0).

Пример использования

EventHandler ONE_SKILL_SELECTED(talker, skill_name_id, need_quest, i0)
{
    ShowGrowEtcSkillMessage(talker, skill_name_id, i0, "");
}

MANOR_MENU_SELECTEDNPCid 38🟢 высокая

выбран пункт меню манора

Срабатывает, когда игрок выбрал пункт в меню манора (сельское хозяйство замка). Движок заполняет: talker — игрок; ask — раздел меню манора; state — состояние/статус; time — игровое время.

Значения reply (по реальным скриптам): ask/reply задаются html-меню манора (не фиксированные коды).

Пример использования

EventHandler MANOR_MENU_SELECTED(talker, state, ask, time)
{
    if (state == -1)
    {
        state = myself.sm.residence_id;
    }
    if (ask == 3) { ShowSeedInfo(talker, state, time); } else
    if (ask == 4) { ShowCropInfo(talker, state, time); } else
    if (ask == 5) { ShowManorDefaultInfo(talker); } else
    if (ask == 7) { ShowSeedSetting(talker, state); } else
    if (ask == 8) { ShowCropSetting(talker, state);  }
}

SHOW_ENCHANT_SKILL_DRAWERNPCid 121🟢 высокая

показ окна заточки умения

Срабатывает при необходимости показать игроку окно (drawer) заточки умения. Движок заполняет: talker — игрок; skill_name_id — умение [skill]; action_id — код действия.

Пример использования

EventHandler SHOW_ENCHANT_SKILL_DRAWER(talker, skill_name_id, action_id)
{
    ShowEnchantSkillListDrawer(talker, skill_name_id, action_id);
}

ONE_ENCHANT_SKILL_SELECTEDNPCid 35🟢 высокая

выбрано одно умение для заточки

Срабатывает, когда игрок выбрал конкретное умение для заточки. Движок заполняет: talker — игрок; skill_name_id — умение [skill]; action_id — код действия.

Пример использования

EventHandler ONE_ENCHANT_SKILL_SELECTED(talker, skill_name_id, action_id)
{
    ShowEnchantSkillMessage(talker, skill_name_id, action_id);
}

TUTORIAL_EVENTNPCid 52🟢 высокая

событие обучения

Срабатывает при наступлении шага обучающей системы (туториала) для игрока. Движок заполняет: talker — игрок; event_id — id арены/зоны/поля.

Пример использования

EventHandler TUTORIAL_EVENT( event_id, fhtml0, i1, i2, i3, i4, s1, talker )
{
    i1 = event_id * (-1);

    select ( i1 ) {
        case 3000 : {
            FHTML_SetFileName( fhtml0, LUCKY_GAME_COL_START_HTML );
            FHTML_SetInt( fhtml0, "user_ticket_count", OwnItemCount( talker, LUCKY_GAME_COL_ITEM_ID ) );
            ShowFHTML(talker, fhtml0);
            break;
        }
        case 4000 : {
            FHTML_SetFileName( fhtml0, LUCKY_GAME_ADENA_START_HTML );
            FHTML_SetInt( fhtml0, "user_ticket_count", OwnItemCount( talker, LUCKY_GAME_ADENA_ITEM_ID ) );
            ShowFHTML(talker, fhtml0);
            break;
        }
        case 3333 : {
            SetMemoStateEx( talker, LUCKY_GAME_COL_QUEST_ID, LUCKY_GAME_REQUEST_COUNT_SECTION, 0 );
            SetMemoStateEx( talker, LUCKY_GAME_ADENA_QUEST_ID, LUCKY_GAME_REQUEST_COUNT_SECTION, 0 );
    // ... (полное тело опущено)
}

SOCIAL_ACTION_EVENTNPCid 164🟢 высокая

социальное действие

Срабатывает при выполнении игроком социального действия (эмоции/жеста). Движок заполняет: talker — игрок; action_id — код действия.

Пример использования

EventHandler SOCIAL_ACTION_EVENT(talker, action_id, i0)
{
    if (action_id == 4)
    {
        BroadcastScriptEvent(@SCE_START, 0, 9999);
        SayFStr(2010031, _blank, _blank, _blank, _blank, _blank);
    }
    super;
}

Бой и умения

16 событий

ATTACKEDNPCid 1🟢 высокая

по NPC нанесли удар

Срабатывает, когда по NPC проходит атака. Движок заполняет: attacker — атакующий; damage — урон; weapon_class_id — класс оружия; skill_name_id — умение [skill] (0 при обычном ударе).

Пример использования

EventHandler ATTACKED(attacker, damage, skill_name_id)
{
    if (attacker.is_pc == @TRUE || IsInCategory(@summon_npc_group, attacker.npc_class_id) == @TRUE || IsInCategory(@icequeen_npc, attacker.npc_class_id) == @TRUE)
    {
        if (myself.sm.hp < (myself.sm.max_hp / 20.000000))
        {
            if (myself.i_ai0 == 0)
            {
                myself.i_ai0 = 1;
                AddTimerEx(TIMER_elemental_killed, 1000);
            }
        }
        else
        {
            AddAttackDesire(attacker, @AMT_MOVE_TO_TARGET, damage * 2);
            if (skill_name_id != 0)
            {
                if (Skill_GetAbnormalType(@s_hate11) == Skill_GetAbnormalType(skill_name_id))
                {
                    AddAttackDesire(attacker, @AMT_MOVE_TO_TARGET, damage * 5);
    // ... (полное тело опущено)
}

CLAN_ATTACKEDNPCid 22🟢 высокая

ударили соклановца NPC

Срабатывает, когда атакуют члена того же клана, что и NPC. Движок заполняет: attacker — атакующий; victim — жертва; weapon_class_id — класс оружия; skill_name_id — умение [skill]; damage — урон.

Пример использования

EventHandler CLAN_ATTACKED( victim, attacker, damage, i0 )
{
    if ( myself.boss.alive && victim == myself.boss ) {
        if ( IsNullCreature( attacker ) == 0 ) {
            MakeAttackEvent( attacker, damage, 0 );
        }
    }
    super;
}

USE_SKILL_FINISHEDNPCid 64🟢 высокая

NPC завершил применение умения

Срабатывает по окончании каста умения NPC, причём вызывается и при неудаче. Движок заполняет: target — цель; skill_name_id — умение [skill]; success — успех.

Инициируется: AddUseSkillDesire (см. NASC_FUNCTIONS).

Пример использования

EventHandler USE_SKILL_FINISHED( target, skill_name_id, success )
{
    if (skill_name_id == Skill03_ID && success == 1) {
        SetNpcParam( target, @VCP_HP, (target.hp + (target.max_hp * hp_heal_percentage)) );
    }
    super;
}

SEE_SPELLNPCid 15🟢 высокая

NPC увидел чужой каст

Срабатывает, когда NPC замечает применение умения другим существом. Движок заполняет: speller — кастующий; target — цель; skill_name_id — умение [skill].

Пример использования

EventHandler SEE_SPELL( speller, skill_name_id, target, i0 )
{
    if ( IsNullCreature( speller ) == 0 ) {
        if ( skill_name_id == detectSkill ) {
            if ( DistFromMe( speller ) < 600 ) {
                AddUseSkillDesire( target, detectSkill, @ST_ATTACK, @AMT_MOVE_TO_TARGET, 99999999900000000 );
            }
        }
    }
}

PARTY_ATTACKEDNPCid 18🟢 высокая

ударили члена группы или подчинённого

Срабатывает, когда атакуют члена группы NPC или его подопечного. Движок заполняет: attacker — атакующий; private — подопечный/член группы; damage — урон.

Пример использования

EventHandler PARTY_ATTACKED( attacker, private, damage )
{
    if ( private != myself.sm && attacker != myself.sm ) {
        myself.i_ai1 = myself.i_ai1 + damage;
    }
}

PARTY_DIEDNPCid 20🟢 высокая

погиб член группы

Судя по имени и аргументу, срабатывает при гибели участника группы NPC. Движок заполняет: private — подопечный/член группы; attacker — атакующий.

Пример использования

EventHandler PARTY_DIED(attacker, private, i0, i1)
{
    if (private == myself.boss && myself.sm.alive != 0) {
        if (FieldCycle2 != -1 && FieldCycle2_Condition == 101) {
            i0 = GetStep_FieldCycle(FieldCycle2);
            if (i0 >= Threshold_Level_Min2 && i0 <= Threshold_Level_Max2) {
                AddPoint_FieldCycle(FieldCycle2, FieldCycle2_Quantity, 3, attacker);
            }
            RemoveAllDesire();
            Say(MakeFString(1800024, "", "", "", "", ""));
            AddTimerEx(1399, 1500);
        }
    }
    super;
}

SPELLEDNPCid 2🟢 высокая

по NPC применили умение

Срабатывает, когда по NPC проходит применённое умение (эффект достиг цели). Движок заполняет: speller — кастующий; skill_id — id умения; skill_level — уровень умения; skill_name_id — умение [skill].

Пример использования

EventHandler SPELLED( speller, skill_name_id, skill_id )
{
    if (babble_mode == 1) {
        Say("" + IntToStr(skill_id));
    }
    if (skill_name_id == Skill_unlock) {
        if (GetInventoryInfo( speller, @IPT_CURRENT_SLOT_COUNT ) >= GetInventoryInfo( speller, @IPT_MAX_SLOT_COUNT ) * 0.900000 || GetInventoryInfo( speller, @IPT_CURRENT_WEIGHT ) >= GetInventoryInfo( speller, @IPT_MAX_CARRY_WEIGHT ) * 0.900000) {
            if (Inven_Check_SysMsg != 0) {
                ShowSystemMessage(speller, Inven_Check_SysMsg);
            }
            return;
        }
        if (babble_mode == 1) {
            Say("");
        }
        GiveItem1( speller, Item_reward_coin , Qty_reward_coin);
    }
}

ATTACK_FINISHEDNPCid 57🟢 высокая

NPC завершил удар

Срабатывает по завершении атакующего действия NPC. Движок заполняет: target — цель.

Инициируется: AddAttackDesire (см. NASC_FUNCTIONS).

Пример использования

EventHandler ATTACK_FINISHED(target)
{
    if (target.alive == @FALSE && target.is_pc == @TRUE)
    {
        Despawn();
    }
    super;
}

ABNORMAL_STATUS_CHANGEDNPCid 113🟢 высокая

изменился аномальный статус NPC

Судя по имени и аргументам, срабатывает при изменении у NPC аномального состояния (бафф/дебафф). Движок заполняет: speller — кастующий; skill_id — id умения; skill_level — уровень умения; skill_name_id — умение [skill].

Пример использования

EventHandler ABNORMAL_STATUS_CHANGED(speller, skill_id, skill_level, skill_name_id, s0, i0)
{
    i0 = skill_id - 5106;
    if (skill_id == 5106 || skill_id == 5107 || skill_id == 5108)
    {
        if (skill_level == 0)
        {
            if (myself.i_quest0 > 0)
            {
                if (Skill_GetConsumeMP(CaptureCancel_all) < myself.sm.mp && Skill_GetConsumeHP(CaptureCancel_all) < myself.sm.hp && Skill_InReuseDelay(CaptureCancel_all) == 0)
                {
                    AddUseSkillDesire(myself.sm, CaptureCancel_all, @ST_HEAL, @AMT_MOVE_TO_TARGET, 10000000);
                }
                AddLogByNpc(414, myself.sm, 6, 0);
                if (myself.sm.alive != 0)
                {
                    myself.i_quest0 = 0;
                }
            }
        }
    // ... (полное тело опущено)
}

CLAN_DIEDNPCid 93🟢 высокая

погиб соклановец NPC

Судя по имени и аргументам, срабатывает при гибели члена того же клана. Движок заполняет: victim — жертва.

Пример использования

EventHandler CLAN_DIED(victim, i0)
{
    AddFleeDesireEx(victim, Distance, 10000);
    super;
}

STATIC_OBJECT_CLAN_ATTACKEDNPCid 24🟢 высокая

атакован статический объект клана

Срабатывает, когда по статическому объекту, принадлежащему клану, нанесён удар. Движок заполняет: attacker — атакующий; victim_so — статик-объект-жертва; weapon_class_id — класс оружия; skill_name_id — умение [skill]; damage — урон.

Пример использования

EventHandler STATIC_OBJECT_CLAN_ATTACKED( attacker, damage, skill_name_id, i0 )
{
    if (skill_name_id == 154796033) {
        if (DistFromMe(attacker) < 500) {
            if (myself.i_ai0 == 1) {
                AddEffectActionDesire(myself.sm, 1, 10000, 10000);
                BroadcastScriptEvent(13013, 0, 5000);
                AddTimerEx(2005, 2000);
                AddTimerEx(2006, 5500);
                if (Skill_GetConsumeMP(354418689) < myself.sm.mp && Skill_GetConsumeHP(354418689) < myself.sm.hp && Skill_InReuseDelay(354418689) == 0 && (GetAbnormalLevel(myself.sm, Skill_GetAbnormalType(23134209)) <= 0 && GetAbnormalLevel(myself.sm, Skill_GetAbnormalType(87556097)) <= 0)) {
                    AddUseSkillDesire(myself.sm, 354418689, 0, 1, 1000000);
                }
            } else {
                i0 = Rand(100);
                if (i0 < 33) {
                    Shout(MakeFString(1800064, "", "", "", "", ""));
                } else {
                    if (i0 < 66) {
                        Shout(MakeFString(1800065, "", "", "", "", ""));
                    } else {
    // ... (полное тело опущено)
}

PET_DIEDNPCid 165🟢 высокая

гибель питомца

Срабатывает при гибели питомца. Движок заполняет: i0 — целое (i0); i1 — целое (i1).

Пример использования

EventHandler PET_DIED(i0, i1, i2)
{
    if (i0 == 1 && i1 == 0) {
        i2 = Rand(10) + 1;

        if (myself.sm.master.pk_count <= i2) {
            IncrementParam(myself.sm.master, @PARAM_PKCOUNT, -1 * myself.sm.master.pk_count);
        } else {
            IncrementParam(myself.sm.master, @PARAM_PKCOUNT, -1 * i2);
        }
    }
}

SPELL_SUCCESSEDNPCid 187🟢 высокая

успешное применение умения

Срабатывает при успешном завершении применения умения. Движок заполняет: target — по кому прошёл каст; skill_id — id умения; skill_level — уровень умения; skill_name_id — умение [skill].

Пример использования

EventHandler SPELL_SUCCESSED(skill_name_id, target)
{
    if (skill_name_id == @s_npc_monster_garden_of_genesis_aphros_draw1)
    {
        AddUseSkillDesire(target, @s_npc_monster_garden_of_genesis_aphros_attack6, @ST_ATTACK, @AMT_MOVE_TO_TARGET, -1);
    }
}

USE_SKILL_STARTEDNPCid 193🟢 высокая

начало применения умения

Срабатывает в момент, когда NPC начинает применять умение. Движок заполняет: target — цель; skill_name_id — умение [skill].

Инициируется: AddUseSkillDesire (см. NASC_FUNCTIONS).

Пример использования

EventHandler USE_SKILL_STARTED(skill_name_id)
{
    if (skill_name_id == @s_npc_monster_garden_of_genesis_aphros_draw1)
    {
        SayFStr(1811750, _blank, _blank, _blank, _blank, _blank);
    }
    super;
}

IS_TOGGLE_SKILL_ONOFFNPCid 175🟢 высокая

запрос состояния toggle-умения

Срабатывает как запрос/проверка состояния переключаемого (toggle) умения — включено или выключено. Движок заполняет: target — цель; i0 — целое (i0).

Пример использования

EventHandler IS_TOGGLE_SKILL_ONOFF(target, i0)
{
    myself.i_ai1 = i0;
}

REALDAMAGEDid нет🟡 средняя

нанесён реальный урон

Срабатывает, когда по NPC прошёл «реальный» урон (real damage) — тип урона от скилл-эффекта i_real_damage, обходящий обычные расчёты защиты. attacker — источник урона; reply — величина/код урона; i0 — сопутствующее значение. Отдельной фабрики в разобранных сборках нет — поля по реальному использованию.

Пример использования

EventHandler REALDAMAGED(attacker, reply, i0)
{
    //
}

AI, движение, восприятие

10 событий

SEE_CREATURENPCid 5🟢 высокая

NPC заметил существо

Срабатывает, когда в зону видимости NPC попадает существо. Движок заполняет: creature — увиденное существо.

Пример использования

EventHandler SEE_CREATURE(creature, i0, i1, c0, party0)
{
    myself.c_ai0 = creature;
    super;
}

NO_DESIRENPCid 0🟢 высокая

очередь желаний пуста, NPC простаивает

Срабатывает, когда у NPC не осталось активных желаний и ему нечего делать. Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример использования

EventHandler NO_DESIRE( i0, i1, i2, i3, i4, i5, i6, i7, i8, i9 )
{
    if ( myself.sm.flag == 4 ) {
        if ( IsNullCreature( myself.c_ai0 ) == 0 ) {
            if ( ( myself.c_ai0.alive == @FALSE ) || ( DistFromMe( myself.c_ai0 ) > 1000 ) ) {
                ChangeMoveType( 0 );
                myself.sm.flag = 0;
                if ( IsNullCreature( myself.c_ai1 ) == 0 ) {
                    SendScriptEventEx( myself.c_ai1, 32110005, 0, 0 );
                }
                myself.i_ai3 = 0;
                myself.i_ai0 = -1;
                myself.c_ai0 = GetNullCreature( );
                myself.c_ai1 = GetNullCreature( );
            }
        } else {
            ChangeMoveType( 0 );
            myself.sm.flag = 0;
            if ( IsNullCreature( myself.c_ai1 ) == 0 ) {
                SendScriptEventEx( myself.c_ai1, 32110005, 0, 0 );
    // ... (полное тело опущено)

MOVE_TO_FINISHEDNPCid 65🟢 высокая

NPC дошёл до точки

Срабатывает, когда NPC завершает перемещение и достигает заданной точки. Движок заполняет: x — координата X; y — координата Y; z — координата Z.

Инициируется: AddMoveToDesire/AddMoveToTargetDesire (см. NASC_FUNCTIONS).

Пример использования

EventHandler MOVE_TO_FINISHED( x, y, z )
{
    if ( x == myself.start_x && y == myself.start_y && z == myself.start_z ) {
        AddDoNothingDesire( 40, 30 );
    }
}

OUT_OF_TERRITORYNPCid 16🟢 высокая

NPC покинул свою территорию

Срабатывает, когда NPC выходит за пределы отведённой ему территории. Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример использования

EventHandler OUT_OF_TERRITORY( i0, i1, i2, c0 )
{
    if ( myself.sm.db_value != 3 ) {
        return;
    }
    c0 = myself.top_desire_target;
    if ( IsNullCreature( c0 ) == 0 ) {
        if ( c0.is_pc == @FALSE ) {
        } else {
        }
    }
    StopMove( );
    RemoveAllAttackDesire( );
    InstantTeleport( myself.sm, 174226, -88013, -5112 );
}

DESIRE_MANIPULATIONNPCid 17🟢 высокая

внешнее воздействие на желания NPC

Судя по имени и аргументам, срабатывает при попытке управлять поведением (желаниями) NPC извне. Движок заполняет: speller — инициатор; desire — тип желания (мотив).

Значения desire — тип желания (мотив AI, @AMT_* в manual_pch). В pch всех хроник именованы
только два: @AMT_STAND = 0 (стоять), @AMT_MOVE_TO_TARGET = 1 (двигаться к цели). Полный набор
мотивов — это семейство функций Add*Desire (Attack, MoveTo, Follow, UseSkill, Flee и т.д.);
их числовой enum определён в движке (L2NPC) и в загруженном L2Server/pch целиком не выгружен.

Пример использования

EventHandler DESIRE_MANIPULATION(speller, desire)
{
    MakeAttackEvent(speller, desire, 0);
}

NODE_ARRIVEDNPCid 115🟢 высокая

прибытие в узел маршрута

Срабатывает, когда NPC доходит до очередного узла маршрута/патруля. Движок заполняет: sev_arg1 — индекс узла; sev_arg2 — класс NPC; sev_arg3 — индекс фразы; state — id social-действия (жеста) для узла; success — успех прибытия.

Значения state — это id social-действия (жеста), который NPC проигрывает в узле (движок
CNPC::SocialAction(int nActionId, ...), константы SOCIALACTION_*). Не короткий фикс-enum:
номер жеста задаётся в данных маршрута (см. freewayinfo.txt / точки пути), поэтому набор
значений определяется этими данными, а не жёстко в языке.

Инициируется: AddMoveFreewayDesire/AddMoveToWayPointDesire (см. NASC_FUNCTIONS).

Пример использования

EventHandler NODE_ARRIVED( script_event_arg1, script_event_arg2, script_event_arg3, success )
{
    if (success == 1) { Despawn(); }

    if (script_event_arg1 == 3) { EquipItem(OHS_Weapon); } else
    if (script_event_arg1 == 4) { UnequipWeapon(); } else
    if (script_event_arg1 == 36) { EquipItem(OHS_Weapon); } else
    if (script_event_arg1 == 37) { UnequipWeapon(); } else
    if (script_event_arg1 == 51) { EquipItem(OHS_Weapon); } else
    if (script_event_arg1 == 52) {
        UnequipWeapon();
        BroadcastScriptEventEx( 10005, GetIndexFromCreature(myself.sm), 0, 5000 );
        BroadcastScriptEventEx( 10002, GetIndexFromCreature(myself.sm), 0, 8000 );
    } else
    if (script_event_arg1 == 53) {
        BroadcastScriptEventEx( 10001, 0, 0, 5000);
        BroadcastScriptEventEx( 10002, GetIndexFromCreature(myself.sm), 0, 8000 );
        AddTimerEx( 1001, 3000 );
    } else
    if (script_event_arg1 == 54) { EquipItem(OHS_Weapon); } else
    // ... (полное тело опущено)
}

MOVE_TO_WAY_POINT_FINISHEDNPCid 63🟢 высокая

NPC дошёл до путевой точки

Срабатывает, когда NPC завершил перемещение к путевой точке маршрута. Движок заполняет: way_point_index — индекс вейпойнта; next_way_point_index — индекс след. вейпойнта.

Инициируется: AddMoveToWayPointDesire (см. NASC_FUNCTIONS).

Пример использования

EventHandler MOVE_TO_WAY_POINT_FINISHED(way_point_index, next_way_point_index)
{
    myself.i_ai1 = next_way_point_index;
    AddTimerEx(100001, GetWayPointDelay(WayPointDelays, way_point_index) * 1000);
}

SEE_ITEMNPCid 7🟢 высокая

NPC увидел предметы на земле

Срабатывает, когда NPC замечает предметы на земле в зоне видимости (PoI). Движок заполняет: item_index_list — список предметов (CIntList).

Пример использования

EventHandler SEE_ITEM( item_index_list, i0, i1, i2 )
{
    i0 = item_index_list.GetSize( );
    for ( i1 = 0; i1 < i0; ++i1 ) {
        AddGetItemDesireEx( item_index_list.GetItemIndex( i1 ), 10 - i1 );
    }
}

GET_ITEM_FINISHEDNPCid 60🟢 высокая

NPC закончил подбор предмета

Срабатывает, когда NPC завершил подбор предмета. Движок заполняет: item — предмет; success — удалось подобрать.

Инициируется: AddGetItemDesire (см. NASC_FUNCTIONS).

Пример использования

EventHandler GET_ITEM_FINISHED( item, success )
{
    if (item.class_id == 8190 || item.class_id == 8689) {
        if (success == 1) {
            Say(MakeFString(1800023, "", "", "", "", ""));
        }
    }
}

FIND_RANDOM_USERNPCid 172🟡 средняя

поиск случайного игрока

Приходит как ответ на запрос функции FindRandomUser(...) (сетевой запрос к L2Server, опкод 227): сервер ищет случайного подходящего игрока. Движок заполняет только talker — найденного игрока (пусто, если не найден); i0 и прочее в объявлении — свободные слоты тела. Фабрика события есть в сборке CT2.3, в CT26-сборке отсутствует.

Связанная функция: FindRandomUser (см. NASC_FUNCTIONS).

Пример использования

EventHandler FIND_RANDOM_USER( talker, i0 )
{
    myself.c_quest0 = talker;
    RegisterGlobalMap( 101, talker.id );
    if ( IsNullCreature( talker ) == 0 ) {
        CreateOnePrivateNearUser( talker, @br_santa_white_gift, "br_santa_white_gift", myself.sm.weight_point, 1, 90, 60 );
    }
    super;
}

События, PvP, олимп, мини-игры

31 событий

ON_OLYMPIAD_GAME_PREPAREDNPCid 128🟢 высокая

олимпиадный бой подготовлен

Срабатывает, когда олимпиадный поединок подготовлен к старту. Движок заполняет: event_id — арена; i0 — тип правил боя (см. ниже).

Значения i0 — тип правил матча (enum GameRuleType, L2Server; доказано таблицей
g_anTeamMembersNumber = {3, 1, 1}: у типа 0 в команде 3 бойца, у 1 и 2 — по одному):
0 gamerule_team командный бой (3×3)
1 gamerule_nonclassbased внеклассовый бой 1×1 (значение по умолчанию)
2 gamerule_classbased классовый бой 1×1
Порядок подтверждён и самим примером ниже: select(i0) ветвит case 0 -> fstr_prepared_team,
case 1 -> fstr_prepared_classless, case 2 -> fstr_prepared_class — то есть значение приходит
в NPC как есть, без ремапа. (В другом скрипте, sw_ilgf, автор пометил порядок обратным — это
ошибка его комментария; см. OLYMPIAD_MATCH_RESULT_EVENT.)

Пример использования

EventHandler ON_OLYMPIAD_GAME_PREPARED(event_id, i0, i1, i2, c0, c1)
{
    c0 = GetCreatureFromID(i1);
    c1 = GetCreatureFromID(i2);
    if (IsNullCreature(c0) == @FALSE && IsNullCreature(c1) == @FALSE)
    {
        SayFStr( 3603431, c0.name, "#" + IntToStr(1811000 + c0.occupation), c1.name, "#" + IntToStr(1811000 + c1.occupation), IntToStr(event_id));
    }
    else
    {
        select (i0)
        {
            case 0: { SayFStr(fstr_prepared_team, IntToStr(event_id), _blank, _blank, _blank, _blank); break; }
            case 1: { SayFStr(fstr_prepared_classless, IntToStr(event_id), _blank, _blank, _blank, _blank); break; }
            case 2: { SayFStr(fstr_prepared_class, IntToStr(event_id), _blank, _blank, _blank, _blank); break; }
        }
    }
}

ON_OLYMPIAD_FIELD_STEP_CHANGED_EVENTMAKERid 18🟢 высокая

сменился этап олимпиадного поля

Срабатывает при смене этапа (шага) олимпиадного поля/арены. Движок заполняет: event_id — id арены/зоны/поля; state — состояние/статус; inzone_type_id — тип инстанс-зоны.

Пример использования

EventHandler ON_OLYMPIAD_FIELD_STEP_CHANGED_EVENT(state, event_id, maker0)
{
    if (maker_event_id == event_id) {
        if (state == 0) {
            maker0 = GetNpcMaker(myself.name);
            if (IsNull(maker0) == 0) {
                SendMakerScriptEvent(maker0, 1000, 0, 0);
            }
        } else {
            maker0 = GetNpcMaker(myself.name);
            if (IsNull(maker0) == 0) {
                SendMakerScriptEvent(maker0, 1001, 0, 0);
            }
        }
    }
}

IS_USER_PVPMATCHING_RESULTNPCid 138🟢 высокая

результат проверки участия игрока в PvP-подборе

Срабатывает по приходу результата проверки, участвует ли игрок в PvP-подборе (matchmaking). Движок заполняет: i0 — целое (i0); reply — код ответа/выбор.

Значения reply: reply (L2Server NpcIsPVPMatching → IsCrataeCubeUser): 0 — игрок НЕ в матче (Cratae Cube); 1 — в матче.

Инициируется: IsUserPVPMatching (см. NASC_FUNCTIONS).

Пример использования

EventHandler IS_USER_PVPMATCHING_RESULT(reply, i0, c0)
{
    if (reply == 0) {
        c0 = GetCreatureFromID(i0);
        InstantTeleport(c0, -70411, -70958, -1416);
    }
}

UNREGISTER_USER_PVP_MATCH_RESULTNPCid 140🟢 высокая

результат отмены записи в PvP-подбор

Срабатывает по приходу результата отмены регистрации игрока в PvP-подборе. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply (L2Server NpcUnregisterUserPVPMatch): числового кода нет — эхо userId (UnregisterUser — void).

Инициируется: UnregisterUserPVPMatch (см. NASC_FUNCTIONS).

Пример:

EventHandler UNREGISTER_USER_PVP_MATCH_RESULT( )

MG_JOIN_GAME_RETURNEDNPCid 101🟢 высокая

результат входа в игру

Срабатывает как возврат результата запроса на присоединение к игре подсистемы MG. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Инициируется: MG_JoinGame (см. NASC_FUNCTIONS).

Пример использования

EventHandler MG_JOIN_GAME_RETURNED( talker, reply )
{
    select ( reply ) {
        case 0 : { break; }
        case -1 : { myself.ShowPage( talker, "game_manager002.htm" ); break; }
        case -2 : { myself.ShowPage( talker, "game_manager004.htm" ); break; }
        case -3 : { myself.ShowPage( talker, "game_manager005.htm" ); break; }
        case -4 : { myself.ShowPage( talker, "game_manager006.htm" ); break; }
        case -5 : { myself.ShowPage( talker, "game_manager007.htm" ); break; }
        case -6 : { myself.ShowPage( talker, "game_manager008.htm" ); break; }
        case -7 : { myself.ShowPage( talker, "game_manager009.htm" ); break; }
        case -8 : { myself.ShowPage( talker, "game_manager010.htm" ); break; }
        case -9 : { myself.ShowPage( talker, "game_manager011.htm" ); break; }
        case -10 : { myself.ShowPage( talker, "game_manager012.htm" ); break; }
        case -11 : { myself.ShowPage( talker, "game_manager013.htm" ); break; }
        case -12 : { myself.ShowPage( talker, "game_manager003.htm" ); break; }
        case -14 : { myself.ShowPage( talker, "game_manager014.htm" ); break; }
        case -15 : { myself.ShowPage( talker, "game_manager015.htm" ); break; }
    }
}

ON_SSQ_SYSTEM_EVENTNPCid 89🟢 высокая

событие системы Seven Signs

Срабатывает при наступлении события подсистемы Seven Signs (SSQ). Движок заполняет: ask — раздел меню/под-запрос; reply — код ответа/выбор.

Значения reply: reply (L2Server SSQSystem, глобальное событие Seven Signs): 1 — событие НАЧАЛОСЬ (OnEventStart), 0 — ЗАКОНЧИЛОСЬ (OnEventEnd). ask/1-е поле = тип печати (=1).

Пример использования

EventHandler ON_SSQ_SYSTEM_EVENT( talker, ask, reply )
{
    if ( ask == 1 && reply == 1 ) {
        EffectMusic( myself.sm, 0, "SSQ_Neutral_01" );
        BroadcastSystemMessage( myself.sm, 0, 1210 );
    } else
    if ( ask == 1 && reply == 0 ) {
        EffectMusic( myself.sm, 0, "SSQ_Neutral_01" );
        BroadcastSystemMessage( myself.sm, 0, 1211 );
    } else
    if ( ask == 3 && reply == 1 ) {
        BroadcastSystemMessage( myself.sm, 0, 1218 );
        if ( GetSSQWinner( ) == 1 ) {
            EffectMusic( myself.sm, 0, "SSQ_Dusk_01" );
        } else {
            if ( GetSSQWinner( ) == 2 ) {
                EffectMusic( myself.sm, 0, "SSQ_Dawn_01" );
            }
        }
        if ( GetSSQSealOwner( 1 ) == 2 ) {
    // ... (полное тело опущено)
}

DELETE_PREVIOUS_OLYMPIAD_POINT_RETURNEDNPCid 96🟢 высокая

результат сброса прошлых очков Олимпиады

Срабатывает как ответ на запрос удаления накопленных ранее очков Олимпиады. Движок заполняет: talker — игрок; ask — раздел меню/под-запрос; reply — код ответа/выбор.

Инициируется: DeletePreviousOlympiadPoint (см. NASC_FUNCTIONS).

Пример использования

EventHandler DELETE_PREVIOUS_OLYMPIAD_POINT_RETURNED(talker, ask, reply, i0, i1)
{
    i1 = 0;
    if (reply != 0)
    {
        if (talker.hero_type == @HERO_WAITING || talker.hero_type == @HERO_ACTIVE)
        {
            i1 = 300;
        }
        if (ask > 1000)
        {
            i0 = (1000 + i1) * 1000;
        }
        else
        {
            i0 = (ask + i1) * 1000;
        }
        GiveItem1(talker, OlympiadGiveItems, i0);
        AddLogEx(1, talker, ask, i0);
    }
}

LET_IN_USER_PVP_MATCHNPCid 144🟢 высокая

допуск игрока в PvP-матч

Срабатывает при допуске игрока к участию в PvP-матче. Движок заполняет: talker — игрок.

Пример использования

EventHandler LET_IN_USER_PVP_MATCH( talker, i0, party0 )
{
    if (talker.transformID == 260 || talker.transformID == 8 || talker.transformID == 9) {
        Dispel(talker, Skill_GetAbnormalType(55181313));
    }
    party0 = GetParty(talker);
    if (IsNullParty(party0) == 0) {
        ShowPage(talker, "cratae_teleport_npc007.htm");
        UnregisterUserPVPMatch(talker);
    } else {
        if (talker.instant_zone_id > 0) {
            UnregisterUserPVPMatch(talker);
        } else {
            if (talker.level >= 70 && talker.level <= 75) {
                i0 = Rand(100);
                if (i0 < 20) {
                    InstantTeleport(talker, -87247, -16391, -8320);
                } else
                if (i0 < 40) {
                    InstantTeleport(talker, -87159, -16594, -8320);
    // ... (полное тело опущено)
}

REGISTER_USER_PVP_MATCH_RESULTNPCid 139🟢 высокая

результат регистрации игрока в PvP-матче

Срабатывает как ответ на запрос регистрации игрока в PvP-матче. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply (L2Server NpcRegisterUserPVPMatch → RegisterUser): 0 — успех; 1 — нет активного матча нужного типа; 8 — матч переполнен (25 участников); 10 — игрок не в онлайне; 12/13/14 — коды проверки условий (из матч-объекта).

Инициируется: RegisterUserPVPMatch (см. NASC_FUNCTIONS).

Пример использования

EventHandler REGISTER_USER_PVP_MATCH_RESULT( talker, reply )
{
    if (reply == 0) {
        ShowPage(talker, "cratae_teleport_npc009.htm");
    } else
    if (reply == 1) {
    } else
    if (reply == 8) {
        ShowPage(talker, "cratae_teleport_npc005.htm");
    } else
    if (reply == 10) {
    } else
    if (reply == 12) {
    } else
    if (reply == 13) {
        ShowPage(talker, "cratae_teleport_npc007.htm");
    } else
    if (reply == 14) {
        ShowPage(talker, "cratae_teleport_npc011.htm");
    }
}

REGISTER_USER_RESURRECTION_TOWER_RESULTNPCid 141🟢 высокая

результат регистрации у башни воскрешения

Срабатывает как ответ на запрос регистрации игрока у башни воскрешения. Движок заполняет: i0 — целое (i0); reply — код ответа/выбор.

Значения reply: reply (L2Server NpcRegisterUserResurrectionTower): 0 — нет матча/resurrection-NPC (fail); ненулевой — ok.

Инициируется: RegisterUserResurrectionTower (см. NASC_FUNCTIONS).

Пример использования

EventHandler REGISTER_USER_RESURRECTION_TOWER_RESULT( reply )
{
    if (reply == 0) {
    } else {
        if (reply == 1) {
        }
    }
}

GET_RANK_USER_PVP_MATCH_RESULTNPCid 143🟢 высокая

результат запроса ранга игрока в PvP-матче

Срабатывает как ответ на запрос получения ранга игрока в PvP-матче. Движок заполняет: talker — игрок; reply — код ответа/выбор.

Значения reply: reply (L2Server NpcGetRankUserPVPMatch): 0 — нет матча/записи; 1..5 — ранг игрока (сырое поле record-board).

Инициируется: GetRankUserPVPMatch (см. NASC_FUNCTIONS).

Пример использования

EventHandler GET_RANK_USER_PVP_MATCH_RESULT( talker, reply, i0, i4, i5, h0 )
{
    if (myself.i_ai3 <= 25 && myself.i_ai3 >= 21) {
        if (reply == 1) {
            i4 = 100;
        } else {
            if (reply == 2) {
                i4 = 80;
            } else {
                if (reply == 3) {
                    i4 = 60;
                } else {
                    if (reply == 4) {
                        i4 = 40;
                    } else {
                        if (reply == 5) {
                            i4 = 20;
                        } else {
                            if (reply > 5) {
                                i4 = 10;
    // ... (полное тело опущено)
}

KILLED_USER_PVP_MATCH_RESULTNPCid 142🟢 высокая

фиксация убийства в PvP-матче

Срабатывает при фиксации убийства игрока в ходе PvP-матча. Движок заполняет: talker — игрок; attacker — атакующий; reply — код ответа/выбор.

Значения reply: reply (L2Server NpcAddKillPointUserPVPMatch): reply-пакета НЕТ — обработчик только начисляет kill-point и пишет лог; числа успех/отказ не отдаёт.

Пример использования

EventHandler KILLED_USER_PVP_MATCH_RESULT( talker, attacker, reply, i0, c0 )
{
    SetAsNull(c0);
    if (reply == 0) {
        i0 = pc_point;
    } else {
        if (reply == 1) {
            i0 = 1;
        }
    }
    if (talker.is_pc == 1) {
        if (attacker.is_pc == 1) {
            c0 = attacker;
        } else {
            if (attacker.summon_type == 1) {
                c0 = attacker.master;
            }
        }
        if (IsNullCreature(c0) == 0) {
            AddKillPointUserPVPMatch(c0, i0);
    // ... (полное тело опущено)
}

START_USER_PVP_MATCH_RESULTNPCid 145🟢 высокая

старт PvP-матча

Срабатывает при старте PvP-матча. Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример использования

EventHandler START_USER_PVP_MATCH_RESULT( maker0 )
{
    if ( myself.i_ai0 == 1 ) {
    } else {
        myself.i_ai0 = 1;
        maker0 = GetNpcMaker( cratae_enter_name );
        if ( IsNull( maker0 ) == @FALSE ) {
            SendMakerScriptEvent( maker0, 2114002, 0, 0 );
        }
        if ( nType == 70 ) {
            maker0 = GetNpcMaker( maker_name_70 );
            if ( IsNull( maker0 ) == @FALSE ) {
                SendMakerScriptEvent( maker0, 2114002, 0, 0 );
            }
        } else {
            if ( nType == 75 ) {
                maker0 = GetNpcMaker( maker_name_75 );
                if ( IsNull( maker0 ) == @FALSE ) {
                    SendMakerScriptEvent( maker0, 2114002, 0, 0 );
                }
    // ... (полное тело опущено)

END_USER_PVP_MATCH_RESULTNPCid 147🟢 высокая

завершение PvP-матча

Срабатывает при завершении PvP-матча. Движок заполняет: c0 — существо (c0); c1 — существо (c1); c2 — существо (c2); c3 — существо (c3); c4 — существо (c4).

Пример использования

EventHandler END_USER_PVP_MATCH_RESULT( maker0 )
{
    if ( myself.i_ai0 == 0 ) {
    } else {
        myself.i_ai0 = 0;
        maker0 = GetNpcMaker( cratae_enter_name );
        if ( IsNull( maker0 ) == @FALSE ) {
            SendMakerScriptEvent( maker0, 1717006, 0, 0 );
        }
        if ( nType == 70 ) {
            maker0 = GetNpcMaker( maker_name_70 );
            if ( IsNull( maker0 ) == @FALSE ) {
                SendMakerScriptEvent( maker0, 1717006, 0, 0 );
            }
        } else {
            if ( nType == 75 ) {
                maker0 = GetNpcMaker( maker_name_75 );
                if ( IsNull( maker0 ) == @FALSE ) {
                    SendMakerScriptEvent( maker0, 1717006, 0, 0 );
                }
    // ... (полное тело опущено)

WITHDRAW_USER_PVP_MATCH_RESULTNPCid 146🟢 высокая

выход игрока из PvP-матча

Срабатывает при выходе/отзыве игрока из PvP-матча. Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример:

EventHandler WITHDRAW_USER_PVP_MATCH_RESULT( )

REGISTER_PVP_MATCH_RESULTNPCid 130🟢 высокая

регистрация на PvP-матч

Срабатывает при обработке заявки на участие в PvP-матче. Движок заполняет: talker — игрок; reply — код ответа/выбор; i0 — целое (i0); i1 — целое (i1); i2 — целое (i2); i3 — целое (i3); i4 — целое (i4).

Значения reply: reply (L2Server NpcRegisterPVPMatch): в этой сборке числового кода НЕТ — пакет несёт эхо id + список зарегистрированных партий (наблюдаемые в скриптах 0..10 этим обработчиком не порождаются).

Пример использования

EventHandler REGISTER_PVP_MATCH_RESULT( talker, reply, i0, i1, i2, i3, i4, i5, i6, c0, party0, party1, fhtml0, fhtml1 )
{
    if (reply == 0) {
        ShowPage(talker, "kerthang_manager014.htm");
        myself.i_ai0 = i0;
        myself.i_ai1 = i1;
        myself.i_ai2 = i2;
        myself.i_ai3 = i3;
        myself.i_ai4 = i4;
        if (myself.i_ai0 > 0 && myself.i_ai1 > 0 && myself.i_quest0 == 0) {
            myself.i_quest0 = 1;
            myself.i_quest3 = 1;
            party0 = GetPartyFromID(myself.i_ai0);
            party1 = GetPartyFromID(myself.i_ai1);
            AddTimerEx( 1002, ((3 * 60) * 1000) );
            AddTimerEx( 1008, (60 * 1000) );
            if (IsNullParty(party0) == 0) {
                i6 = party0.member_count;
                for (i5 = 0; i5 < i6; i5 = i5 + 1)
                {
    // ... (полное тело опущено)
}

START_PVP_MATCH_RESULTNPCid 132🟢 высокая

старт PvP-матча

Срабатывает при старте PvP-матча. Движок заполняет: reply — код ответа/выбор; i0 — целое (i0); i1 — целое (i1).

Значения reply: reply (L2Server NpcStartPVPMatch → CPVPMatchSystem::StartMatch): 0 — матч стартовал (успех); 1 — не стартовал.

Пример использования

EventHandler START_PVP_MATCH_RESULT(reply, i0, i1, i2, i3, i4, i5, i6, i7, party0, party1, c0, maker0, h0)
{
    if (debug_mode)
    {
        Say("* START *");
    }
    myself.i_ai0 = i0;
    myself.i_ai1 = i1;
    party0 = GetPartyFromID(i0);
    party1 = GetPartyFromID(i1);
    if (IsNullParty(party0) == @FALSE)
    {
        if (debug_mode)
        {
            Say("START : party0 is not null. [OK]");
        }
    }
    if (IsNullParty(party1) == @FALSE)
    {
        if (debug_mode)
    // ... (полное тело опущено)
}

END_PVP_MATCH_RESULTNPCid 133🟢 высокая

завершение PvP-матча

Срабатывает при завершении PvP-матча. Движок заполняет: i0 — целое (i0); i1 — целое (i1); i2 — целое (i2); i3 — целое (i3); i4 — целое (i4); i5 — целое (i5).

Значения reply: reply (L2Server NpcEndPVPMatch): числового кода нет — эхо + список партий (EndMatch вызывается безусловно).

Пример использования

EventHandler END_PVP_MATCH_RESULT( i0, i1, i2, i3, i4, i5, i6, i7, c0, party0 )
{
    myself.i_ai0 = i0;
    myself.i_ai1 = i1;
    myself.i_ai2 = i2;
    myself.i_ai3 = i3;
    myself.i_ai4 = i4;
    myself.i_quest1 = i5;
    myself.i_quest0 = 5;
    AddTimerEx( 1003, (20 * 1000) );
    AddTimerEx(1004, 5000);
    party0 = GetPartyFromID(myself.i_ai0);
    if (IsNullParty(party0) == 0) {
        i6 = party0.member_count;
        for (i7 = 0; i7 < i6; i7 = i7 + 1)
        {
            c0 = GetMemberOfParty(party0, i7);
            if (IsNullCreature(c0) == 0) {
                Dispel(c0, Skill_GetAbnormalType(@s_entry_for_game1));
            }
    // ... (полное тело опущено)
}

ON_AIRSHIP_EVENTNPCid 167🟢 высокая

событие воздушного корабля

Срабатывает при изменении состояния воздушного корабля (airship). Движок заполняет: state — состояние корабля (см. ниже).

Значения state — фаза рейса корабля (подтверждено примером ниже и текстами объявлений
fstring 1800219-1800223):
0 прибыл в порт назначения (объявление «прибыл, отправление через 1 мин»)
1 отправляется в рейс (объявление «отправляется»)
2 вызван/подан (объявление «Летающий Корабль вызван, взлёт через 5 мин»)
В собранных скриптах встречаются значения 0, 1, 2; иные фазы (если есть) не наблюдались.

Пример использования

EventHandler ON_AIRSHIP_EVENT(state, i0, i1, i2, i3, i4, c0)
{
    if (state == 0) {
        if (airport_ID == 1) {
            Shout(MakeFString(1800222, "", "", "", "", ""));
        } else {
            if (airport_ID == 3) {
                Shout(MakeFString(1800220, "", "", "", "", ""));
            }
        }
        myself.i_ai0 = 1;
    } else {
        if (state == 1) {
            if (airport_ID == 1) {
                Shout(MakeFString(1800223, "", "", "", "", ""));
            } else {
                if (airport_ID == 3) {
                    Shout(MakeFString(1800221, "", "", "", "", ""));
                }
            }
    // ... (полное тело опущено)
}

DELETE_OLYMPIAD_TRADE_POINT_RETURNEDNPCid 97🟢 высокая

возврат удаления олимпийских очков обмена

Приходит как ответ на запрос удаления/списания олимпийских очков обмена. Движок заполняет: talker — игрок; ask — раздел меню/под-запрос; reply — код ответа/выбор.

Инициируется: DeleteOlympiadTradePoint (см. NASC_FUNCTIONS).

Пример использования

EventHandler DELETE_OLYMPIAD_TRADE_POINT_RETURNED( talker, ask, reply, i0, i1, i2, i3 )
{
    i1 = 0;
    if ( reply != 0 && ask > 0 ) {
        i2 = GetDateTime(0,3); i3 = GetDateTime(0,4);

        if ( talker.hero_type == 1 || talker.hero_type == 2 ) { i1 = 100; }
        i0 = ( ( ask + i1 ) * 500 ); // сумма за рейтинг и за геройство не должна давать больше 100.000

        AddLogEx( 1, talker, ask, i0 );
        GiveItem1( talker, @olympiad_token, i0 );

        AddScriptLog( 2, ":: Curr Time ["+IntToStr( i2 ) + ":" + IntToStr( i3 )+"] tp="+IntToStr(ask)+" hero="+IntToStr(i1)+" token="+IntToStr(i0) );
    }
}

GET_PLAYING_USER_COUNTNPCid 171🟡 средняя

запрос числа играющих

Приходит как ответ на запрос функции GetPlayingUserCount() (сетевой запрос к L2Server, опкод 230): сервер возвращает число играющих. Движок заполняет i0 — количество игроков онлайн. Фабрика события есть в сборке CT2.3, в CT26-сборке отсутствует.

Связанная функция: GetPlayingUserCount (см. NASC_FUNCTIONS).

Пример использования

EventHandler GET_PLAYING_USER_COUNT( i0 )
{
    myself.i_ai2 = ((i0 * 80) / 100);
    if (i0 == 1) { myself.i_ai2 = 1; }
}

MG_GET_UNRETURNED_POINT_RETURNEDNPCid 102🟢 высокая

возврат невозвращённых очков (MG)

Приходит как ответ с количеством невозвращённых очков подсистемы MG (мини-игра / monster gladiator). Движок заполняет: talker — игрок; reply — код ответа/выбор.

Инициируется: MG_GetUnreturnedPoint (см. NASC_FUNCTIONS).

Пример использования

EventHandler MG_GET_UNRETURNED_POINT_RETURNED(talker, reply)
{
    if (reply > 0)
    {
        ShowPage(talker, "messenger_yetti019.htm");
        GiveItem1(talker, @hs_agit_war_joining_certificate, reply);
    }
    else
    {
        ShowPage(talker, "messenger_yetti020.htm");
    }
}

OLYMPIAD_MATCH_RESULT_EVENTNPCid 184🟢 высокая

результат олимпийского матча

Срабатывает с результатом олимпийского поединка. Движок заполняет: talker — игрок; reply — итог боя (см. ниже); i0 — тип правил боя (см. ниже).

Значения reply — итог боя: 0 — поражение, 1 — победа, 2 — ничья (enum MatchResultType,
main-server). Победа = 1 согласована во всех источниках. Комментарий автора этого скрипта
даёт обратный порядок поражения/ничьи (0 — ничья, 2 — поражение), но он же перевернул и i0
(доказанно ошибочно, см. ниже), поэтому его версии reply доверять не стоит — берём main-server.

Значения i0 — тип правил матча (enum GameRuleType, L2Server; доказано таблицей
g_anTeamMembersNumber = {3, 1, 1}): 0 — командный (3×3), 1 — внеклассовый 1×1 (по умолчанию),
2 — классовый 1×1. Порядок независимо подтверждён примером в ON_OLYMPIAD_GAME_PREPARED
(select(i0): 0->team, 1->classless, 2->class). Комментарий автора ЭТОГО скрипта
(0 — классовый, 2 — командный) перевёрнут и ошибочен.

Пример использования

EventHandler OLYMPIAD_MATCH_RESULT_EVENT(talker, ask, reply, i0)    // reply: 0-ничья, 1-победа, 2-поражение.     i0: 0-классовый, 1-внеклассовый, 2-командный
{
    /* Изменить начисление Olympiad Token
    За победу: 1000 шт.
    За проигрыш: 500 шт.
    За ничью: 100 шт.
    */
    select (reply)
    {
        case 0: { GiveItem1( talker, @olympiad_token, 100 ); break; }    // Ничья
        case 1: { GiveItem1( talker, @olympiad_token, 1000 ); break; }    // Победа
        case 2: { GiveItem1( talker, @olympiad_token, 500 ); break; }    // Поражение
    }
    if (HaveMemo(talker, @olympiad_begins) == @TRUE && GetMemoState(talker, @olympiad_begins) == 1)
    {
        if (GetMemoStateEx(talker, @olympiad_begins, 1) == 9)
        {
            SetMemoStateEx(talker, @olympiad_begins, 1, GetMemoStateEx(talker, @olympiad_begins, 1) + 1);
            GiveItem1(talker, @q511_olympiad_mark02, 1);
            SetMemoState(talker, @olympiad_begins, 2);
    // ... (полное тело опущено)

BLOCK_UPSET_STARTEDNPCid 157🟢 высокая

начало переворота блока

Срабатывает при старте фазы «переворота» блока (block checker / упавшие блоки в мини-игре). Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример:

EventHandler BLOCK_UPSET_STARTED( )

BLOCK_UPSET_FINISHEDNPCid 158🟢 высокая

завершение переворота блока

Срабатывает при завершении фазы «переворота» блока (block checker). Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример:

EventHandler BLOCK_UPSET_FINISHED( )

CLEFT_STATE_CHANGEDNPCid 156🟢 высокая

смена состояния (Cleft)

Срабатывает при изменении состояния события Cleft. Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример использования

EventHandler CLEFT_STATE_CHANGED( maker0, i0, i1 )
{
    select ( GetCleftState() ) {
        case 1: {
            maker0 = GetNpcMaker(StarStoneMakerName0);
            if (IsNull(maker0) == 0) {
                SendMakerScriptEvent(maker0, 1325001, 0, 0);
            }
            maker0 = GetNpcMaker(StarStoneMakerName1);
            if (IsNull(maker0) == 0) {
                SendMakerScriptEvent(maker0, 1325001, 0, 0);
            }
            maker0 = GetNpcMaker(StarStoneMakerName2);
            if (IsNull(maker0) == 0) {
                SendMakerScriptEvent(maker0, 1325001, 0, 0);
            }
            maker0 = GetNpcMaker(StarStoneMakerName3);
            if (IsNull(maker0) == 0) {
                SendMakerScriptEvent(maker0, 1325001, 0, 0);
            }
    // ... (полное тело опущено)

CREATE_SANTA_TO_WINNERNPCid 169🟢 высокая

выдача Санты победителю

Срабатывает для создания/выдачи новогоднего NPC «Санта» победителю события. Движок заполняет: target — цель.

Пример использования

EventHandler CREATE_SANTA_TO_WINNER( target, i0 )
{
    if (IsNullCreature(target) == 0) {
        i0 = target.instant_zone_id;
        if (target.instant_zone_id == 0) {
            CreateOnePrivateEx( @xmas_santa, "ai_event_xmas_giver_santa", 0, 0, FloatToInt( (target.x - 50 + Rand( 100 )) ), FloatToInt( (target.y - 50 + Rand( 100 )) ), FloatToInt( (target.z + 10) ), (GetDirectionToTarget( target ) * 182), GetIndexFromCreature( target ), 0, 0 );
        }
    }
}

REGISTER_RESURRECTION_TOWER_RESULTNPCid 136🟢 высокая

результат регистрации башни воскрешения

Приходит как результат регистрации башни воскрешения. Движок заполняет: i0 — целое (i0); reply — код ответа/выбор.

Значения reply: reply (L2Server NpcRegisterResurrectionTower): 0 — регистрация не удалась (нет PVP-матча по NPC); ненулевой (1…) — результат матч-объекта (успех/детальный код).

Инициируется: RegisterResurrectionTower (см. NASC_FUNCTIONS).

Пример:

EventHandler REGISTER_RESURRECTION_TOWER_RESULT( )

UNREGISTER_PVP_MATCH_RESULTNPCid 131🟢 высокая

отмена регистрации на PvP-матч

Срабатывает при снятии заявки на участие в PvP-матче. Движок заполняет: talker — игрок; i0 — целое (i0); i1 — целое (i1); i2 — целое (i2); i3 — целое (i3); i4 — целое (i4); i5 — целое (i5).

Значения reply: reply (L2Server NpcUnregisterPVPMatch): числового кода нет — эхо id + список партий.

Инициируется: UnregisterPVPMatch (см. NASC_FUNCTIONS).

Пример использования

EventHandler UNREGISTER_PVP_MATCH_RESULT( talker, i0, i1, i2, i3, i4, i5, i6, i7, c0, party0, party1 )
{
    myself.i_ai0 = i0;
    myself.i_ai1 = i1;
    myself.i_ai2 = i2;
    myself.i_ai3 = i3;
    myself.i_ai4 = i4;
    myself.i_quest1 = i5;
    party0 = GetPartyFromID(myself.i_ai0);
    party1 = GetPartyFromID(myself.i_ai1);
    if (myself.i_quest2 == 1) {
        if (IsNullParty(party0) == 0) {
            i6 = party0.member_count;
            for (i7 = 0; i7 < i6; i7 = i7 + 1)
            {
                c0 = GetMemberOfParty(party0, i7);
                if (IsNullCreature(c0) == 0) {
                    ShowOnScreenMsgStr(c0, 2, 0, 0, 0, 1, 0, 10000, 0, MakeFString(1800106, "", "", "", "", ""));
                }
            }
    // ... (полное тело опущено)
}

ON_OLYMPIAD_FIELD_CHANGEDNPCid 173🟢 высокая

смена состояния олимпийской арены

Срабатывает при смене фазы олимпийской арены. Движок заполняет:
attacker, c0, c1 победители (до трёх)
victim, c2, c3 проигравшие (до трёх)
event_id номер арены
action_id тип правил боя (см. ниже)
state новая фаза арены (см. ниже)

Значения action_id — тип правил матча (enum GameRuleType, L2Server; доказано таблицей
g_anTeamMembersNumber = {3, 1, 1}: у типа 0 в команде 3 бойца, у 1 и 2 — по одному):
0 gamerule_team командный бой (3×3)
1 gamerule_nonclassbased обычный бой 1×1, без ограничения класса (по умолчанию)
2 gamerule_classbased классовый бой 1×1
(3 = gamerule_max — служебная граница массива, не значение матча.)
О расхождении этого порядка с комментарием одного из скриптов — см. OLYMPIAD_MATCH_RESULT_EVENT.

Значения state — фаза арены. Это конечный автомат из семи состояний
(L2Server, диспетчер COlympiadField::TimerExpired):
0 Idle арена свободна; очистка, подсчёт штрафов
1 Prepare подготовка, сброс счётчиков
2 Wait ожидание и сбор бойцов
3 Start старт боя
4 Process бой идёт
5 Finish бой завершён, подсчёт
6 Clear зачистка арены

В NPC (NpcServer::Send, опкод 109 из COlympiadField::ChangeStatus) уходят только
переходы Wait и Process; попутно в SharedOlympiadInfo по номеру арены пишется флаг
игры (1 = Wait, 2 = Process, 0 = Finish) вместе с лидерами команд и типом правил,
откуда NPC-сторона и восстанавливает состав attacker/victim/c0..c3. Точный литерал,
приходящий в state (полный enum 0..6 либо флаг 0/1/2), определяет фабрика опкода 109
на стороне L2NPC; здесь в IDA загружен L2Server. Наиболее вероятно state = 0 (бой
завершён) / 1 (ожидание) / 2 (бой идёт).

Пример использования

EventHandler ON_OLYMPIAD_FIELD_CHANGED(attacker, victim, state, action_id, i2, c0, c1, c2, c3)
{
    if (is_quest != 1) {
        return;
    }
    if (debug == 1) {
        if (IsNullCreature(attacker) == 0) {
            Say("attacker");
        } else {
            Say("attacker");
        }
        if (IsNullCreature(victim) == 0) {
            Say("victim");
        } else {
            Say("victim");
        }
        if (IsNullCreature(c0) == 0) {
            Say("c0");
        } else {
            Say("c0");
    // ... (полное тело опущено)
}

INACTIVE_CHARACTER_RETURNEDNPCid 181🟢 высокая

возврат неактивного персонажа

Приходит как ответ с данными неактивного (отошедшего/AFK) персонажа. Движок заполняет: target — найденный неактивный персонаж; i0 — секунд неактивности.

Пример использования

EventHandler INACTIVE_CHARACTER_RETURNED( i0, target )
{
    if ( TeamEventGetStatus( my_Event ) == @TEAMEVENT_STATUS_BATTLE ) {
        if ( i0 > ( checkInnactiveCharPeriod*60 ) ) {
            if ( logEnable > 0 ) { AddScriptLog( 2, ":: Detect AFK : "+target.name+" ( "+IntToStr( i0 )+" )" ); }
            TeamRemoveMember( target );
            target.param3 = 123;
        }
    }
}

Жизненный цикл и БД

15 событий

MY_DYINGNPCid 9🟢 высокая

NPC умирает: последняя обработка перед смертью

Срабатывает в момент гибели NPC, прямо перед его удалением. Движок заполняет: last_attacker — добивший (у саммона — хозяин); lparty — группа добившего; lmpcc — альянс добившего. Списки дропа always_list/random1_list/code_info скрипт создаёт сам (AllocCodeInfoList).

Пример использования

EventHandler MY_DYING( target, i0, i2, i3, i4, i5, i6, i9, i10, i11, last_attacker, lparty, random1_list, always_list, code_info, lmpcc, aparty )
{
    always_list = AllocCodeInfoList();
    random1_list = AllocCodeInfoList();
    target = last_attacker;
    if (IsNull(lparty) == 0) {
        for ( i9 = 0; i9 < lparty.member_count; ++i9 ) {
            target = GetMemberOfParty(lparty, i9);
            if (HaveMemo( target, @put_the_power_in_your_blade ) == 1) {
                always_list.SetInfo(0, target);
            }
        }
    } else {
        if (HaveMemo( target, @put_the_power_in_your_blade ) == 1) {
            always_list.SetInfo(0, target);
        }
    }

    target = last_attacker;
    if ( IsNull( lmpcc ) == 0 ) {
    // ... (полное тело опущено)
}

CREATEDNPCid 12🟢 высокая

NPC заспавнен и инициализируется

Срабатывает при создании/инициализации NPC на сервере. Движок заполняет: reply — флаг: данные загружены из БД.

Значения reply (по реальным скриптам): reply = nIsDbLoaded: 0 — данные НЕ из БД (первый спавн), 1 — загружен из БД.

Инициируется: спавн NPC (Spawn/CreateOnePrivate*) (см. NASC_FUNCTIONS).

Пример использования

EventHandler CREATED( reply )
{
    if ( reply == 0 ) {
        myself.i_ai0 = 0;
        SetDBValue( myself.sm, 0 );
    } else {
        myself.i_ai0 = myself.sm.db_value;
    }

    AddTimerEx( 2002, ( 60 * 1000 ) );
}

ON_NPC_DELETEDMAKERid 1🟢 высокая

спавнер узнал об удалении NPC

Срабатывает в спавнере, когда удаляется NPC принадлежащего ему дефайна. Движок заполняет: deleted_def — deleted_def; deleted_npc — deleted_npc; reply — код ответа/выбор; died — died.

Инициируется: Despawn/удаление особи (см. NASC_FUNCTIONS).

Пример использования

EventHandler ON_NPC_DELETED(deleted_def, died, i0, i1, maker0, reply, c0)
{
    if (died == 0) {
        myself.i_ai0 = 0;
    } else {
        myself.i_ai0 = 1;
    }
    if (myself.i_ai0 == 1 && reply == 0) {
        maker0 = GetNpcMaker(myself.name);
        SendMakerScriptEvent(maker0, 1001, 0, 0);
    }
}

ON_STARTMAKERid 0🟢 высокая

старт спавнера

Срабатывает при запуске спавнера. Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример использования

EventHandler ON_START( i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, def0 )
{
    myself.i_ai0 = 0;
    super;
}

ON_ALL_NPC_DELETEDMAKERid 2🟢 высокая

удалены все NPC спавнера

Судя по имени, срабатывает в спавнере, когда удалены все порождённые им NPC. Своих полей событие не передаёт — движок заполняет только myself (сам NPC).

Пример использования

EventHandler ON_ALL_NPC_DELETED(maker0, myself, _choiceN, _code, _from_choice)
{
    maker0 = GetNpcMaker(maker_name);
    if (IsNull(maker0) == 0) {
        SendMakerScriptEvent(maker0, 1001, 0, 0);
    }
}

ON_NPC_CREATEDMAKERid 6🟢 высокая

спавнер породил NPC

Срабатывает в спавнере при порождении нового NPC. Движок заполняет: created_def — created_def; created_npc — created_npc.

Инициируется: Spawn2/SpawnEx (см. NASC_FUNCTIONS).

Пример использования

EventHandler ON_NPC_CREATED(created_npc, created_def)
{
    if (myself.enabled == 0 || (myself.i_ai4 == 0 && created_def != GetSpawnDefine(1)))
    {
        created_npc.Despawn();
    }
}

ON_DB_NPC_INFOMAKERid 4🟢 высокая

пришли данные NPC из БД

Судя по имени и аргументам, доставляет загруженную из базы информацию по NPC. Движок заполняет: loaded_def — loaded_def; record0 — record0.

Пример использования

EventHandler ON_DB_NPC_INFO(loaded_def, record0, i0)
{
    if (record0.is_alive) {
        if (AtomicIncreaseTotal(loaded_def, 1, 1)) {
            loaded_def.SetDBLoaded(1);
            loaded_def.SpawnEx(1, 0, record0.x, record0.y, record0.z, 0, record0.hp, record0.mp, record0.db_value);
        }
    }
}

ON_DBCOOKIE_LOADEDNPCid 178🟢 высокая

загружены сохранённые данные NPC из БД

Срабатывает, когда подтянуты ранее сохранённые в базе данные (db-cookie) этого NPC. Движок заполняет: talker — игрок; script_event_arg1 — id группы; script_event_arg2 — размер группы.

Пример использования

EventHandler ON_DBCOOKIE_LOADED( talker, script_event_arg1, script_event_arg2, i0, i1, i2, i3, i4 )
{
    if ( script_event_arg1 == CookieGroup ) {
        if ( script_event_arg2 < 3 ) { // создаем список квестов
            i0 = @march2023_event1; i1 = @march2023_event2;
            i2 = @march2023_event3; i3 = @march2023_event4;

            if ( Rand(100) < 50 ) { i4 = i0; i0 = i2; i2 = i4; }
            if ( Rand(100) < 50 ) { i4 = i1; i1 = i3; i3 = i4; }
            if ( Rand(100) < 50 ) { i4 = i0; i0 = i1; i1 = i4; }
            if ( Rand(100) < 50 ) { i4 = i1; i1 = i2; i2 = i4; }
            if ( Rand(100) < 50 ) { i4 = i2; i2 = i3; i3 = i4; }
            if ( Rand(100) < 50 ) { i4 = i3; i3 = i4; i4 = i4; }

            // сохраняем список квестов
            SetDbCookieInt( talker, CookieGroup, 1, i0 );
            SetDbCookieInt( talker, CookieGroup, 2, i1 );
            SetDbCookieInt( talker, CookieGroup, 3, i2 );

            i4 = i0; // текущий квест
    // ... (полное тело опущено)
}

DIE_SETNPCid 162🟢 высокая

установлено состояние смерти

Срабатывает при установке/фиксации состояния смерти у связанного объекта. Движок заполняет: talker — игрок; attacker — атакующий.

Пример использования

EventHandler DIE_SET(myself, talker)
{
    if (talker.alive == @FALSE && talker.is_pc == @TRUE && IsNullCreature(myself.c_ai0) == @FALSE)
    {
        RemoveAllAttackDesire();
        RemoveAllDesire();
        AddTimerEx(p_iTimerDesire, 1 * 1000);
    }
}

GETDBDATA_RETURNEDNPCid 179🟢 высокая

возвращены данные из БД

Срабатывает по приходу ответа на запрос данных из базы (GetDbData). Движок заполняет: i0 — число возвращённых строк.

Куда легли данные (источник — npc-server: CNPCEventFactory.cpp, CNPC.cpp,
CachedNpcPacketHandlers.cpp): само событие несёт ТОЛЬКО i0 = число строк. Сами строки
движок кладёт в поля самого NPC:
myself.db_int_list — id записи (нужен для DelDbDataById)
myself.db_str_list1..10 — 10 столбцов строки
Каждый список хранит один столбец по всем строкам: строка r = myself.db_str_listN.Get(r),
r = 0..i0-1; myself.db_int_list.Get(r) — id r-й записи. Прочие поля объявления обработчика
(i1..i9, s0, s1) — свободные локальные слоты тела, движок их НЕ заполняет (в примере скрипт
сам кладёт туда данные из db_str_list*). Списки перед заполнением НЕ очищаются — при
повторных GetDbData чистить самому.

Инициируется: GetDbData (запрос с 10 строками-фильтрами; ответ — построчно в db_*-списки) (см. NASC_FUNCTIONS).

Пример использования

EventHandler GETDBDATA_RETURNED( i0, i1, i2, i3, i4, i5, i8, i9, s0, s1, fhtml0, talker, c1 )
{
    talker = GetCreatureFromIndex( myself.av_quest0.GetValue() );
    if ( i0 > 0 && IsNullCreature( talker ) == @FALSE ) {
        i9 = myself.av_quest1.GetValue();

        if ( i9 == 0 ) { // получаем награду
            s0 = myself.db_str_list2.Get( 0 ); // тип
            i1 = StrToInt( myself.db_str_list3.Get( 0 ) ); // dbid
            i2 = StrToInt( myself.db_str_list9.Get( 0 ) ); // is_winner
            i3 = StrToInt( myself.db_str_list10.Get( 0 ) ); // is_NOT_rewarded

            if ( talker.dbid == i1 && i2 == 1 && i3 > 0 )  { // совпал char_id,  победитель, награду не выдавали
                talker.param1 = GetDateTime( 0, 6 ); // сегодня игрок обращался.  еще один вариант блокировки лишнего обращения
                // удаляем запись
                DelDbDataById( myself.db_int_list.Get( 0 ) );
                // пишем в базу, что награда взята
                SetDbData( tiat_top_dbname, myself.db_str_list2.Get( 0 ), IntToStr(talker.dbid), talker.name, myself.db_str_list5.Get( 0 ), myself.db_str_list6.Get( 0 ), myself.db_str_list7.Get( 0 ), myself.db_str_list8.Get( 0 ), "1", "-1" );
                AddScriptLog( 2, ":: ("+tiat_top_dbname+") Get Reward: "+talker.name );

    // ... (полное тело опущено)

LOAD_DBSAVING_MAP_RETURNEDNPCid 160🟢 высокая

ответ на загрузку сохранённой карты данных

Срабатывает по приходу ответа на загрузку сохранённого в БД набора данных (карты «ключ→значение»). Движок заполняет: i0 — ключ записи; i1 — значение записи.

Значения: карта хранит пары ключ→значение; каждая загруженная запись приходит отдельным
событием, где i0 — ключ, i1 — сохранённое значение.

Инициируется: LoadDBSavingMap (см. NASC_FUNCTIONS).

Пример использования

EventHandler LOAD_DBSAVING_MAP_RETURNED( i0, i1 )
{
    if (i0 == GM_ID1) {
        myself.i_ai0 = i1;
    }
}

USER_CONNECTEDNPCid 54🟢 высокая

подключение игрока

Срабатывает при подключении (входе) игрока. Движок заполняет: talker — игрок.

Пример использования

EventHandler USER_CONNECTED( talker, i0, i1, i2, i3, i4, i5, i6, i7, i9 )
{
    if ( talker.level < 6 ) {
        if ( myself.GetOneTimeQuestFlag( talker, @tutorial_quest ) != 0 ) {
            return;
        }
        i0 = GetMemoState( talker, @tutorial_quest );
        if ( i0 == -1 ) {
            i0 = 0;
            i1 = 0;
        } else {
            i1 = ( i0 & 255 );
            i0 = ( i0 & 2147483392 );
        }
        select ( i1 ) {
            case 0 : {
                myself.AddTimerEx( ( GetIndexFromCreature( talker ) + 1000000 ), ( 1000 * 10 ) );
                i0 = ( 2147483392 & ( 8388608 | 1048576 ) );
                myself.SetMemoState( talker, @tutorial_quest, ( 1 | i0 ) );
                myself.SetMemoStateEx( talker, @tutorial_quest, 1, -2 );
    // ... (полное тело опущено)
}

WAS_COLLECTEDNPCid 166🟢 высокая

объект собран

Срабатывает, когда объект был собран (например, добываемый ресурс/растение). Движок заполняет: attacker — сборщик; i0 — целое (i0).

Пример использования

EventHandler WAS_COLLECTED( attacker, i1 )
{
    if ( seed_item > 0 ) {
        GiveItem1( attacker, seed_item, Rand(10) + 1 );
    }
}

LEVEL_UPNPCid 159🟢 высокая

повышение уровня

Срабатывает, когда игрок в зоне NPC поднял уровень. Движок заполняет: talker — игрок; reply — достигнутый уровень.

Пример использования

EventHandler LEVEL_UP( i0, i1, reply, talker )
{
    if (reply >= 6 && GetMemoState(talker, @tutorial_quest) <= 5)
    {
        SetMemoState(talker, @tutorial_quest, 6);
    }
    if (reply == 18)    // Mutated Kaneus - Gludio
    {
        if (HaveMemo(talker, @mutation_kanooth_gludio) == @FALSE && GetOneTimeQuestFlag(talker, @mutation_kanooth_gludio) == @FALSE)
        {
            ShowTutorialHTML(talker, "kanooth_gludio.htm");
            ShowOnScreenMsgFStr(talker, 2, 0, 0, 0, 1, 0, 5000, 0, 3603400, _blank, _blank, _blank, _blank, _blank);
            ShowQuestionMark(talker, 10276);
            ShowRadar(talker, -13900, 123822, -3112, @RPT_BOTH);
            SoundEffect(talker, "ItemSound.quest_tutorial");
        }
    }
    else if (reply == 28)    // Mutated Kaneus - Dion
    {
        if (HaveMemo(talker, @mutation_kanooth_dion) == @FALSE && GetOneTimeQuestFlag(talker, @mutation_kanooth_dion) == @FALSE)
    // ... (полное тело опущено)
}

SCENE_STOPPEDid нет🟡 средняя

остановка кат-сцены

Срабатывает, когда завершилась (остановлена) проигрываемая сцена/кат-сцена, запущенная функциями семейства PlayScene/StartScenePlayer. scene_id — идентификатор сцены; creature — связанное существо (для кого играли); maker0 — спавнер; c0, c1, party0 — связанные существа/группа. Отдельной фабрики в разобранных сборках нет — поля по реальному использованию.

Связанная функция: PlayScene / StartScenePlayer* (см. NASC_FUNCTIONS).

Пример использования

EventHandler SCENE_STOPPED(scene_id, i0, maker0, creature, i1, c0, c1, party0)
{
    //
}

Прочее

3 событий

DEBUG_AIid нет🟢 высокая

отладочный обработчик ИИ

Служебный/отладочный обработчик (в исходниках помечен как закомментированный). Движок заполняет: reply — код ответа/выбор; creature — увиденное существо.

Пример использования

EventHandler DEBUG_AI(creature, reply, s0)
{
    if (reply == 1)
    {
        Whisper(creature, "status " + myself.i_ai0);
    }
}

CHECK_REGISTER_USER_RESULTNPCid 137🟢 высокая

результат проверки регистрации игрока

Срабатывает как ответ на проверку факта регистрации игрока (в некоей подсистеме записи). Движок заполняет: i0 — целое (i0); reply — код ответа/выбор.

Значения reply: reply (L2Server NpcCheckRegisterUser): 10 — игрок не онлайн; 11 — нет PVP-матча по уровню игрока; 0/1/3/12..16 — доменные коды матч-объекта (уже зарегистрирован, матч закрыт, не тот статус и т.п.).

Инициируется: CheckRegisterUserPVPMatch (см. NASC_FUNCTIONS).

Пример использования

EventHandler CHECK_REGISTER_USER_RESULT( reply, i0, c0 )
{
    c0 = GetCreatureFromID(i0);
    if (myself.i_ai0 == 1) {
    } else {
        if (GetInventoryInfo( c0, @IPT_CURRENT_SLOT_COUNT ) >= GetInventoryInfo( c0, @IPT_MAX_SLOT_COUNT ) * 0.900000 || GetInventoryInfo( c0, @IPT_CURRENT_WEIGHT ) >= GetInventoryInfo( c0, @IPT_MAX_CARRY_WEIGHT ) * 0.900000) {
            ShowPage(c0, "cratae_teleport_npc006.htm");
        } else

        if (reply == 13) {
            ShowPage(c0, "cratae_teleport_npc007.htm");
        } else
        if (reply == 1) {
        } else
        if (reply == 3) {
            ShowPage(c0, "cratae_teleport_npc008.htm");
        } else
        if (reply == 10) {
        } else
        if (reply == 11) {
    // ... (полное тело опущено)
}

CHECK_REGISTER_PARTY_RESULT2NPCid 135🟢 высокая

проверка регистрации группы (вариант 2)

Срабатывает при проверке возможности/результата регистрации группы (второй вариант проверки). Движок заполняет: i0 — целое (i0); i1 — целое (i1); i2 — целое (i2); i3 — целое (i3).

Значения reply: reply (L2Server NpcCheckRegisterParty) — не одиночный код, а СПИСОК пар (id участника, код) по всем членам группы; код 1 = нет матча, прочее = результат по участнику.

Пример использования

EventHandler CHECK_REGISTER_PARTY_RESULT2( i0, i1, i2, i3, i5, i6, c0, c1, c2, party0, party1 )
{
    party0 = GetPartyFromID(myself.i_ai0);
    party1 = GetPartyFromID(myself.i_ai1);
    if (i1 == 7) {
        party0 = GetPartyFromID(i0);
        if (IsNullParty(party0) == 0) {
            c0 = GetLeaderOfParty(party0);
            i6 = party0.member_count;
            for (i5 = 0; i5 < i6; i5 = i5 + 1)
            {
                c1 = GetMemberOfParty(party0, i5);
                if (IsNullCreature(c1) == 0) {
                    ShowOnScreenMsgStr(c1, 2, 0, 0, 0, 1, 0, 10000, 0, MakeFString(1800081, "", "", "", "", ""));
                }
            }
            if (IsNullCreature(c1) == 0) {
                UnregisterPVPMatch(party0, c0);
            }
        }
    // ... (полное тело опущено)
}

UI, торговля, атомики

3 типов

CAtomicValuetype🟢 высокая

атомарное значение (счётчик/флаг)
В скриптах
поля NPCmyself.av_ai0..1 myself.av_quest0..1
поле комнатыroom0.status

Одно целое, которое читают и меняют атомарно — безопасно, когда одну и ту же ячейку
могут трогать разные потоки/особи (счётчик занятых слотов, флаг состояния). Встречается
как поля самого NPC (myself.av_ai0/av_ai1, myself.av_quest0/av_quest1) и как поле status
у комнаты (room0.status).

Свойства:
.valueтекущее значение (чтение)
Методы:
Exchange(int v)атомарно записать v; вернуть прежнее значение

CFHTMLtype🟢 высокая

буфер диалогового окна
В скриптах
слоты событияfhtml0 fhtml1

Буфер диалогового HTML-окна NPC; в примерах — fhtml0. Его наполняют функциями
FHTML_SetFileName / FHTML_SetStr / FHTML_SetInt / FHTML_SetFStr, затем показывают игроку
функцией ShowFHTML (см. группу FHTML в NASC_FUNCTIONS).

Работа с буфером (функции):
FHTML_SetFileName(fhtml, name)задать html-файл окна
FHTML_SetStr(fhtml, key, s)подставить строку по ключу
FHTML_SetInt(fhtml, key, n)подставить число по ключу
ShowFHTML(talker, fhtml)показать окно игроку

Пример использования

FHTML_SetFileName( fhtml0, fnFeudInfo );
ShowFHTML( talker, fhtml0 );

CBuySellListtype🟢 высокая

список товаров торгового окна
В скриптах
параметр классаBuyList0 SellList0

Список товаров для торгового окна. Задаётся параметром класса (например BuyList0,
SellList0) и содержит позиции магазина. Используется функциями Buy / Sell / ShowBuySell.

Пример использования

ShowBuySell( talker, SellList0, BuyList0, -50 );   // -50 — наценка/скидка, %

NPC, спавнеры, глобальный объект

5 типов

CNPCtype🟢 высокая

сам NPC (myself)
В скриптах
myself
слоты событияnpc0..npc2
слоты мейкераcreated_npc deleted_npc

Класс самого NPC. Это получатель всех функций с пометкой «Класс: NPC» (в коде они
вызываются голым именем, без myself.) и владелец персистентных полей состояния,
которые переживают отдельные события. Полная таблица полей myself.* с пояснениями —
в NASC_LANGUAGE (раздел 6.2); кратко:

Свойства:
.i_ai0..9 / .i_quest0..9целые ячейки состояния AI / квестов
.c_ai0..4 / .c_quest0..4запомненные существа (цель, союзник)
.av_ai0..1 / .av_quest0..1атомарные счётчики (CAtomicValue)
.int_list / .str_listсписки целых / строк
.db_int_list / .db_str_list1..10те же списки, но с сохранением в БД
.sm«сам как существо» (CSharedCreatureData)
.master / .bossхозяин / босс
.top_desire_targetтекущая цель главного желания
.p_stateтекущее физическое действие NPC (только чтение; значения @ACT_* — полный разбор в NASC_ENUMS, раздел ACT)
.start_x .start_y .start_zточка спавна
Методы: сотни NPC-функций справочника NASC_FUNCTIONS (класс NPC) — желания
(AddAttackDesire...), таймеры (AddTimerEx), предметы (GiveItem1) и т.д.

Пример использования

    if ((myself.p_state == @ACT_STAND || myself.p_state == @ACT_SIT || myself.p_state == @ACT_OPENCLOSE) && (myself.sm.hp > (myself.sm.max_hp * 0.400000) && myself.sm.alive != @FALSE)) {

NPC свободен (стоит, сидит или занят дверью), здоров и жив — можно играть
социальный жест или болтать.

CNpcMakerExtype🟢 высокая

спавнер NPC (maker)
В скриптах
слоты событияmaker0 maker1
myself (в скрипте мейкера)

Спавнер NPC. В контексте мейкера это myself; обычный NPC берёт его через GetNpcMaker /
InstantZone_GetNpcMaker / GetMyMaker.

Свойства:
.def_countчисло спавн-дефайнов
.maximum_npcлимит особей
.npc_countживо сейчас
Методы:
GetSpawnDefine(int i)i-й спавн-дефайн (CNpcSpawnDefineEx)
GetSpawnDefineByNick(string) спавн-дефайн по нику
AtomicIncreaseTotal(def, n, step)атомарно изменить плановое число особей дефайна
DoRespawn()выполнить респавн
ResetRespawn()сбросить респавн
RegisterRespawn(time, n, def) поставить респавн
AddTimerEx(int id, int ms)таймер мейкера (ловится в TIMER_FIRED_EX)

Пример использования

def0 = GetSpawnDefineByNick( manager_npc_name );

CNpcSpawnDefineExtype🟢 высокая

спавн-дефайн (строка таблицы спавна)
В скриптах
слоты мейкераdef0 deleted_def loaded_def created_def

Одна строка таблицы спавна мейкера. В примерах — def0, deleted_def, loaded_def.

Свойства:
.totalплановое число особей
.npc_countживо сейчас
.respawn_timeвремя респавна
.respawn_randразброс времени респавна
.nameник дефайна
Методы:
Spawn2(count, respawnTime, respawnRand)заспавнить count особей
SpawnEx(count, mode, x, y, z, heading, hp, mp, dbValue)спавн с полным контролем
Spawn(count, respawnTime)упрощённый спавн
Despawn()снять особей дефайна
SendScriptEvent(int id, a2, a3)послать скрипт-событие своим NPC
RegToRespawnTimer(t)поставить на респавн-таймер
LoadDBNpcInfo(n)загрузить данные NPC из БД
SetDBLoaded(n)пометить как загруженного из БД

Пример использования

def0.Spawn2( def0.total, 0, 0 );     // заспавнить плановое число, без респавна
deleted_def.Spawn2( 1, deleted_def.respawn_time, deleted_def.respawn_rand );

CSpawnDefinetype🟡 средняя (в собранных скриптах используется редко)

запись состояния особи для БД (DBNpcInfo)
В скриптах
слот мейкераrecord0

Снимок состояния конкретной особи для БД-респавна (DBNpcInfo). В скрипте мейкера — слот
record0. Отдельный тип от CNpcSpawnDefineEx: тот описывает строку таблицы спавна, а
CSpawnDefine — сохранённое состояние одной особи (жива ли, где, с каким HP/MP).

Свойства:
.hp .mpздоровье и мана особи
.x .y .zкоординаты
.is_aliveжива ли особь
.death_timeвремя гибели
.db_valueпользовательское значение, сохраняемое в БД

CGlobalObjecttype🟢 высокая

глобальный объект-namespace (gg)
В скриптах
слот событияgg

Глобальный объект-namespace сервера; в скриптах доступен как gg (поле CNPCEvent::gg). На
нём висят «глобальные» функции, не привязанные к конкретному NPC: работа со временем и
случайностью, спавн и поиск существ по индексу, AllocCodeInfoList(), MPCC_GetPartyID,
GetPartyFromID, широковещательные и БД-функции. В большинстве скриптов вызывается неявно,
без префикса gg. — движок сам подставляет получателя gg.

Существа, группы, данные

8 типов

CSharedCreatureDatatype🟢 высокая

существо (базовый дескриптор)
В скриптах
слоты событияtalker attacker victim target creature speller friend commander private member last_attacker c0..c4
поля NPCmyself.sm myself.c_ai0..4 myself.c_quest0..4 myself.master myself.boss myself.top_desire_target

Базовый дескриптор существа. Приходит почти во все обработчики (attacker, talker,
creature, speller) и доступен у самого NPC как myself.sm. Перед чтением полей всегда
проверяют IsNullCreature(c).

Свойства (часто читаемые):
.hp .max_hp .mpтекущее/макс. здоровье, мана
.levelуровень
.nameимя
.pledge_idid клана
.is_pcэто игрок (а не NPC)?
.masterхозяин (для саммонов)
.sm«сам как существо» у NPC (myself.sm)
.dbidid персонажа в БД
.summoner_idid призывателя
.occupation .class_idпрофессия / класс
.npc_class_idкласс NPC
.raceраса существа (id расы; в боевых скриптах сравнивают с параметром класса, напр. SetHateRace == attacker.race)
.residence_idid резиденции (замка/владения), к которой приписан NPC: 0 — не приписан; по нему строят название владения (идиома MakeFString(1001000 + residence_id, ...))
.aliveжив ли
.idпостоянный id
.x .y .zкоординаты
.instant_zone_idid инстанс-зоны
.p_stateтекущее физическое действие; есть и у существа, но в скриптах почти всегда читают myself.p_state. Значения @ACT_* (0 бездействие, 1 стоит, 2 сидит, 3 идёт, 4 атакует, 5 каст, …16) — полный разбор в NASC_ENUMS, раздел ACT
.param1 .param2 .param33 пользовательских слота данных существа. У приватного NPC заполняются последними 3 аргументами CreateOnePrivateEx; NPC читает свои как myself.sm.param1..3. Кладут что угодно: индекс владельца, dbid, тег, координаты

Пример использования

if ( myself.sm.level < 2 ) { return; }    // прочитать поле у самого NPC

CSharedCreatureDataExtype🟠 низкая (состав полей не подтверждён)

расширенные данные существа
В скриптах
слотов нет — только из GetCreatureEx / GetCreatureExFromIndex

Расширенный дескриптор существа. Возвращается функциями GetCreatureEx(c) и
GetCreatureExFromIndex(nIndex). В собранных ai*.nasc вызовов нет, поэтому набор его полей
не подтверждён — см. NASC_DOUBTS.

CSharedItemDatatype🟢 высокая

предмет инвентаря
В скриптах
слоты событияitem item0 item1

Дескриптор предмета инвентаря. Возвращается функцией GetItemData; передаётся в
AddGetItemDesire, IsStackableItem и подобные. Свойства и методы в собранных скриптах
почти не читают напрямую — предмет обычно используют как непрозрачный дескриптор.

CHateInfotype🟢 высокая

запись списка ненависти
В скриптах
слоты событияh0..h4

Одна запись списка ненависти (агро) NPC. Возвращается функциями GetMaxHateInfo,
GetNthHateInfo, GetHateInfoByCreature/...ByIndex. В примерах — обычно h0 (обработчик
держит до пяти: h0..h4). Перед чтением проверяют IsNullHateInfo(h).

Свойства:
.creatureсущество-цель этой записи (CSharedCreatureData)
.hateвеличина ненависти (int) — по ней GetMaxHateInfo(0) ищет цель с максимальной агрессией
.temp0временное значение (int) — показатель для GetMaxHateInfo(1)
Проверка:
IsNullHateInfo(h)запись пуста/невалидна?

Пример использования

h0 = GetMaxHateInfo( 0 );                     // цель с наибольшей ненавистью
if ( IsNullHateInfo( h0 ) == 0 ) {
    if ( IsNullCreature( h0.creature ) == 0 ) {
        MakeAttackEvent( h0.creature, 100, 0 );
    }
}

CSharedPartyDatatype🟢 высокая

группа (party)
В скриптах
слоты событияparty0 party1 aparty lparty

Группа (пати). Возвращается функциями GetParty, GetTopDamageParty; в примерах — party0,
lparty. Состав читают функциями Party_GetCount / Party_GetCreature или
GetMemberOfParty / GetLeaderOfParty. Проверка — IsNullParty(p).

Работа с группой (функции, а не методы объекта):
Party_GetCount(c)число участников группы существа c
Party_GetCreature(p, i)i-й участник группы (CSharedCreatureData)
GetLeaderOfParty(p)лидер группы
IsNullParty(p)группа пуста/невалидна?

Пример использования

i1 = Party_GetCount( talker );    // сколько человек в группе talker'а

CSharedPledgeDatatype🟢 высокая

клан (pledge)
В скриптах
слоты событияpledge0 pledge1

Клан. Возвращается функцией GetPledge. Сведения о клане берут функциями
GetPledgeMemberCount, GetPledgeMoney, HavePledgePower и др. (см. группу Party / Pledge в
NASC_FUNCTIONS).

MPCCDatatype🟢 высокая

командный канал (Command Channel)
В скриптах
слот событияlmpcc (командный канал добившего в MY_DYING)

Командный канал — объединение нескольких групп в рейд. Возвращается функциями GetMPCC(c)
и GetTopDamageMpcc(c). В dat-сигнатурах тип назван CSharedGeneralObjectData. Это же тип
поля события CNPCEvent::lmpcc (командный альянс добившего в MY_DYING).

Свойства:
.mpcc_idid канала
.party_countчисло групп в канале
Методы / функции обхода:
GetParty(int i)i-я группа канала (метод объекта MPCCData)
MPCC_GetPartyID(mpcc_id, i)id i-й группы канала (функция gg)
GetPartyFromID(id)получить группу (CSharedPartyData) по её id

Пример использования

i0 = lmpcc.mpcc_id;                // id командного канала (напр. добившего в MY_DYING)
i2 = MPCC_GetPartyID( i0, i1 );    // id i1-й группы этого канала
party0 = GetPartyFromID( i2 );     // получить саму группу по id

CSharedStaticObjectDatatype🟢 высокая

неподвижный объект мира
В скриптах
слоты событияvictim_so so0

Неподвижный объект мира — дверь, контрольная башня, осадный объект. Это тип полей
события victim_so / so0: по нему бьют или кастуют в событиях STATIC_OBJECT_CLAN_ATTACKED
и STATIC_OBJECT_CLAN_SPELLED. Возвращается функциями работы с дверями и башнями; перед
обращением проверяют IsNull(o).

Списки

7 типов

CIntListtype🟢 высокая

список целых чисел
В скриптах
поля NPCmyself.int_list myself.db_int_list

Список целых. Чаще всего — персистентное поле самого NPC: myself.int_list (обычный) и
myself.db_int_list (сохраняется в БД между рестартами). Также приходит в события как
поле-агрегат int_list / db_int_list. Собственных полей нет — доступ только через методы.

Методы:
GetSize()число элементов (int)
Add(int v)добавить значение в конец
Get(int i)значение по индексу i (int)
RemoveAt(int i)удалить элемент по индексу
Clear()очистить список
SetMaxSize(int n)задать вместимость
GetItemIndex(int v)индекс первого вхождения v (-1, если нет)
GetItemIndexNext(int v)индекс следующего вхождения v (обход дубликатов)

Пример использования

myself.int_list.Add( 1115649 );     // накопить id прямо в списке-поле NPC
myself.int_list.Add( 1115651 );
myself.int_list.Add( 1113858 );

CStrListtype🟢 высокая

список строк
В скриптах
поля NPCmyself.str_list myself.db_str_list1..10

Список строк. Методы зеркальны CIntList, но работают со строками. Как и CIntList, чаще
всего это персистентное поле NPC: myself.str_list (обычный) и myself.db_str_list1
(сохраняется в БД). Удобно как множество: накапливать значения и проверять вхождение
(например, список HWID уже зашедших игроков).

Методы:
GetSize()число элементов (int)
Add(string s)добавить строку в конец
Get(int i)строка по индексу i (string)
GetItemIndex(string s)индекс первого вхождения s (-1, если нет)
GetItemIndexNext(string s)индекс следующего вхождения s
Remove(string s)удалить по значению
RemoveAt(int i)удалить по индексу
Clear()очистить список
SetMaxSize(int n)задать вместимость

Пример использования

myself.str_list.SetMaxSize( 200 );
...
for ( i0 = 0; i0 < myself.str_list.GetSize(); ++i0 ) {
    if ( IsSameString( myself.str_list.Get( i0 ), GetHwid( talker ) ) ) {
        ShowPage( talker, "atb_event_hw_portal_03.htm" );   // HWID уже в списке
        return;
    }
}
myself.str_list.Add( GetHwid( talker ) );                   // новый — добавить

CItemIndexListtype🟢 высокая

список увиденных предметов
В скриптах
слот событияitem_index_list

Список предметов, которые NPC видит на земле. Приходит в событие SEE_ITEM как поле
item_index_list. По нему обычно поднимают предметы через AddGetItemDesireEx.

Методы:
GetSize()сколько предметов в списке (int)
GetItemIndex(int n)object-индекс n-го предмета (int) — годится для AddGetItemDesireEx; сравним с @item-id из [item_pch]

Пример использования

i0 = item_index_list.GetSize();
for ( i1 = 0; i1 < i0; ++i1 ) {
    AddGetItemDesireEx( item_index_list.GetItemIndex( i1 ), 10000 );
}

CCodeInfotype🟢 высокая

одна запись «кода» дропа/квеста
В скриптах
слот событияcode_info

Одна запись «кода» выдачи. Приходит как поле события code_info; обычно её достают из
списка CCodeInfoList методом Next() или RandomSelectOne().

Свойства:
.codeкод записи (int); по нему select(code_info.code) ветвит выдачу — что и кому выдать
Методы:
Next()следующее существо, привязанное к коду (CSharedCreatureData)
RandomSelectOne()случайное существо из привязанных к коду (CSharedCreatureData)

Пример использования

code_info = random1_list.RandomSelectOne();   // взять случайную запись из списка
select ( code_info.code ) {                   // ветвление по коду записи
    case 1: { target = code_info.RandomSelectOne(); ... break; }
}

CCodeInfoListtype🟢 высокая

список записей CCodeInfo
В скриптах
слоты событияalways_list random1_list

Список записей CCodeInfo. Приходит в событие гибели MY_DYING под именами always_list
(гарантированная выдача) и random1_list (случайная выдача). Свой список скрипт создаёт
вызовом AllocCodeInfoList().

Методы:
SetInfo(int code, CSharedCreatureData c)зарегистрировать существо c под кодом code
Next()следующая запись списка (CCodeInfo); пусто в конце
RandomSelectOne()случайная запись из списка (CCodeInfo)

Пример использования

random1_list.SetInfo( 0, target );           // зарегистрировать существо под кодом 0
...
code_info = random1_list.RandomSelectOne();  // случайная запись из списка
target    = code_info.RandomSelectOne();     // случайное существо этой записи
// гарантированный список обходят циклом:
// while ( IsNull( code_info = always_list.Next() ) == 0 ) { ... }

CPositionListtype🟢 высокая

список точек (вейпойнтов)
В скриптах
слоты событияplist0 plist1

Список точек-вейпойнтов. Единственный метод — GetPosition(n). Возвращается функцией
GetCloestPositionList. Отдельного GetSize нет — перебирают по известному числу либо до
пустой точки. Поля события plist0 / plist1 (тип CPositionList) — это свободные слоты:
движок их не заполняет, скрипт сам кладёт туда результат GetCloestPositionList.

Метод:
GetPosition(int n) n-я точка списка (CPosition)

Откуда берётся:
myself.GetCloestPositionList(nList, nX, nY, nZ, nCount)
до nCount ближайших к (x,y,z) точек из именованного набора вейпойнтов nList
(@PrivatePosList1, @FleePoints и т.п.)

Пример использования

plist0 = myself.GetCloestPositionList( @PrivatePosList1,
             FloatToInt(attacker.x), FloatToInt(attacker.y), FloatToInt(attacker.z), 2 );
if ( IsNull( plist0 ) ) {
    // набор пуст — запасной вариант
} else {
    pos0 = plist0.GetPosition( 0 );   // ближайшая безопасная точка рядом с врагом
}

CRoomInfoListtype🟢 высокая

комнаты инстанс-зоны
В скриптах
слоты событияrlist0 rlist1 (списки)
room0 room1 (комнаты)

Список комнат инстанс-зоны и одна комната (запись о группе, занявшей копию). Список
возвращается функцией GetRoomInfoList(sLevelName), комната — методом GetRoomInfo(i).

CRoomInfoList:
GetRoomInfo(int i) i-я комната (CRoomInfo)

CRoomInfo — свойства:
.party_id id группы, занявшей комнату
.member_count число участников
.time время
.status состояние комнаты (атомарное: .value — чтение,
.Exchange(v) — атомарная смена)

CRoomInfo — методы:
GetMemberID(int i) id i-го участника
PartyChanged() сменилась ли группа
SetParty(int id) назначить группу
Clear() очистить комнату

Пример использования

rlist0 = GetRoomInfoList( LevelName );
room0  = rlist0.GetRoomInfo( RoomIndex );

Позиция и геометрия

1 типов

CPositiontype🟢 высокая

точка (координата)
В скриптах
слоты событияpos0 pos1

Точка с координатами. Возвращается генераторами случайных позиций
(GetRandomPosInCreature / GetRandomPosInPos / GetRandomPosInTerritory[2]); в примерах —
pos0, pos1.

Свойства:
.x .y .zкоординаты точки

Enum

10 групп

NASC

ФЛАГИ И ПЕРЕЧИСЛЕНИЯ (ENUM-КОНСТАНТЫ)

ACT

физическое действие NPC (p_state)

что персонаж/NPC физически делает прямо сейчас.

Потребитель: поле myself.p_state (и c.p_state у существа). Одна из самых частых проверок

Пример

if (myself.p_state == @ACT_STAND || myself.p_state == @ACT_SIT) { ... }
@const#
@ACT_NOTHING0действие не задано / бездействие (начальное состояние)
@ACT_STAND1стоит без действия
@ACT_SIT2сидит
@ACT_MOVE3свободно перемещается (идёт/бежит)
@ACT_ATTACK4совершает атаку по цели
@ACT_SKILL5применяет умение (каст)
@ACT_TALK6ведёт диалог с игроком (открыт разговор)
@ACT_GENERAL7выполняет общее (не боевое) действие/анимацию
@ACT_GETITEM8подбирает предмет с земли
@ACT_OPENCLOSE9открывает/закрывает дверь (или подобный объект)
@ACT_MOVE_TO_TARGET10движется к выбранной цели (сближение)
@ACT_MOVE_TO_TARGET_WAIT11идёт к цели и ждёт по прибытии
@ACT_CHANGE_WEAPON12меняет оружие (анимация смены)
@ACT_MOVE_IN_VEHICLE13перемещается в транспорте (лодка/дирижабль)
@ACT_ATTACK_WAIT14пауза между ударами (перезарядка атаки)
@ACT_PRIVATE_STORE15держит открытой личную лавку (частный магазин)
@ACT_MOVE_TO_TARGET_RELATIVE16движется к цели по относительной траектории (следование/удержание позиции)

AT

тип оружия (attack/weapon type)

категория оружия персонажа/предмета.

Потребитель: тип оружия существа/предмета (сравнивают числом). В собранных ai-скриптах

@const#
@AT_NONE0без оружия (кулаки по умолчанию)
@AT_SWORD1одноручный меч
@AT_BLUNT2дубина/булава
@AT_DAGGER3кинжал
@AT_POLE4древковое (алебарда/копьё)
@AT_FIST5кастеты (кулачное оружие)
@AT_BOW6лук
@AT_ETC7прочее
@AT_DUAL8парные мечи
@AT_DUALFIST9парные кастеты
@AT_FISHINGROD10удочка (рыболовная снасть)
@AT_RAPIER11рапира
@AT_CROSSBOW12арбалет
@AT_ANCIENTSWORD13древний меч (особый двуручный)

SAT

социальное действие (жест/анимация)

жест/социальная анимация, которую проигрывает персонаж.

Потребитель: AddPCSocial( nIndex, @SAT_... ) — заставить игрока по индексу проиграть жест.

Пример

AddPCSocial( GetIndexFromCreature( talker ), @SAT_VICTORY );
@const#
@SAT_GREET2приветствие
@SAT_VICTORY3жест победы
@SAT_ADVANCE4«вперёд» (призыв/наступление)
@SAT_NO5«нет» (отрицание)
@SAT_YES6«да» (согласие)
@SAT_BOW7поклон
@SAT_UNAWARE8недоумение (пожать плечами)
@SAT_WAITINGA9ожидание (жест «жду»)
@SAT_LAUGH10смех
@SAT_APPLAUS11аплодисменты
@SAT_DANCE12танец
@SAT_SAD13грусть
@SAT_LEVEL_UP15эффект повышения уровня
@SAT_HERO16эффект/жест героя
@SAT_CURSED_WEAPON_LEVEL_UP17эффект роста проклятого оружия

STGT

тип цели умения (skill target type)

на кого нацелено умение.

Потребитель: возвращаемое значение Skill_GetTargetType( nSkillId ).

Пример

if ( Skill_GetTargetType( skill_id ) == @STGT_ENEMY ) { ... }
@const#
@STGT_SELF0на себя
@STGT_TARGET1на выбранную цель
@STGT_OTHERS2на других (кроме себя)
@STGT_MY_PARTY3на свою группу
@STGT_ENEMY4на врага
@STGT_ENEMY_ONLY5только на врага
@STGT_NPC_ENEMY_ONLY_BUT_SIEGE6только на враждебных NPC (кроме осадных)
@STGT_ITEM7на предмет
@STGT_SUMMON8на призванное существо (саммон)
@STGT_MY_PLEDGE9на свой клан
@STGT_DOOR_TREASURE10на дверь/сокровищницу

PARAM

тип параметра/характеристики

какой параметр персонажа читают/меняют.

Потребитель: IncrementParam( c, @PARAM_..., nAmount ) и родственные операции над статами.

Пример

IncrementParam( target, @PARAM_EXP, 460000 );
@const#
@PARAM_EXP0опыт (EXP)
@PARAM_SP1очки умений (SP)
@PARAM_INT2Интеллект (INT)
@PARAM_STR3Сила (STR)
@PARAM_CON4Телосложение (CON)
@PARAM_MEN5Сила духа (MEN)
@PARAM_DEX6Ловкость (DEX)
@PARAM_WIT7Мудрость (WIT)
@PARAM_LEVEL8уровень
@PARAM_PKCOUNT9счётчик убийств игроков (PK)
@PARAM_KARMA13карма
@PARAM_SKILL_MULTIPLIER65536служебный множитель умений (спец-значение, не стат)

KT

род умения / боевая роль

классификация умения/боевой роли (по назначению класса).

Потребитель: категория умения/роли (в ai-скриптах по @KT_* напрямую почти не сравнивают;

@const#
@KT_BASIC1базовое (общее)
@KT_WARRIOR2воин (ближний бой)
@KT_TANKER3танк (защита/провокация)
@KT_ARCHER4лучник (дальний бой)
@KT_ROUGE5разбойник (rogue; урон/уклонение)
@KT_WIZARD6маг (атакующая магия)
@KT_ENCHANT7баффер/бард (усиление)
@KT_SUMMON8призыватель
@KT_HEAL9лекарь (лечение)

SEAL

печать Seven Signs (SSQ)

печать в системе Seven Signs (Sky/Seven Signs Quest).

Потребитель: GetSSQSealOwner( @SEAL_... ) и другие SSQ-функции с аргументом-печатью.

Пример

if ( GetSSQSealOwner( @SEAL_AVARICE ) == GetSSQPart( talker ) ) { ... }
@const#
@SEAL_AVARICE1Алчность (Avarice)
@SEAL_REVELATION2Откровение (Revelation)
@SEAL_STRIFE3Раздор (Strife)
@SEAL_CHASTISEMENT4Кара (Chastisement)
@SEAL_AROUSAL5Пробуждение (Arousal)
@SEAL_DISASTER6Бедствие (Disaster)
@SEAL_AMAGEDON7Армагеддон (Armageddon)

PP

привилегия клана (pledge power)

конкретное клановое право (что члену разрешено делать).

Потребитель: HavePledgePower( c, @PP_... ) — есть ли у игрока это право в его клане.

Пример

if ( HavePledgePower( talker, @PP_MANAGE_MANOR ) ) { ... }
@const#
@PP_JOIN1приглашать/принимать в клан
@PP_GIVE_NICKNAME2выдавать титул (никнейм) членам
@PP_VIEW_WAREHOUSE3доступ к клановому складу
@PP_MANAGE_GRADE4управлять рангами/званиями членов
@PP_DECLARE_WAR5объявлять клановые войны
@PP_OUST_MEMBER6исключать членов из клана
@PP_SET_CREST7менять герб клана
@PP_MANAGE_MASTER8назначать управляющих (мастеров)
@PP_MANAGE_GROWTH9управлять развитием клана
@PP_SUMMON_AIRSHIP10призывать клановый дирижабль
@PP_OPEN_AGIT_DOOR11открывать двери кланового зала (агита)
@PP_USE_AGIT_FUNC12пользоваться функциями кланового зала
@PP_AGIT_AUCTION13участвовать в аукционе кланового зала
@PP_OUST_FROM_AGIT14изгонять посторонних из кланового зала
@PP_CONTROL_AGIT_FUNC15устанавливать/снимать функции кланового зала
@PP_OPEN_CASTLE_DOOR16открывать двери замка
@PP_MANAGE_MANOR17управлять мануфактурой (семена/урожай)
@PP_REGISTER_CASTLE_WAR18регистрировать участие в осаде замка
@PP_USE_CASTLE_FUNC19пользоваться функциями замка
@PP_OUST_FROM_CASTLE20изгонять посторонних из замка
@PP_MANAGE_TAX21управлять налоговой ставкой замка
@PP_MANAGE_MERCENARY22управлять наёмниками (осадными)
@PP_CONTROL_CASTLE_FUNC23устанавливать/снимать функции замка

FORTRESS

состояния и постройки форта

три отдельных набора значений для форта. Потребители — функции Fortress_*.

@const#
@FORTRESS_ANNOUNCING0объявлена (анонс перед регистрацией)
@FORTRESS_REGISTRATION1идёт регистрация участников
@FORTRESS_STANDBY2ожидание перед началом осады
@FORTRESS_SIEGE3осада идёт
@FORTRESS_GUARD_REINFORCEMENT0подкрепление стражи
@FORTRESS_GUARD_POWER_UP1усиление стражи
@FORTRESS_DOOR_POWER_UP2усиление ворот
@FORTRESS_PHOTOCANNON3фотонная пушка (осадное орудие)
@FORTRESS_SCOUT4разведка (скаут)
@FORTRESS_CONTRACT_INDEP-1независим (без сюзерена)
@FORTRESS_CONTRACT_NONE0контракта нет
@FORTRESS_CONTRACT_CASTLE1заключён контракт с замком