Useful Scripts/ru

From Dragon Age Toolset Wiki
< Useful Scripts
Revision as of 07:18, 14 October 2011 by Kelamor (Talk | contribs) (Edit)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
Примеры скриптов
Начало / Русская DA Builder Wiki / Поделиться ВКонтакте
Скрипты
все статьи категории
описание функций

На этой странице будут приведены примеры скриптов, которые часто используются.

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

Смотрите также: Шаблоны скриптов PRCSCR

Запуск катсцены посредством триггера

Создайте скрипт:

#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''');

для функции

  void WR_SetFollowerState(object oCreature, int nState, int nSendEvent = TRUE, int nMinLevel = 0, '''int bPreventLevelup''' = FALSE)

Для того, чтобы вновь присоединённый спутник мог получать экспу, необходимо сбросить флаг 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  • русский