Useful Scripts/ru
Примеры скриптов |
Начало / Русская DA Builder Wiki / Поделиться ВКонтакте
|
Скрипты |
---|
|
На этой странице будут приведены примеры скриптов, которые часто используются.
Пожалуйста, если у вас есть скрипты, которыми вы можете поделиться, то не стесняйтесь, добавляйте. При большом количестве примеров можно будет разбить страницу на конкретные темы.
Смотрите также: Шаблоны скриптов PRCSCR
Contents
- 1 Запуск катсцены посредством триггера
- 2 Добавление спутника в партию
- 3 Восстание мёртвых
- 4 Добавление контента в существующую локацию
- 5 Перемещение предметов между объектами
- 6 Использование размещаемого объекта(РО)
- 7 Перемещение игрока в новую локацию после окончания катсцены
- 8 Переопределение обработки событий
Запуск катсцены посредством триггера
Создайте скрипт:
#include "events_h" #include "global_objects_h" #include "utility_h" void main () { event ev = GetCurrentEvent(); int nEventType = GetEventType(ev); int bEventHandled = FALSE; switch (nEventType) { case EVENT_TYPE_ENTER: { object oCreature = GetEventCreator(ev); if(GetObjectActive(OBJECT_SELF) && IsPartyMember(oCreature)) { resource rCutscene = R"my_cutscene.cut"; CS_LoadCutscene(rCutscene); SetObjectActive(OBJECT_SELF, FALSE); } } break; } if (!bEventHandled) //Если событие не обработано, то перенаправляем исходному скрипту { HandleEvent(ev, RESOURCE_SCRIPT_TRIGGER_CORE); } }
И задайте его скриптом, обрабатывающим события для триггера, который должен запускать катсцену.
Добавление спутника в партию
if(IsPartyMember(oCreature)) { object oFollower = GetObjectByTag("myfollower"); UT_HireFollower(oCreature, oFollower); }
Комментарий: Изначально использовалась функция IsPlayer, которая, по всей видимости не существует.
Отметим, что при использовании тулсета версии 1.0.982.0, вызов функции UT_HireFollower() не позволяет присоединённому спутнику получать экспу. Это происходит вследствие вызова
WR_SetFollowerState(oFollower, FOLLOWER_STATE_ACTIVE, TRUE, 0, '''TRUE''');
для функции
Для того, чтобы вновь присоединённый спутник мог получать экспу, необходимо сбросить флаг CREATURE_REWARD_FLAGS после окончания процедуры присоединения(которая его и устанавливает). Можно использовать следующий способ: создать подключаемый скрипт с изменённой функцией UT_HireFollower, переименовав её как UT_HireFollower_Fixed, со следующими изменениями:
WR_SetFollowerState(oFollower, FOLLOWER_STATE_ACTIVE, TRUE, 0, TRUE);
изменить на
WR_SetFollowerState(oFollower, FOLLOWER_STATE_ACTIVE, TRUE, 0, bPreventLevelup);
Восстание мёртвых
Установите у существа переменную CREATURE_SPAWN_DEAD как 2.
Когда придёт время существу подняться и атаковать выполните следующий код:
#include "wrappers_h" ... WR_SetObjectActive(oCreature, TRUE); SetCommandable(oCreature, TRUE); // Убедитесь, что переменная, установленная ранее, сброшена в ноль, для избежания проблем с сохранёнками. SetLocalInt(oCreature, CREATURE_SPAWN_DEAD, 0); UT_CombatStart(oCreature, oPC);
Добавление контента в существующую локацию
Если вы хотите добавить новый контент в существующую локацию(для примера, добавить нового персонажа или новую дверь перехода в локацию основной компании) вы можете выбрать один из двух методов.
Один из них, это замещение существующей локации новой локацией с уже внесёнными вами изменениями. Это прямой, но, вследствие отсутствия совместимости с модами других товарищей, глупый путь.
Более правильный и удобный путь - использование системы PRCSCR.
Нижеприведённый пример добавляет новое существо в существующую локацию основной компании:
#include "plt_joblos_quest" #include "wrappers_h" void main() { //Check whether we've added Joblo already. if (WR_GetPlotFlag(PLT_JOBLOS_QUEST, JOBLO_ADDED_TO_TOWN) == FALSE) { object oTown = GetObjectByTag("lot100ar_lothering"); //Тэг локации, в тулсете указан как имя ресурса vector vJobloLocation = Vector(126.745f, 120.724f, 0.460568f); // О том, как получить координаты, смотрите ниже CreateObject( OBJECT_TYPE_CREATURE, R"joblo.utc", Location(oTown, vJobloLocation, 180.0f); //О том, как определить ориентацию, смотрите ниже ) WR_SetPlotFlag("joblos_quest", JOBLO_ADDED_TO_TOWN, TRUE); } }
Так как нельзя добавить в существующую локацию точку назначения (en), вам необходимо знать позицию и ориентацию точки, куда вы будете добавлять существо. Чтобы узнать их, я открываю в тулсете необходимую локацию, ставлю точку назначения и списываю её координаты.
Перемещение предметов между объектами
Возможности:
- Перемещение шмоток игрока(в том числе снаряжения и денег) в сундук, когда игрок попадает в тюрьму (с возможностью оставления его голым).
- Замещение снаряжения НПС новым набором, используя спрятанный в потаённом месте размещаемый объект(РО).
- Удаление всех предметов НПС, за исключением его снаряжения.
/** * @brief Перемещение предметов между объектами * Параметры: * @param oSource - объект-источник * @param oTarget - объект-цель * @param bUnequipSource - TRUE если снаряжение перемещается * @param bEquipTarget - TRUE если полученные объектом-целью предметы будут снаряжены на него (по возможности) * @param bRemoveClothing - TRUE если одежда должна переместиться (при включенном параметре bUnequipSource * @param bMoveMoney - TRUE если деньги должны быть перемещены * * Объект-цель получает предметы, даже если её инвентарь уже заполнен под завязку. * Если перемещаются несколько предметов, которые могут быть снаряжены в какой-либо из слотов объекта-цели, снаряжение произойдёт в случайном порядке. * Если деньги перемещаются от существа к размещаемому объекту, то создаётся предмет "деньги". * * @returns void **/ void zzzMoveInventory(object oSource, object oTarget, int bUnequipSource=FALSE, int bEquipTarget=FALSE, int bRemoveClothing=FALSE, int bMoveMoney=FALSE); void zzzMoveInventory(object oSource, object oTarget, int bUnequipSource=FALSE, int bEquipTarget=FALSE, int bRemoveClothing=FALSE, int bMoveMoney=FALSE) { object [] oItemTable; object oClothing = OBJECT_INVALID; object oItem; int nItemCount; int nGetItemsOption = GET_ITEMS_OPTION_BACKPACK; int nMoney; int nStack; object oMoney; int i = -1; if (bUnequipSource) nGetItemsOption = GET_ITEMS_OPTION_ALL; if (GetObjectType(oSource) == OBJECT_TYPE_CREATURE) if (!bRemoveClothing) oClothing = GetItemInEquipSlot(INVENTORY_SLOT_CHEST, oSource); oItemTable = GetItemsInInventory(oSource, nGetItemsOption); nItemCount = GetArraySize(oItemTable); while (++i < nItemCount) { oItem = oItemTable[i]; if (oItem != oClothing) { MoveItem(oSource, oTarget, oItem); if (bEquipTarget && (GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)) { if (GetItemType(oItemTable[i]) == ITEM_TYPE_WEAPON_RANGED) EquipItem(oTarget, oItem, INVENTORY_SLOT_MAIN, 1); else EquipItem(oTarget, oItem); } } } if (bMoveMoney) { nMoney = GetCreatureMoney(oSource); if (GetObjectType(oTarget) == OBJECT_TYPE_CREATURE) AddCreatureMoney(nMoney, oTarget); else while (nMoney) { oMoney = CreateItemOnObject(R"gen_im_copper.uti", oTarget, 1, "", TRUE); nStack = GetMaxItemStackSize(oMoney); if (nStack > nMoney) nStack = nMoney; SetItemStackSize(oMoney, nStack); nMoney -= nStack; } SetCreatureMoney(0, oSource); } }
Использование размещаемого объекта(РО)
Для размещаемых объектов, используемых игроком, примените следующую обработку события, что позволить передать игроку содержимое РО и уничтожить его.
#include "wrappers_h" void main() { event ev = GetCurrentEvent(); int nEventType = GetEventType(ev); switch (nEventType) { case EVENT_TYPE_USE: { //MoveAllItems(OBJECT_SELF, GetHero()); AddCreatureMoney (1000000, GetHero(), TRUE); Safe_Destroy_Object(OBJECT_SELF); break; } } }
Можно достичь того же эффекта (без уничтожения РО) просто добавив суффикс "_autoloot" в тэг размещаемого объекта.
Перемещение игрока в новую локацию после окончания катсцены
В свойствах катсцены присутствует параметр "end script", который устанавливает, какой скрипт запускается после окончания катсцены. Используйте что-то наподобие:
void main() { DoAreaTransition("тэг_локации_назначения", "тэг_точки_назначения"); }
Переопределение обработки событий
Смотрите здесь: Переопределение обработки событий
Язык: | English • русский |
---|