на главную страницу -|- к архиву статей
Территория
Файлы
Статьи и дополнительная информация
Гостевая книга
Команда

"Aurora Toolset" Описание функций тулсета.

Автор перевода: Valleo

Редактор/исправитель неточностей/добавитель пояснений: Rico

ЧАСТЬ I

Типы переменных:

object - объект игрового мира
int - целое число
float - число с плавающей точкой (дробное проще говоря)
location - это локация
vector - вектор
talent - талант
effect - эффект

И так, начну сверху вниз (по списку в тулсете).

Action*

ActionAttack (Действие - Атака)
void ActionAttack(object oAttackee, int bPassive=FALSE)

object - это объект, на который будет происходить атака.
int bPassive= - атака в пассивном (если стоит TRUE) или в активном режиме (если стоит FALSE)


ActionCastFakeSpellAtLocation (Действие - Кстование спеллов, которые только дают эффект и визуализацию, больше ничего, на определенное место
void ActionCastFakeSpellAtLocation(int nSpell, location lTarget, int nProjectilePathType=PROJECTILE_PATH_TYPE_DEFAULT)

int nSpell - nSpell, который вы собираетесь кастовать
location lTarget - lTarget, куда будет направлен спелл
int nProjectilePathType - тип траектории (PROJECTILE_PATH_*)


ActionCastFakeSpellAtObject (Тоже, что и в предыдущем варианте, только здесь используется не точка на карте, а объект как мишень)
void ActionCastFakeSpellAtObject(int nSpell, object oTarget, int nProjectilePathType=PROJECTILE_PATH_TYPE_DEFAULT)

int nSpell - nSpell, который вы собираетесь кастовать
object oTarget - oTarget, куда будет направлен спелл
int nProjectilePathType - тип траектории (PROJECTILE_PATH_*)

ActionCastSpellAtLocation (Действие - Кастование спелла на определенную точку на карте)
void ActionCastSpellAtLocation(int nSpell, location lTargetLocation, int nMetaMagic=METAMAGIC_ANY, int bCheat=FALSE, int nProjectilePathType=PROJECTILE_PATH_TYPE_DEFAULT, int bInstantSpell=FALSE)

int nSpell - nSpell, который вы хотите скастовать
location lTargetLocation - lTargetLocation, куда направлен спелл
int nMetaMagic - вид метамагии, который вы примените к этому спеллу (METAMAGIC_ANY, METAMAGIC_EMPOWER, METAMAGIC_EXTEND, METAMAGIC_MAXIMIZE, METAMAGIC_NONE, METAMAGIC_QUICKEN, METAMAGIC_SILENT, METAMAGIC_STILL)
int bCheat - если установлено в TRUE, то объект скастит спелл независимо от того, является ли он кастером, либо не имеет данного спелла.
int nProjectilePathType - тип траектории (PROJECTILE_PATH_*)
int bInstantSpell - если FALSE, то спелл будет кастоваться до дефолту, если TRUE - спелл будет скастован немедленно.


ActionCastSpellAtObject (Тоже, что и в предыдущем варианте, но целью является уже объект)
void ActionCastSpellAtObject(int nSpell, object oTarget, int nMetaMagic=METAMAGIC_ANY, int bCheat=FALSE, int nDomainLevel=0, int nProjectilePathType=PROJECTILE_PATH_TYPE_DEFAULT, int bInstantSpell=FALSE)

int nSpell - nSpell, который вы хотите скастовать
object oTarget - oTarget, куда направлен спелл

int nMetaMagic - вид метамагии, который вы примените к этому спеллу (METAMAGIC_ANY, METAMAGIC_EMPOWER, METAMAGIC_EXTEND, METAMAGIC_MAXIMIZE, METAMAGIC_NONE, METAMAGIC_QUICKEN, METAMAGIC_SILENT, METAMAGIC_STILL)
int bCheat - если установлено в TRUE, то объект скастит спелл независимо от того, является ли он кастером, либо не имеет данного спелла.
int nDomainLevel - хех, сколько много интерестного... оставим по дефолту
int nProjectilePathType - тип траектории (PROJECTILE_PATH_*)
int bInstantSpell - если FALSE, то спелл будет кастоваться до дефолту, если TRUE - спелл будет скастован немедленно.

Наверняка некоторые не понимают, что такое object...
Кратко поясню - object содержит в себе тег нужного объекта.
Задается таким образом:
object oDoor = GetObjectByTag("тэг объекта");

Следующая порция скриптов.

ActionCloseDoor (Действие Закрыть дверь)
void ActionCloseDoor(object oDoor)

object oDoor - закрыть oDoor


ActionCounterSpell (Дейсвие Контрзаклинания)
void ActionCounterSpell(object oCounterSpellTarget)

object oCounterSpellTarget - Применяется дейсвие контрзаклинания против oCounterSpellTarget


ActionDoCommand (Действие Исполнение команды)
void ActionDoCommand(action aActionToDo)

action aActionToDo - выполнение aActionToDo. (сам не знаю как это работает... возможно скриптеры получше меня здесь пояснят для чего нужна эта команда)


ActionEquipItem (Действие Помещения объекта в определенный слот)
void ActionEquipItem(object oItem, int nInventorySlot)

object oItem - ну сам объект oItem, который вы хотите поместить
int nInventorySlot - а вот здесь пишите слот из приведенного ниже списка:

INVENTORY_SLOT_ARMS - слот для наручей и перчаток
INVENTORY_SLOT_ARROWS - слоты под стрелы, болты, камни, сюрикены и т.д.
INVENTORY_SLOT_BELT - слот под пояс
INVENTORY_SLOT_BOOTS - слот под сапоги
INVENTORY_SLOT_BULLETS
INVENTORY_SLOT_CARMOUR
INVENTORY_SLOT_CHEST
INVENTORY_SLOT_CLOAK - слот для плаща
INVENTORY_SLOT_CWEAPON_B
INVENTORY_SLOT_CWEAPON_L
INVENTORY_SLOT_CWEAPON_R
INVENTORY_SLOT_HEAD - слот для шлема
INVENTORY_SLOT_LEFTHAND - слот для левой руки
INVENTORY_SLOT_LEFTRING - слот для кольца на левую руку
INVENTORY_SLOT_NECK
INVENTORY_SLOT_RIGHTHAND - слот для правой руки
INVENTORY_SLOT_RIGHTRING - слот для кольца на правую руку


ActionEquipMostDamagingMelee (Действие Помещение в руку объекта, который наносит большее повреждение, для mlee (близкий бой) атаки. Если такого оружия не найдено в руку будет помещено оружие для range (дальний бой) атаки. Скрипт лучше всего использовать в EndOfCombatRound, потому что чтобы запустить скрипт нужно будет закончить один раунд)
void ActionEquipMostDamagingMelee(object oVersus=OBJECT_INVALID, int bOffHand=FALSE)

object oVersus - для чего этот параметр я так и не понял...
int bOffHand - и этото тоже... пусть стоит на дефолте

ПРИМЕЧАНИЕ: функция может работать просто как ActionEquipMostDamagingMelee();, т.е. без дополнительных параметров.


ActionEquipMostDamagingRanged (Действие Помещение в руку объекта, который наносит наибольшие повреждения, для range (дальний бой) атаки. Если такового не найдено в руку будет помещена вещь наносящая наибольбшие повреждения в mlee (близкий бой) атаке. Скрипт лучше всего использовать в EndOfCombatRound, потому что чтобы запустить скрипт нужно будет закончить один раунд)
void ActionEquipMostDamagingRanged(object oVersus=OBJECT_INVALID)


object oVersus - ну надо же, опять непонятный параментр =)
ПРИМЕЧАНИЕ: функция может работать просто как ActionEquipMostDamagingRanged();, т.е. без дополнительных параметров.


ActionEquipMostEffectiveArmor (Дейсвие Помещение объекта (брони) с самым выскоим показателем класса брони)
void ActionEquipMostEffectiveArmor()


Здесь будут разбираться случаи, в которых используется тип переменных - location

Location - определяет локацию в игровом мире.
location Location(object oArea, vector vPosition, float fOrientation)

Каждая локация характеризуется областью, вектором и ориентацией:
object oArea - область
vector vPosition - вектор в oArea
float fOrientation - ориентация (условно - "направление взгляда"):
DIRECTION_EAST - восток,
DIRECTION_NORTH - север,
DIRECTION_SOUTH - юг,
DIRECTION_WEST - запад,
либо дробное значение от 0.0 до 360.0.
Для тех кому все же непонятно - сравните функцию с установкой вейпоинта в определенной области (oArea), в указанной позиции внутри этой области (vPosition) и направлении его в определенное место (fOrientation), только скриптом и без реального объекта.


Vector - определение вектора по трем координатам
vector Vector(float x=0.0f, float y=0.0f, float z=0.0f)

float x - направление по оси х
float y - направление по оси у
float z - направление по оси z

Применение этой функции на практике:
vector vNewPos = GetPosition(oPlayer) - Vector( 0.0f, -2.0f, 0.0f);

Определяем location
location lNewLoc=Location(GetArea(OBJECT_SELF), vNewPos, DIRECTION_NORTH);

Помните, что как таковой оси Z в НВН нет. Т.е. перемещаться по оси Z, оставаясь при этом в одинаковых X и У, нельзя.

ActionForceFollowObject (Действие Следовать за объектом)
void ActionForceFollowObject(object oFollow, float fFollowDistance=0.0f)

object oFollow - объект oFollow, за которым непосредственно и будут следовать.
float fFollowDistance - а это определяет дистанцию, на которой будет держаться следующий от oFollow


ActionForceMoveToLocation (Действие Вынужденное движение на определенную дистанцию)
void ActionForceMoveToLocation(location lDestination, int bRun=FALSE, float fTimeout=30.0f)

location lDestination - жистанция, заданная функцией location
int bRun - если TRUE, то будет применен бег, если FALSE - будет просто идти
float fTimeout - сколько это будет длиться =)


ActionForceMoveToObject (Действие Вынужденное движение к определенному объекту)
void ActionForceMoveToObject(object oMoveTo, int bRun=FALSE, float fRange=1.0f, float fTimeout=30.0f)

object oMoveTo - указывает к какому объекту двигаться, в данном случае oMoveTo
int bRun - если TRUE, то будет применен бег, если FALSE - будет просто идти
float fRange - хм, не могу сказать что это
float fTimeout - сколько это будет длиться =)))))))))


ActionGiveItem (Действие Дать предмет - самый элементарный скрипт)
void ActionGiveItem(object oItem, object oGiveTo)

object oItem - сама вещь, которую дают, в нашем случае это oItem
object oGiveTo - тот, кому дают oItem

ПРИМЕЧАНИЕ: НЕ ЗАБЫВАЙТЕ ПОСЛЕ ФУНКЦИЙ СТАВИТЬ ";"
И так, продолжим...

ActionInteractObject (Действие Взаимодействия с целью)
void ActionInteractObject(object oPlaceable)

object oPlaceable - функция взаимодействия с oPlaceable... практического использования этой функции я не наблюдаю...


ActionJumpToLocation (Действие Прыжок в локацию, т.е. при выполненеии этого действия чар пересется в точку)
void ActionJumpToLocation(location lLocation)

location lLocation - задается lLocation, куда переносится объект, с помощью функции, описанной в предыдущем посте


ActionJumpToObject (Действие Прыжок к объекту, т.е. при выполнении этого действия чар перенесется к объекту)
void ActionJumpToObject(object oToJumpTo, int bWalkStraightLineToPoint=TRUE)

object oToJumpTo - объект oToJumpTo, к которому и происходит перенос
int bWalkStraightLineToPoint - переводится как прыжок по прямой линии если стоит TRUE, а если FALSE - то прыжок производится рандомно... хотя может я и не так понял =)


ActionLockObject (Действие Запереть объект)
void ActionLockObject(object oTarget)

object oTarget - объект, который нужно запереть


ActionMoveAwayFromLocation (Действие Уходить от точки)
void ActionMoveAwayFromLocation(location lMoveAwayFrom, int bRun=FALSE, float fMoveAwayRange=40.0f)

location lMoveAwayFrom - собственно то место, от которого нужно уйти.
int bRun - собственно TRUE включает бег, FALSE отключает бег...
float fMoveAwayRange - ну это типа сколько футов надо идти от того места (задается как х.х)


ActionMoveAwayFromObject (Действие Уходить от объекта)
void ActionMoveAwayFromObject(object oFleeFrom, int bRun=FALSE, float fMoveAwayRange=40.0f)

object oFleeFrom - задается от какого объекта мы должны двигать (когда ты используешь ящик и сразу срываешься с места, а тем временем таймер на ящичке отсчитывает 10 сек и ящик взрывается - это так, для примера)
int bRun - собственно TRUE включает бег, FALSE отключает бег...
float fMoveAwayRange - ну это типа сколько футов надо идти от того места (задается как х.х)


ActionMoveToLocation (действие Идти в локацию)
void ActionMoveToLocation(location lDestination, int bRun=FALSE)

location lDestination - задается сама локация, куда идти
int bRun - собственно TRUE включает бег, FALSE отключает бег...


ActionMoveToObject (Действие Идти к объекту)
void ActionMoveToObject(object oMoveTo, int bRun=FALSE, float fRange=1.0f)

object oMoveTo - сам обжект, к которому мы начинаем двигаться
int bRun - собственно TRUE включает бег, FALSE отключает бег (ну везде одно и тоже)
float fRange - а это типа максимальное расстояние, на которое мы можем подойти к объекту (т.е. число футов, которое останется между вами и объектом)


ActionOpenDoor (Действие Открыть дверь)
void ActionOpenDoor(object oDoor)

object oDoor - ну сама дверь заданная переменной oDoor
Напомню, как задавать обжекты:

object oDoor = GetObjectByTag("тэг объекта");


ActionPauseConversation (Действие приостановка разговора... практического применения не вижу)
void ActionPauseConversation()


ActionPickupItem (Действие Поднять вещь с земли)
void ActionPickupItem(object oItem)

object oItem - сама вещь oItem


ActionPutDownItem (Действие Положить вещь на землю)
void ActionPutDownItem(object oItem)

object oItem - сама вещь oItem


ActionPlayAnimation (Действие Проиграть анимацию)
void ActionPlayAnimation(int nAnimation, float fSpeed=1.0, float fDurationSeconds=0.0)
int nAnimation - сама анимация. Ее выбираем из полного списка, приведенного ниже:

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

ANIMATION_FIREFORGET_BOW
ANIMATION_FIREFORGET_DODGE_DUCK
ANIMATION_FIREFORGET_DODGE_SIDE
ANIMATION_FIREFORGET_DRINK
ANIMATION_FIREFORGET_GREETING
ANIMATION_FIREFORGET_HEAD_TURN_LEFT
ANIMATION_FIREFORGET_HEAD_TURN_RIGHT
ANIMATION_FIREFORGET_PAUSE_BORED
ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD
ANIMATION_FIREFORGET_READ
ANIMATION_FIREFORGET_SALUTE
ANIMATION_FIREFORGET_STEAL
ANIMATION_FIREFORGET_TAUNT
ANIMATION_FIREFORGET_VICTORY1
ANIMATION_FIREFORGET_VICTORY2
ANIMATION_FIREFORGET_VICTORY3
ANIMATION_LOOPING_CONJURE1
ANIMATION_LOOPING_CONJURE2
ANIMATION_LOOPING_DEAD_BACK
ANIMATION_LOOPING_DEAD_FRONT
ANIMATION_LOOPING_GET_LOW
ANIMATION_LOOPING_GET_MID
ANIMATION_LOOPING_LISTEN
ANIMATION_LOOPING_LOOK_FAR
ANIMATION_LOOPING_MEDITATE
ANIMATION_LOOPING_PAUSE
ANIMATION_LOOPING_PAUSE_DRUNK
ANIMATION_LOOPING_PAUSE_TIRED
ANIMATION_LOOPING_PAUSE2
ANIMATION_LOOPING_SIT_CHAIR
ANIMATION_LOOPING_SIT_CROSS
ANIMATION_LOOPING_SPASM
ANIMATION_LOOPING_TALK_FORCEFUL
ANIMATION_LOOPING_TALK_LAUGHING
ANIMATION_LOOPING_TALK_NORMAL
ANIMATION_LOOPING_TALK_PLEADING
ANIMATION_LOOPING_WORSHIP
ANIMATION_PLACEABLE_ACTIVATE
ANIMATION_PLACEABLE_CLOSE
ANIMATION_PLACEABLE_DEACTIVATE
ANIMATION_PLACEABLE_OPEN


float fSpeed - скорость анимации
float fDurationSeconds - продолжительность анимации

ActionRandomWalk (Действие Случайное хождение - функция вызывает создание случайного местоположения вокруг того, что или куто ее использует, и пытается заставить эту вещь или объект переместиться туда... например человек может бродить где его душе угодно)
void ActionRandomWalk()


ActionRest (действие Отдых - заставляет существо отдыхать)
void ActionRest()


ActionResumeConversation (Действие продолжить разговор... помните мы говорили про паузу разговора? вот это снимает паузу... зачем эта функция на практике мне невдомек)
void ActionResumeConversation()


ActionSit (Действие Сидеть - садит существо на его пятую точку где нибуть на каком нибуть стуле... применяется непосредственно в OnUsed стула, хотя можно и на что нить другое...)
void ActionSit(object oChair)

object oChair - сам стул oChair


ActionSpeakString (Действие Сказать что то - заставляет существо говорить всякую фигню, которую вы зададите скриптом... хотя это может быть и не существо... ну кому какая разница?)
void ActionSpeakString(string sStringToSpeak, int nTalkVolume=TALKVOLUME_TALK)

string sStringToSpeak - строка что говорить... вы не знаете как ее задать??? смотрите и учитесь:

strin sStringToSpea = "Тру-ля-ля, я дурак или нет... Дайте мне в лоб";
Когда запустится скрипт как вы думаете что скажет тот, на кого он будет применяться??? =)


Конечно под вопросом как громко это он скажет... Это задается с помощью параметра
int nTalkVolume - выбирите из списка ниже громкость:
TALKVOLUME_SHOUT - орет в шаут, т.е. весь модуль его услышит...
TALKVOLUME_TALK - говорит просто так... в компании =)
TALKVOLUME_WHISPER - чтоб никто не услышал надо говорить шопотом...

TALKVOLUME_SILENT_* услышат только мобы. В стандарте используются для сообщения рядом стоящим мобам о моей (т.е. запустившего скрипт) смерти:
TALKVOLUME_SILENT_SHOUT - услышат мобы во всем шарде
TALKVOLUME_SILENT_TALK - услышат рядом стоящие мобы

ActionSpeakStringByStrRef (Дествие Сказать фразу по номеру)
void ActionSpeakStringByStrRef(int nStrRef, int nTalkVolume=TALKVOLUME_TALK)

Номера определены в так называемой Talk Table, или проще - в файле dialog.tlk. Если файл у вас оригинальный, то там все на английском, следовательно, функция почти бесполезна. Просмотреть содержимое Talk Table можно с помощью Neverwinter Nights Talk Table Viewer, взять которую можно на официальном сайте игры.

ActionStartConversation (Действие начать разговор - ОЧЕНЬ важная функция для тех, кто хочет наладить общение с неодушевленными предметами...)
void ActionStartConversation(object oObjectToConverseWith, string sDialogResRef="", int bPrivateConversation=FALSE, int bPlayHello=TRUE)

object oObjectToConverseWith - задает с кем будет идти разговор (ну конечно с вами)
string sDialogResRef - пишем в кавычках название разговорника =)
Если это значение не указано, то будет использован прикрепленный к объекту диалог.
int bPrivateConversation - приватный разговор (TRUE) или это слышат все (FALSE)
int bPlayHello - когда начинаешь разговор скажи привет (TRUE) или тупо промолчи (FALSE)


ActionTakeItemх (Действие Взять вещь)
void ActionTakeItem(object oItem, object oTakeFrom)

object oItem - сама вещь... которую берут
object oTakeFrom - а это тот, у которого забирают, иными словами "разведем как НПС на вещичку oItem"... или наоборот, кому как взбредет в голову =)


ActionUnequipItem (Действие Вынуть из слота вещь - насильно вынимает из слота вещь, где бы она не лежала...)
void ActionUnequipItem(object oItem)

object oItem - ну типа та вещь oItem, которую вынимают... функция например может снять броню, снять кольца... ну и т.д. без вашего ведома =))) опасайтесь гнусных скриптеров =)


ActionUnlockObject (Действие Отпереть объект - в смысле ключем, чтобы тот небыл заперт)
void ActionUnlockObject(object oTarget)

object oTarget - объект oTarget, который мы унлокаем


ActionUseFeat (Действие Использовать фит - наверно подразумеваются активные фиты...)
void ActionUseFeat(int nFeat, object oTarget)

int nFeat - сам фит... список этих фитов приводить сдесь не буду - их много и я замучаюсь... зайдите в тулсет, откройте создатель скриптов, ткните в константы и в поиске напишите "FEAT_"...
object oTarget - а это типа на кого его использовать...


ActionUseSkill (Действие Использовать скилл - ну вы поняли, скилл это оотуда, где эмпатия, поиск, лоре и т.д.)
void ActionUseSkill(int nSkill, object oTarget, int nSubSkill=0, object oItemUsed=OBJECT_INVALID )

int nSkill - сам скилл (список найдите в константах написав в поиске "SKILL_")
object oTarget - объект, на что скилл использовать...
int nSubSkill - что то типа подскил... список:
SUBSKILL_EXAMINETRAP - изучить ловушку (показывает ее DC и некоторую другую информацию)
SUBSKILL_FLAGTRAP - поставить флаг на ловушке (ее будут видеть все)
SUBSKILL_RECOVERTRAP - снять ловушку (в случае успеха ловушка окажется у вас в инвентаре)

object oItemUsed - а это типа обжект, вместе с которым вы используете скилл... т.е. все его бонусы к скиллу учитываются тоже =)))


ActionUseTalentAtLocation (Действие Использования закрытого талента на локации)
void ActionUseTalentAtLocation(talent tChosenTalent, location lTargetLocation)

talent tChosenTalent - типа сам талент (угадайте с трех раз ЧТО это...)
location lTargetLocation - сама локация


ActionUseTalentOnObject (Действие использовать талент на объекте)
void ActionUseTalentOnObject(talent tChosenTalent, object oTarget)...

talent tChosenTalent - кхм... Сам талент...
object oTarget - сам обжект... =)


ActionWait (Действие Ждать - т.е. ничего не делать определенное кол-во секунд...)
void ActionWait(float fSeconds)

float fSeconds - секунды (х.х)

Урра, на этом актионы мы прошли ВСЕ! И так, что мы научились делать? А мы научились заставлять объекты перемещатсья, двери закрываться, фиты использоваться и все в таком духе...

Activate*, Add*

ActivatePortal (Активирует портал. Точнее переносит игрока на другой сервер)
void ActivatePortal(object oTarget, string sIPaddress="", string sPassword="", string sWaypointTag="", int bSeemless=FALSE)

object oTarget - объект переноса (т.е. вы, но и может быть кто нить другой)
string sIPaddress - IP адресс шарда, может быть задан как числовой "192.168.0.84", может как буквенный "www.bioware.com", можно указать порт "192.168.0.84:5121" или "www.bioware.com:5121" (все адреса взяты для примера, их вы меняете на свои =) )
string sPassword - пароль для входа на шард (не вы знаете форму, где нужно ввести адресс и пароль, вот это типа что то того)
string sWaypointTag - тэг вейпоинта, где "приземлится" наш путешественник
int bSeemless - TRUE - вы не увидите окна сообщения что вы переместились на другой шард.

Note: Портал не перенесет вашего персонажа (.bic)!

AddHenchman (Добавить хенчмена, т.е. того, кто будет с вами шататься по миру, иногда кастуя на вас лечение и тупа несясь на самых слабых монстров, когда вас убивают сильные )
void AddHenchman(object oMaster, object oHenchman=OBJECT_SELF)

object oMaster - типа глава отряда, тот, к кому присоеденяется Henchman
object oHenchman - а это сам Henchman


AddJournalQuestEntry (Добавить квестовую запись в ваш журнал (ну или чей нить))
void AddJournalQuestEntry(string szPlotID, int nState, object oCreature, int

bAllPartyMembers=TRUE, int bAllPlayers=FALSE, int bAllowOverrideHigher=FALSE)

string szPlotID - это плот ID, который создается при создании записи в toolset's Journal Editor
int nState - номер статейки, которую надо записать в ваш журнал, тоже найдете в toolset's Journal Editor
object oCreature - каму добавится запись в журнал
int bAllPartyMembers - если TRUE - запись добавится всем партийцам
int bAllPlayers - если TRUE - запись добавится ВСЕМ в этом МИРЕ
int bAllowOverrideHigher - если TRUE - вы сможете установить номер записи, меньшИй, чем текущий. То есть если номер текущей записи в квесте szPlotId - N, то с этой опцией вы сможете установить любой номер, меньший N. Это полезно в случае отката квеста на некоторое время назад, либо при множественном выборе номер, когда точно неизвестно, будет ли номер больше текущего, либо меньше.


AddToParty (Добавить в партию)
void AddToParty(object oPC, object oPartyLeader)

object oPC - объект, который добавится в партию
object oPartyLeader - пати лидер, или тот, к кому присоеденится PC.

Note: Эта функция работает только между двумя игроками. Присоединение к партии ДМа с некоторой вероятностью повесит сервер.

Adjustalignment (Регулировка Анлаймента персонажа)
void Adjustalignment(object oSubject, int nalignment, int nShift)

object oSubject - сам персонаж, чей анлаймент (еще называют его алигмент) мы будем регулировать
int nalignment - переделка анлаймента на корню (что тут установите, такой и будет):
alignMENT_LAWFUL
alignMENT_CHAOTIC
alignMENT_GOOD
alignMENT_EVIL
(перечисленные константы меняют алаймент только по заданной шкале)

alignMENT_ALL - меняет показатели всех шкал.

alignMENT_NEUTRAL - изменяет алаймент по направлению к нейтральности.
Например, если цель имеет 10 хаотик и 80 гуда, а изменение - 15 пунктов, то новый алаймент будет (10 + 15 = 25) в хаотик/лофул и (80 - 25 = 55) в эвил/гуд.

int nShift - количество пунктов, на которое требуется изменить алаймент.

AdjustReputation (Изменяет отношение oSourceFactionMember к oTarget)
void AdjustReputation(object oTarget, object oSourceFactionMember, int nAdjustment)

object oTarget - цель изменения
object oSourceFactionMember - объект, в глазах которого изменяется репутация
int nAdjustment - кол-во пунктов, на которое повышается (понижается) отношение.

Note: Эта функция изменяет отношение всей группы (фракции), к которой принадлежит oSourceFactionMember.

Ambient*


AmbientSoundChangeDay (Смена фоновой музыки в определенной локации днем)
void AmbientSoundChangeDay(object oArea, int nTrack)

object oArea - локация, в которой идет смена фоновой музыки
int nTrack - номер трека, на который вы хотите сменить фоновую музыку


AmbientSoundChangeNight (Смена фоновой музыки в определенной локации ночью)
void AmbientSoundChangeNight(object oArea, int nTrack)

object oArea - локация, в которой идет смена фоновой музыки
int nTrack - номер трека, на который вы хотите сменить фоновую музыку


AmbientSoundPlay (Проиграть фоновую музыку в локации)
void AmbientSoundPlay(object oArea)

object oArea - сама локация


AmbientSoundSetDayVolume (Изменить громкость фоновой музыки днем)
void AmbientSoundSetDayVolume(object oArea, int nVolume)

object oArea - локация, где играет фоновая музыка
int nVolume - громкость (от 0 до 100)


AmbientSoundSetNightVolume (Изменить громкость фоновой музыки ночью)
void AmbientSoundSetNightVolume(object oArea, int nVolume)

object oArea - локация, где играет фоновая музыка
int nVolume - громкость (от 0 до 100)


AmbientSoundStop (Останавливает воспроизведение фоновой музыки в определенной локации)
void AmbientSoundStop(object oArea)

object oArea - сама локация


AngleToVector (Коневертировать дробную переменную в вектор)
vector AngleToVector(float fAngle)

float fAngle - переменная для конвертации

ApplyEffect*


ApplyEffectAtLocation (Применить эффект к указанной локации)
void ApplyEffectAtLocation(int nDurationType, effect eEffect, location lLocation, float fDuration=0.0f)

int nDurationType - определяет, сколько этот эффект будет продолжаться :
DURATION_TYPE_INSTANT - мгновенно
DURATION_TYPE_PERMANENT - всегда
DURATION_TYPE_TEMPORARY - временно
effect eEffect - прмиеняемый эффект
location lLocation - локация, на которую эффект будет прмиеняться
float fDuration - длительность эффект (если в nDurationType стоит DURATION_TYPE_TEMPORARY)


ApplyEffectToObject (Прмиенить эффект уже к объекту)
void ApplyEffectToObject(int nDurationType, effect eEffect, object oTarget, float fDuration=0.0f)

int nDurationType - определяет, сколько этот эффект будет продолжаться :
DURATION_TYPE_INSTANT - мгновенно
DURATION_TYPE_PERMANENT - всегда
DURATION_TYPE_TEMPORARY - временно
effect eEffect - прмиеняемый эффект
object oTarget - объект, к оторому будет применяться эффект
float fDuration - длительность эффект (если в nDurationType стоит DURATION_TYPE_TEMPORARY)


asin (Возвращает дробное значение арксинуса, если значение болье 1 или меньше -1 - то возвращается 0)
float asin(float fValue)

float fValue - число, из которого извлекается арксинус


atan (Возвращает дробное значение арктангенса)
float atan(float fValue)

float fValue - число, из которого будет извлекаться арктангенс


AssignCommand (Это функция для назначения вышеописанных Action функций не OBJECT_SELF объектам)
void AssignCommand(object oActionSubject,action aActionToAssign)

object oActionSubject - объект, который будет ВЫПОЛНЯТЬ aActionToAssign
action aActionToAssign - действие, которое будет выполнять oActionSubject

Описанные выше Action* функции выполняются только для OBJECT_SELF. В любом событии NPC используются обычные ActionMoveToObject() и т.д. А например в OnUsed плейсебла, ActionMoveToObject() должна будет заставить двигаться плейсебл. Для решения этой задачи и используется AssignCommand().

Например:

Стандартный скрипт x0_o2_use_chair
садит юзера на объект (стул, диван, кресло)

void main()
{
object oChair = OBJECT_SELF;
if (!GetIsObjectValid(GetSittingCreature(OBJECT_SELF)))

{
AssignCommand(GetLastUsedBy(), ActionSit(oChair));
}
}


ПРИМЕЧАНИЕ: В тулсете есть два вида функций - стандартные (script function) и определенные пользователем (user function). В игре существует довольно много user functions, созданных ребятами из BioWare для кампании, однако их с успехом можно использовать и в своих модулях. Я пока перевожу стандартные функции, которые вы можете видеть в Скрипт Эдиторе. Биоварские пользовательские функции находятся в инклудах.

Инклуды - своего рода библиотеки пользовательских функций. Обычно в них собраны функции по одному критерию (увидите ниже). Инклуды включаются в скрипт по средствам директивы #include. Обычно инклуды включают в самом начале скрипта, до первых инструкций, чтобы функции, определенные в инклудах можно было использовать в исполняемом скрипте. Инклуды не компилируются (т.к. нету исполняемой функции - main() или StartingCondition()). При компиляции неиспользуемые пользовательские функции пропускаются.

И еще - если вы хотите просмотреть содержимое инклудов, то выполните этот порядок действий:

Откройте Скрипт Эдитор (Script Editor);
Нажмите Ctrl+O - откроется окно, где вы можете выбрать скрипт для редактирования;
Установите радиофлажек в выборе ресурсов на самую верхнюю позицию (верхняя - все скрипты, средняя - только ваши, нижняя - скрипты хак-пака);
В поле Скрипт Нэйм (название скрипта) впишите "nw_i0_" (без кавычек) и выберите тот, который вам нужен.


P.S. Вы также можете создавать свои инклуды. Просто для их использования в самом начале вашего скрипта пропишите название вашей библиотеки функций:
#include "название_вашей_базы_функций"
Но это необходимо лишь в том случае, если вы написали около десятка (или больше) функций, которые можно логически объединить по одному критерию. Выносить две-три функции в инклуд не имеет смысла.

Note: Стандартные скрипты можно (а порой и нужно) изменять. Для этого просто сохраните измененный скрипт. Если изменения вам не понравились, а вы забыли что меняли - просто удалите этот скрипт (он будет удален только из вашего модуля). В этом случае снова будет использоваться стандартный скрипт (он берется напрямую из scripts.bif).


BeginConversation (Начать беседу)
int BeginConversation(string sResRef="", object oObjectToDialog=OBJECT_INVALID)

string sResRef - пропишите здесь в кавычках название вашего дерева разговора (если не написать - запустится дефаулт разговор... какой - не известно)
object oObjectToDialog - здесь указывается тот, с кем начинается разговор (если не указать - начнется разговор с тем, кто активировал скрипт)


BlackScreen (Черный Экран - это для ДМов извращенцев используется для пыток простых людей черным экраном за плохие поступки... хотя можно и использовать в синглах для эффектного телепорта (сначала темный экран, а когда он проявляется вы уже в другой части света... это можно увидеть в СоУ, когда выполняешь квест с кобольдами в таверне в самом первом городе, где нужно освободить повариху - там этот эффект хорошо можно разглядеть))
void BlackScreen(object oCreature)

object oCreature - бедный oCreature, на который будем юзать черный экран (кстати в комбинации с "открыть меню смерти" (где кнопки загрузить, выйти и респаун) получается интерестная вещь...)


BootPC (Забутить игрока - бутим, бутим, пока у того глаза на лоб не полезут... точнее выгоняем с сервера)
void BootPC(object oPlayer)

object oPlayer - бедный подопытный игрок...

Note: Эта функция работает только в мультиплеере. Чтобы завершить модуль в сигле используйте EndGame().

Change*, Clear*, Copy*,Create*

ChangeFaction (Присоединяет oObjectToChangeFaction к фракции, к которой принадлежит oMemberOfFactionToJoin)
void ChangeFaction(object oObjectToChangeFaction, object oMemberOfFactionToJoin)

object oObjectToChangeFaction - это тот, кто будет менять фракцию...
object oMemberOfFactionToJoin - а это тот, к кому будут присоеденяться (точнее к чьей фракции будут присоеденяться)

Note: Эта функция работает только между двумя NPC.

ChangeToStandardFaction (Сменить фракцию на стандартную - тоже, что и выше, только используются стандартные фракции)
void ChangeToStandardFaction(object oCreatureToChange, int nStandardFaction)

object oCreatureToChange - тот, кто будет менять фракцию
int nStandardFaction - одна из стандартных фракций (список ниже):
STANDARD_FACTION_COMMONER - коммонеры (или просто люди, которым на тебя параллельно)
STANDARD_FACTION_DEFENDER - дефендеры (фракция защитников)
STANDARD_FACTION_HOSTILE - хостайл (враждебная фракция)
STANDARD_FACTION_MERCHANT - мерчанты (торговцы иными словами)


ClearAllActions (Функция очищает все действия, которые выполнялись объектом - очень полезная функция, когда по скрипту надо срочно переменить деятельность персонажа, а не ожидать своей очереди)
void ClearAllActions(int nClearCombatState=FALSE)

int nClearCombatState - если FALSE, то ничего особенного, а если TRUE - то очищаются даже все действия во время битвы, сразу останавливается боевая музыка и появляется возможность отдыха


ClearPersonalReputation (очищает репутацию персонажа в глазах определенного персонажа)
void ClearPersonalReputation(object oTarget, object oSource=OBJECT_SELF)

object oTarget - тот, чью репутацию очищаем
object oSource - тот, в чьих глазах очищаем репутацию


CopyItem (Скопировать вещь в указанный инвентарь, копирует все, включая сумки, но чтобы те в свою очередь были пустые, иначе копирование выдаст ошибку)
object CopyItem(object oItem, object oTargetInventory=OBJECT_INVALID)

object oItem - вещь, которую надо скопировать
object oTargetInventory - объект, в инвентарь которого будет копироваться вещь... если это место оставить пустым, то вещь скопируется туда же, где находится первоисточник


CopyObject (Копировать обьект, любой, в том числе и вещь... может копировать все, включая вас самих... если это вещь, то копирует в определенный инвентарь, если что то иное - в определенную локацию... кстати, можно скопировать объект так, что он создастся с новым тэгом)
object CopyObject(object oSource, location locLocation, object oOwner = OBJECT_INVALID, string sNewTag = "")

object oSource - объект, который надо копировать
location locLocation - местоположение, куда объект копируется
object oOwner - владелец инвентаря(если копируемый объект - вещь), куда будет копироваться объект
string sNewTag - новый тэг (ярлык), который будет дан копированному объекту


cos (Извлекает косинус из числа)
float cos(float fValue)

float fValue - число, из которого извлекается косинус


CreateItemOnObject (Создает вещь в инвентаре объекта)
object CreateItemOnObject(string sItemTemplate, object oTarget=OBJECT_SELF, int nStackSIZE=1)

string sItemTemplate - тэг создаваемого объекта (ярлык)
object oTarget - объект, в инвентарь которого создается объект
int nStackSIZE - размер стэка (наверно это для стрел, болтов и т.п.)


CreateObject (Просто и со вкусом - создать объект...)
object CreateObject(int nObjectType, string sTemplate, location lLocation, int bUseAppearAnimation=FALSE, string sNewTag="")

int nObjectType - это определяет, чем является объект... выбираем из списка:
OBJECT_TYPE_ITEM - объект является вещью
OBJECT_TYPE_CREATURE - объектом является создание (живое существо)
OBJECT_TYPE_PLACEABLE - объектом является плесейбел (ящики, сундуки, столбы, стулья и т.д.)
OBJECT_TYPE_STORE - объектом является... является... является магазин (пока переводил написал три раза =) )
OBJECT_TYPE_WAYPOINT - объектом является вейпоинт (я например использую для пометки места смерти персонажа, чтобы при воскрешении его отправляло именно в то место)...
P.S. Обязательно правильно укажите тип объекта!!! Иначе функция просто напросто не сработает!!!
string sTemplate - тэг (ярлык) объекта, который мы хотим создать
location lLocation - место, где мы создаем объект
int bUseAppearAnimation - использование анимации... TRUE или FALSE
string sNewTag - задаем созданному объекту новый тэг, если это нужно (я например задаю для вейпоинта имя умершего)


Далее в функциях мы наблюдаем странные строки d10, d100 и т.д.
И так, представим "кубик" с 6 гранями. Это и будет d6.
С 10ю гранями - d10, со 100та гранями - d100.
Игра как бы "кидает кубик" с определенным числом граней, и возвращает то, что выпадет на "верхней" грани.
Функция представляется как:
int d10(int nNumDice=1)

int nNumDice - это число раз, которое должен быть брошен кубик. Это НЕ умножение на выпавшее число на кубике.
ПРИМЕР:
int DC = d10(5);

В этом примере в переменную DC запишется сумма выпавших чисел на кубике, а бросков будет 5. Пр. первый бросок - 3, второй - 6, третий - 1, четвертый - 8, пятый - 4: функция вернет 3+6+1+8+4.

 

Прервемся и изучим еще несколько деталей из Тулсета.


Все уже наверняка знают такие проверялки, как if, while, switch - case?
Но некоторые не знают, как применять их в Тулсете...
И так, этот краткий курс поможет вам понять, что где и как работает.

Начнем с IF.
И так, для чего нужна эта проверка... А вот для чего. Иногда при создании квестов вам надо проверить, например, какой уровень у персонажа, или сколько у него золота, или вообще это воин или кто то еще? И если догадка подтверждается - выполняется то, что вам нужно, а если нет - или выполняется что то другое, или просто переходит к обработке след. функции... расмотрим на примере:


void main()
{
object oPC = GetEnteringObject();
if (GetIsDM(oPC))
{
ActionSpeakString("ДМ на шарде, ура ура ура!!!", TALKVOLUME_SHOUT)
}
}


Этот скрипт скажет в шаут, что на сервер зашел ДМ - т.е. в шауте буквально будет "[SERVER] ДМ на шарде, ура ура ура!!!" Функция определяет, что если зашедший (object oPC - GetEnteringObject() игрок ДМ (GetIsDM(oPC)) - то он скажет что мы задали между фигурных скобок после if. Но если же это будет НЕ ДМ - скрипте ничего не предпримет.

Дополним скрипт:

void main()
{
object oPC = GetEnteringObject();
if (GetIsDM(oPC))
{
ActionSpeakString("ДМ на шарде, ура ура ура!!!", TALKVOLUME_SHOUT)
}
else
ActionSpeakString("Опять простой игрок, ну надо же...", TALKVOLUME_SHOUT)
}

В этом случае если зашедший игрок НЕ ДМ скрипт скажет "Опять простой игрок, ну надо же..." в шаут.
Вообще это можно разобрать так: IF(если) then (то-то), else(иначе) then (то-то).

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

Дополним скрипт:

void main()
{
object oPC = GetEnteringObject();

if (GetIsDM(oPC))
{
ActionSpeakString("ДМ на шарде, ура ура ура!!!", TALKVOLUME_SHOUT)
}
else if (GetIsPC(oPC))
{
ActionSpeakString("Опять простой игрок, ну надо же...", TALKVOLUME_SHOUT)
}
else
{
ActionSpeakString("Гадость, это уже и не игрок, и не ДМ... ЧИТО ЭТО???", TALKVOLUME_SHOUT)
}
}

Здесь мы использовали такую структуру: IF(если) then (то-то), else(иначе) IF(если) then (то-то), else(иначе) then (то-то)
Функция сначала смотри, зашел ли ДМ - если нет, смотрит, игрок ли это (GetIsPC(oPC)), и если и это неверно - говорит в шаут "Гадость, это уже и не игрок, и не ДМ... ЧИТО ЭТО???"

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

В Авроре существует один тернарный оператор (выполняет действия над 3 выражениями). Записывается он довольно просто, но с первого взгляда не понятно: (логическое_выражение) ? (выражение_1) : (выражение_2).
Эта запись эквивалентна следующей:
if (логическое_выражение == TRUE) { (выражение_1) }
else { выражение_2) }

Ну например, вот такое выражение:

string sDatabase = "mydb";
object oPlayer = GetEnteringObject();
int nHitPoints = (GetLocalInt(GetModule(), GetName(oPlayer) + ".HitPoints")) ? GetLocalInt(GetModule(), GetName(oPlayer) + ".HitPoints") : GetCampaignInt(sDatabase, "HitPoints", oPlayer);
Чтобы не сильно нагружать сервер, читая все время из базы данных, мы сначала проверяем, существует ли какое-нибудь значение в локальной переменной на уровне модуля. Если да - используем его, если нет - значит был рестарт, данные потерялись, используем информацию из базы данных. Это часть функции, которая восстанавливает ХП при перезаходе на сервер.

Далее while. Это цикл (loop) с начальным условием. Цикл будет выполняться до тех пор, пока условие истинно. Цикл может не выполнится ниразу.
И так, пример, и вы поймете что к чему:

void main()
{
object oPC = GetEnteringObject();
object oLootItem=GetFirstItemInInventory(oPC);

while(GetIsObjectValid(oLootItem))
{
oLootItem=GetNextItemInInventory(oPC);
}
}


Что делает эта вещь... Короче, сначала берется самая первая вещь из инвентара (object oLootItem=GetFirstItemInInventory(oPC), потом функция while проверяет, находится ли эта вещь в инвентаре (while(GetIsObjectValid(oLootItem))), и если да, то выполняется то, что заключенно между фигурными скобками после while. Это зацилненная функция, так как она будет действовать, пока то что она проверяет будет верно (в конце она берет следуюoe. вещь из инвентаря oLootItem=GetNextItemInInventory(oPC); и опять идет проверка на ее наличие в инвентаре, и если она прошла успешно - опять выполняется то, что заключенно между фигурными скобками, и будет так до того момента, когда при проверке окажется, что вещи такой в инвентаре нет, и она прекратит работу). Кстати, эту функцию можно прервать насильно - в конце дописать "break;", и тогда эта функция напоминает что то типа IF.

Кроме того существует цикл с условием в конце тела. Разница в том, что этот цикл выполнится хотя бы один раз.
do
{

}
while (condition);

В инструкциях предусмотрены следующие операторы
&& - логическое "И"
|| - логическое "ИЛИ"
! - логическое "НЕ"

объект игрок и ДМ (GetisPC() возвращает, является ли объект клиентом)


if (GetIsPC(oPC) && GetIsDM(oPC))
{
ActionSpeakString("ДМ на шарде, ура ура ура!!!", TALKVOLUME_SHOUT)
}
// объект игрок, но не ДМ
else if (GetIsPC(oPC) && !GetIsDM(oPC)
{
<...>
}


Фух, case разберем потом =)

И не забывайте при создании скрипта после каждой функции ставить ";"

 

 

 

 

Вторая часть статьи >>>

 

 

Внимание!
Данный текст является интеллектуальной собственностью. Любое цитирование материалов допустимо только со ссылкой на авторов!

 

 


Design by DBColl - 2003 -
Hosted by uCoz