КВЕСТЫ И ПАМЯТЬ КВЕСТОВ (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) — индекс слота 0…3.
Пример
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) — индекс слота 0…3 (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🟢 высокая
Показывает игроку 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🟢 высокая
Делает то же, что 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🟢 высокая
Открывает игроку 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 (заданных в данных моба), а не одного конкретного предмета. Аргумент 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 использовать предмет, заданный единственным аргументом. Точный домен аргумента не подтверждён (индекс в инвентаре против класса предмета), прямых вызовов в коллекции не найдено, поэтому поведение описано с осторожностью.
Сигнатура
UseItem( int nItem )
Параметры
nItem (int) — предмет, который использует NPC (индекс в инвентаре или класс предмета, домен не подтверждён — 0 вызовов)
Пример (иллюстративный):
UseItem( nItem );
UseCategoryItemNPC🟢 высокая
Предположительно заставляет NPC использовать предмет из заданной единственным аргументом категории. Поведение не подтверждено, вызовов в коллекции нет.
Сигнатура
UseCategoryItem( int nCategory )
Параметры
nCategory (int) — категория предмета, из которой NPC использует предмет (назначение не подтверждено — 0 вызовов)
Пример (иллюстративный):
UseCategoryItem( nCategory );
EquipItemNPC🟢 высокая
Заставляет 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 использует соул-шоты (усиление физической атаки) на nCount зарядов.
Сигнатура
UseSoulShot( int nCount )
Параметры
nCount (int) — количество используемых зарядов соул-шотов (в вызовах 10, 20, переменная SoulShot).
Пример
UseSoulShot( SoulShot );
UseSoulShot( 20 );
UseSoulShot(10);
UseSpiritShotNPC🟢 высокая
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 (есть ли наложенный спойл): 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) — длительность/интервал блуждания в окрестности (обычно 5–10)
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( )
Параметры
(нет — функция вызывается без аргументов)
Пример использования
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).
Пример (иллюстративный):
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( )
Параметры
(нет — функция вызывается без аргументов)
Пример использования
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( )
Параметры
(нет — функция вызывается без аргументов)
Пример использования
if ( myself.p_state != 3 && myself.p_state != 10 ) {
RemoveAllAttackDesire( );
}
RemoveAbsoluteDesireNPC🟢 высокая
Существуют особые желания с абсолютным, неперебиваемым приоритетом. Эта функция
снимает такое желание. Она что-то возвращает числом, но смысл возврата пока не
установлен.
Сигнатура
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-ю запись 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 (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🟢 высокая
Начисляет игроку 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 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-константы по её имени-строке 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 (для ответных реакций). Результат проверяют через IsNull* перед обращением к полям.
Сигнатура
GetLastAttacker( )
Параметры
(нет — функция вызывается без аргументов)
Пример
c1 = GetLastAttacker( );
c0 = GetLastAttacker( );
target = GetLastAttacker( );
c2 = GetLastAttacker();
Пример использования
c1 = GetLastAttacker( );
if ( c1.master ) { c1 = c1.master; }
GetMasterUserNPC🟢 высокая
Для призванного/саммон-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: 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 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 — видимость имени и возможность выбрать его целью.
Сигнатура
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 к цели 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 мгновенно «умирает» без указания виновника.
Сигнатура
Suicide( )
Параметры
(нет — функция вызывается без аргументов)
Пример
Suicide( );
Пример использования
if ( skill_name_id == SelfExplosion ) {
Suicide( );
}
SuicideByNPC🟢 высокая
То же, что Suicide, но указывает виновника c (для лога/дропа).
Сигнатура
SuicideBy( CSharedCreatureData c )
Параметры
c (CSharedCreatureData) — существо-виновник гибели (записывается в лог/учитывается для дропа)
Пример
SuicideBy( myself.c_ai0 );
PlayAnimationNPC🟢 высокая
Проигрывает анимацию/жест 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; единицы — как у 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🟢 высокая
Возвращает 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 боссом (сравнивают с @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🟢 высокая
Включает/выключает у существа рассылку события его смерти окружающим. По декомпилю 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-параметр существа 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🟢 высокая
Отправляет событие интерфейса 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🟢 высокая
То же, что 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🟢 высокая
То же, что 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🟢 высокая
Проверяет, является ли nId идентификатором статического объекта на карте; возвращает 1, если статический. Метод существа (CNPC).
Сигнатура
IsStaticObjectID( int nId )
Параметры
nId (int) — идентификатор, проверяемый на принадлежность статическому объекту.
Пример
if (IsStaticObjectID(i0)) {
Пример использования
if ( IsStaticObjectID( i0 ) ) {
Say( MakeFString( 1110073, "", "", "", "", "" ) );
return;
}
GetStaticObjectFromIDNPC🟢 высокая
Возвращает структуру статического объекта (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 заданного класса в точных координатах 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-матч в слоте с заданным номером. Номер должен быть от 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 объекта 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, — прямую ссылку на своего создателя.
Аргументов нет, вызывается на 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 данного дефайна. Аргументов не принимает; вызывается на дефайне ([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. Принимает слушателя, файл озвучки и числовой 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 как распорядителя Олимпиады — через него идёт регистрация и просмотр
боёв. Без аргументов, вызывается у 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🟢 высокая
Регистрирует игрока в классовый матч один на один (classed). Принимает игрока (talker,
тип CSharedCreatureData), у myself; перед вызовом логика проверяет режим Олимпиады,
отсутствие записи, уровень и профессию.
Сигнатура
AddOlympiad( CSharedCreatureData cCreature )
Параметры
cCreature (CSharedCreatureData) — игрок, которого регистрируют на классовый матч один на один
Пример
AddOlympiad(talker);
Пример использования
if ( GetOlympiadPoint( talker ) > 0 ) {
AddOlympiad( talker );
} else {
ShowPage( talker, "olympiad_operator010i.htm" );
}
AddClassFreeOlympiadNPC🟢 высокая
Регистрирует игрока в свободный матч один на один без учёта класса. Принимает игрока
(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🟢 высокая
Регистрирует игрока в командный матч три на три. Принимает игрока (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;" + " " + GetPlayer1ForOlympiadField(i0) + " " + 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;" + " " + GetPlayer1ForOlympiadField(i0) + " " + 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-м месте в рейтинге («зале славы») выбранного
класса. Первый аргумент — какой класс смотрим (в диалогах его берут из выбора игрока,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-м месте в рейтинге выбранного класса.
Полностью парная к GetNameByOlympiadRankOrder и GetRankByOlympiadRankOrder — те же два
аргумента и тот же способ применения: в цикле по местам достают имя, очки и ранг, чтобы
заполнить таблицу рейтинга. Первый аргумент — какой класс смотрим (в диалогах из выбора
игрока), второй — номер места. У myself.
Сигнатура
GetPointByOlympiadRankOrder( int nClassId, int nOrder )
Параметры
nClassId (int) — класс, по рейтингу которого ищут бойца (обычно из выбора игрока в диалоге)
nOrder (int) — номер места в рейтинге класса (1 — первое место и т. д.)
Пример (иллюстративный):
GetPointByOlympiadRankOrder( nClassId, nOrder );
GetRankByOlympiadRankOrderNPC🟢 высокая
Возвращает целым числом ранг бойца, стоящего на 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🟢 высокая
Возвращает целым числом номер команды, за которую игрок выступает в командном (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🟢 высокая
Возвращает целым числом флаг-идентификатор турнирного 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
территории, в точку 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 в случайную точку его территории без указания координат — движок
выбирает её сам. Аргументов нет, возвращаемого значения нет. Используется для
«дёрганья» моба по зоне.
Сигнатура
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) в точку 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🟢 высокая
Задаёт точку 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 до существа 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 до произвольной точки 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🟢 высокая
Возвращает угол на существо c относительно ориентации NPC в клиентских единицах (65536 = 360°). По нему ИИ определяет сектор — спереди, сбоку или сзади: например, диапазон примерно 36864..61440 (202°…337°) означает, что цель сзади-сбоку, что нужно для позиционных умений вроде удара в спину. Принимает существо c (CSharedCreatureData), возвращает int.
Сигнатура
GetAngleFromTarget( CSharedCreatureData cCreature )
Параметры
cCreature (CSharedCreatureData) — относительно кого угол.
Пример
i0 = GetAngleFromTarget(creature);
GetDirectionNPC🟢 высокая
Возвращает направление (heading) от NPC к существу c в клиентских единицах поворота. Используется, чтобы развернуть кого-то лицом в нужную сторону или задать ориентацию при спавне помощников. Принимает существо c (CSharedCreatureData), возвращает int.
Сигнатура
GetDirection( CSharedCreatureData cCreature )
Параметры
cCreature (CSharedCreatureData) — на кого направление.
Пример
i0 = GetDirection(myself.sm);
i1 = GetDirection( myself.sm );
GetDirectionToTargetNPC🟢 высокая
Возвращает направление (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 ) {
// ветка поведения для конкретного инстанса
}
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 (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🟢 высокая
Глобальное объявление от глобального объекта 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 произносит реплику (всплывающий текст над головой), видимую локально игрокам
поблизости. Принимает один аргумент 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🟢 высокая
То же, что 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🟢 высокая
Как 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'ом — связка 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🟢 высокая
То же, что 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 с указанием типа канала и текстом — для важных
оповещений (события, осады). Принимает 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🟢 высокая
То же, что 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 фразы 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🟢 высокая
Показывает существу 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 шепчет приватную строку sStr только адресату pTalker (в отличие от Say/Shout, которые слышат окружающие).
Сигнатура
Whisper( CSharedCreatureData pTalker, string sStr )
Параметры
pTalker (CSharedCreatureData) — адресат, которому NPC шепчет приватно
sStr (string) — шепчемая строка текста
Пример
Whisper(creature, "status " + s0);
WhisperFStrNPC🟢 высокая
То же, что 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-страницу по имени .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🟢 высокая
То же, что 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🟢 высокая
Рассылает системное сообщение по идентификатору 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🟢 высокая
По ключу 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 командного канала, в котором состоит существо. Вызывается на объекте 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🟢 высокая
Меняет титул существа 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🟢 высокая
Меняет «вторую строку» имени существа 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 — строковый идентификатор оборудования игрока 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🟢 высокая
Возвращает числовой идентификатор текущей эволюции (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/3 — 0 или 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🟢 высокая
Показывает игроку 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-кафе, списывая указанную стоимость. По декомпилю 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-кафе у игрока. Принимает игрока; вызывается на 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-кафе. Принимает игрока; вызывается на NPC (myself). Возвращает целое-признак (1 — играет из кафе), применяется вместе с проверкой очков.
Сигнатура
IsPCCafeUser( CSharedCreatureData cCreature )
Параметры
cCreature (CSharedCreatureData) — игрок, для которого проверяют признак игры из PC-кафе
Пример
if (IsPCCafeUser(target) == @TRUE)
Пример использования
if ( IsPCCafeUser( talker ) == 1 ) {
GiveItem1( talker, cratae_reward, 5 );
}
CanUsePCCafePointNPC🟢 высокая
Проверяет, может ли игрок использовать очки PC-кафе. Принимает игрока; вызывается на NPC (myself). Возвращает целое-признак.
Сигнатура
CanUsePCCafePoint( CSharedCreatureData cCreature )
Параметры
cCreature (CSharedCreatureData) — игрок, для которого проверяют возможность тратить очки PC-кафе
Пример (иллюстративный):
CanUsePCCafePoint( talker );
UpdatePCCafePointNPC🟢 высокая
Изменяет баланс очков 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 самого предмета-семени. Список семян у каждого замка разбит по позициям (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 самого предмета-урожая. Список урожаев у каждого замка фиксирован по позициям (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🟢 высокая
Это НЕ «часть суток», как можно подумать по имени. Функция берёт системное время
сервера и возвращает его как количество секунд, прошедших с 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 прожил с момента появления. Аргументов нет,
вызывается на 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).
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🟢 высокая
Подтягивает в объект определения спавна (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-маркер указанного квеста/события. Аргументы: игрок и
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-состояние, привязанное к квесту/событию (устойчивый аналог 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-состояния (несколько ячеек на один квест, как у 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-маркер «контакт с квестом/событием» — аналог 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-маркер (аналог 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-состояние для квеста/события (устойчивый аналог 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-состояния (несколько ячеек на квест, как у
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-маркеров, стоящих на игроке (устойчивый аналог GetMemoCount).
Единственный аргумент — игрок. Возвращает int.
Сигнатура
GetNRMemoCount( CSharedCreatureData cCreature )
Параметры
cCreature (CSharedCreatureData) — игрок, количество NR-маркеров у которого считают
Пример: в наших скриптах прямых вызовов нет.
SetNRFlagJournalNPC🟢 высокая
Выставляет флаг (бит/шаг) журнала 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🟢 высокая
Читает «куки» прохождения этапа диалога/квеста, привязанные к показанному 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 показанного 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» замка этого
NPC. Это одна из платных функций резиденции (аналог функций кланового зала): её уровень
задаётся Castle_SetHPRegen и определяет силу бонуса регенерации HP на территории. Без
аргументов — работает по резиденции самого NPC; если функция не установлена, возвращает 0.
Сигнатура
Castle_GetHPRegen( )
Параметры
(нет — функция вызывается без аргументов)
Пример
Castle_GetHPRegen( );
Castle_SetHPRegenNPC🟢 высокая
Устанавливает (или снимает) функцию резиденции «Восстановление HP» замка на заданный уровень.
При nLevel>0 функция включается на 7 суток; при nLevel=0 — снимается. Резиденция берётся по
самому NPC.
Сигнатура
Castle_SetHPRegen( int nLevel )
Параметры
nLevel (int) — уровень (грейд) функции восстановления HP резиденции; >0 — установить на
7 суток, 0 — снять функцию.
Пример (иллюстративный):
Castle_SetHPRegen( nLevel );
Castle_GetMPRegenNPC🟢 высокая
Возвращает уровень (грейд) установленной функции резиденции «Восстановление MP» замка этого
NPC — аналог Castle_GetHPRegen для MP (функция типа 1). Уровень задаётся Castle_SetMPRegen и
определяет силу бонуса регенерации MP на территории. Без аргументов — по резиденции самого
NPC; если функция не установлена, возвращает 0.
Сигнатура
Castle_GetMPRegen( )
Параметры
(нет — функция вызывается без аргументов)
Пример
Castle_GetMPRegen( );
Castle_SetMPRegenNPC🟢 высокая
Устанавливает (или снимает) функцию резиденции «Восстановление 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-страниц в зависимости от состояния осады резиденции
этого 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🟢 высокая
Возвращает 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🟢 высокая
Отменяет регистрацию клана существа c в территориальной войне (Dominion) за территорию
nDominionId — обратное действие к RegisterDominion.
Сигнатура
CancelPledgeDominion( int nDominionId, CSharedCreatureData c )
Параметры
nDominionId (int) — идентификатор территории/резиденции (Dominion), участие в которой отменяется.
c (CSharedCreatureData) — существо-инициатор (игрок или представитель клана).
Пример (иллюстративный):
CancelPledgeDominion( nDominionId, talker );
IsDominionOfLordNPC🟢 высокая
Сообщает, есть ли у территории (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🟢 высокая
Сообщает, является ли существо 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 резиденции 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🟢 высокая
Предикат крепостей (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🟢 высокая
Метод крепостей (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🟢 высокая
Геттер декораций (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🟢 высокая
Доступна на 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 при торговле семенами и урожаем. Принимает
получателя (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 лет игры. Принимает получателя
(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 лет игры. Принимает
получателя (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-отчёт о результатах лотереи и заполняет объект 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🟢 высокая
Открывает игроку 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-очков существа на величину 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-очков существа.
Сигнатура
GetPVPPoint( CSharedCreatureData cCreature )
Параметры
cCreature (CSharedCreatureData) — существо, чьи PvP-очки возвращают
Пример
if (GetPVPPoint(talker) < 0)
Пример использования
if (GetPVPPoint(talker) < 0) {
ShowPage(talker, fnNoPvpPoint);
} else {
ShowMultisell(638, talker);
}
RegisterUserPVPMatchNPC🟢 высокая
Регистрирует существо для участия в матче 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. Возврата нет.
Сигнатура
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.
Сигнатура
IsUserPVPMatching( CSharedCreatureData cCreature )
Параметры
cCreature (CSharedCreatureData) — существо, которое проверяют на регистрацию в матче PvP
Пример
IsUserPVPMatching( creature );
Пример использования
if ( creature.is_pc == @TRUE ) {
IsUserPVPMatching( creature );
}
Связанное событие: ответ сервера приходит событием IS_USER_PVPMATCHING_RESULT (см. NASC_HANDLERS).
CheckRegisterUserPVPMatchNPC🟢 высокая
Диагностическая функция: валидирует предусловия регистрации существа в 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-рейтинге.
Сигнатура
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🟢 высокая
Геттер (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 как часть инстанса игры. Принимает идентификатор
площадки (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-событие (например дирижабля) всем игрокам в зоне. Принимает 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🟢 высокая
Задаёт приватный идентификатор для 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, а не глобальной
системе. Сервер лишь записывает тег и два числа в журнал (на геймплей не влияет),
поэтому тег — открытый набор аналитических кодов, задаваемых соглашением скрипта, а
не фиксированный 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 для подробной телеметрии его действий
(награды, продажи, события). Принимает 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 );