Difference between revisions of "Useful Scripts/ru"

From Dragon Age Toolset Wiki
Jump to: navigation, search
(Создание)
 
(Правка)
Line 37: Line 37:
 
         break;
 
         break;
 
     }
 
     }
     if (!bEventHandled) //If this event wasn't handled by this script, let the core script try
+
     if (!bEventHandled) //Если событие не обработано, то перенаправляем исходному скрипту
 
     {
 
     {
 
         HandleEvent(ev, RESOURCE_SCRIPT_TRIGGER_CORE);
 
         HandleEvent(ev, RESOURCE_SCRIPT_TRIGGER_CORE);
Line 44: Line 44:
 
</dascript>
 
</dascript>
  
И задайте его как скрипт, обрабатывающий события для триггера, который должен запускать катсцену.
+
И задайте его скриптом, обрабатывающим события для триггера, который должен запускать катсцену.
  
 
== Добавление спутника в партию ==
 
== Добавление спутника в партию ==
Line 55: Line 55:
 
</dascript>
 
</dascript>
  
Comment : originally, the above example used the function IsPlayer, which doesn't seem to exist.
+
Комментарий: Изначально использовалась функция IsPlayer, которая, по всей видимости не существует.
 +
 
 +
Отметим, что при использовании тулсета версии 1.0.982.0, вызов функции UT_HireFollower() не позволяет присоединённому спутнику получать экспу. Это происходит вследствие вызова
  
Note that with Toolset v1.0.982.0, calling UT_HireFollower() will result in a follower who's unable to gain xp. This happens due to the call of
 
 
<dascript>
 
<dascript>
 
   WR_SetFollowerState(oFollower, FOLLOWER_STATE_ACTIVE, TRUE, 0, '''TRUE''');
 
   WR_SetFollowerState(oFollower, FOLLOWER_STATE_ACTIVE, TRUE, 0, '''TRUE''');
 
</dascript>
 
</dascript>
to the function
+
для функции
 
<dascript>
 
<dascript>
 
   void WR_SetFollowerState(object oCreature, int nState, int nSendEvent = TRUE, int nMinLevel = 0, '''int bPreventLevelup''' = FALSE)
 
   void WR_SetFollowerState(object oCreature, int nState, int nSendEvent = TRUE, int nMinLevel = 0, '''int bPreventLevelup''' = FALSE)
 
</dascript>
 
</dascript>
To enable the xp gain, the flag CREATURE_REWARD_FLAGS needs to be cleared from the follower after the hired event was processed (there the flag is set). For now the best/easiest approach to take might be to make a copy of UT_HireFollower in an include file and rename it something like UT_HireFollower_Fixed, then make the following change:
+
 
 +
Для того, чтобы вновь присоединённый спутник мог получать экспу, необходимо сбросить флаг CREATURE_REWARD_FLAGS после окончания процедуры присоединения(которая его и устанавливает). Можно использовать следующий способ: создать подключаемый скрипт с изменённой функцией UT_HireFollower, переименовав её как UT_HireFollower_Fixed, со следующими изменениями:
  
 
<dascript>
 
<dascript>
 
     WR_SetFollowerState(oFollower, FOLLOWER_STATE_ACTIVE, TRUE, 0, TRUE);
 
     WR_SetFollowerState(oFollower, FOLLOWER_STATE_ACTIVE, TRUE, 0, TRUE);
 
</dascript>
 
</dascript>
to
+
изменить на
 
<dascript>
 
<dascript>
 
     WR_SetFollowerState(oFollower, FOLLOWER_STATE_ACTIVE, TRUE, 0, bPreventLevelup);
 
     WR_SetFollowerState(oFollower, FOLLOWER_STATE_ACTIVE, TRUE, 0, bPreventLevelup);
 
</dascript>
 
</dascript>
  
== Have an enemy play possum and then get up to fight ==
+
== Восстание мёртвых ==
  
Set the creature's CREATURE_SPAWN_DEAD variable to 2.
+
Установите у существа переменную CREATURE_SPAWN_DEAD как '''2'''.
  
When it's time for the creature to rise and attack, execute the following script commands:
+
Когда придёт время существу подняться и атаковать выполните следующий код:
  
 
<dascript>
 
<dascript>
Line 86: Line 88:
 
WR_SetObjectActive(oCreature, TRUE);
 
WR_SetObjectActive(oCreature, TRUE);
 
SetCommandable(oCreature, TRUE);
 
SetCommandable(oCreature, TRUE);
// Make sure to set this flag back to 0 to avoid problems with savegames.
+
// Убедитесь, что переменная, установленная ранее, сброшена в ноль, для избежания проблем с сохранёнками.
 
SetLocalInt(oCreature, CREATURE_SPAWN_DEAD, 0);
 
SetLocalInt(oCreature, CREATURE_SPAWN_DEAD, 0);
 
UT_CombatStart(oCreature, oPC);
 
UT_CombatStart(oCreature, oPC);
 
</dascript>
 
</dascript>
  
== Insert content into an existing area ==
+
== Добавление контента в существующую локацию ==
  
If you want to add new content on to an existing area (for example, putting a new character or area transition door into an area that exists in the single-player campaign) there are two different ways to do it. One is to override the existing area with a new area of your own design that duplicates the original with the exception of your additions. This is straightforward to do but can interact poorly with other add-ons - you can only have one version of an area active at a time. '''[To Editor: Edit in a Custom Module or the existing Single Player Campaign Module?]'''
+
Если вы хотите добавить новый контент в существующую локацию(для примера, добавить нового персонажа или новую дверь перехода в локацию основной компании) вы можете выбрать один из двух методов.
  
A more elegant and extensible approach is to use a [[PRCSCR]]_-prefixed M2DA. The PRCSCR M2DA has a very simple structure and a simple but profound effect:
+
Один из них, это замещение существующей локации новой локацией с уже внесёнными вами изменениями. Это прямой, но, вследствие отсутствия совместимости с модами других товарищей, глупый путь.
  
*ID - a unique integer identifier for each row
+
Более правильный и удобный путь - использование {{ulink|PRCSCR|системы PRCSCR}}.  
*AreaListName - a string that identifies a specific area list, or the special keyword "any".
+
*Script - the name of a script file.
+
  
Whenever a player enters an area in an area list in this M2DA the associated script will be run. A modder can therefore include a script with his mod that will be run when the player enters an existing area that he didn't create. This script can freely add or remove placeables and creatures and perform whatever other modifications to the area that a script is capable of doing.
+
Нижеприведённый пример добавляет новое существо в существующую локацию основной компании:
 
+
Note that the script will be run every time the player enters the area, so you'll want to have an associated plot flag to ensure that the changes are only made once.
+
 
+
The following example is a script that adds a new character from an add-on module to an existing area in the main game:
+
  
 
<dascript>
 
<dascript>
// this is the name of a precreated plot file "joblos_quest" prefixed with the special "plt_"
 
// "plt_" + quest name allows you to reference the flag names as constants.
 
 
#include "plt_joblos_quest"  
 
#include "plt_joblos_quest"  
 
#include "wrappers_h"
 
#include "wrappers_h"
Line 118: Line 112:
 
     if (WR_GetPlotFlag(PLT_JOBLOS_QUEST, JOBLO_ADDED_TO_TOWN) == FALSE)
 
     if (WR_GetPlotFlag(PLT_JOBLOS_QUEST, JOBLO_ADDED_TO_TOWN) == FALSE)
 
     {
 
     {
         object oTown = GetObjectByTag("lot100ar_lothering"); //An area's tag is the same as its resource name
+
         object oTown = GetObjectByTag("lot100ar_lothering"); //Тэг локации, в тулсете указан как имя ресурса
         vector vJobloLocation = Vector(126.745f, 120.724f, 0.460568f); // See below for how to get these coordinates
+
         vector vJobloLocation = Vector(126.745f, 120.724f, 0.460568f); // О том, как получить координаты, смотрите ниже
  
 
         CreateObject(
 
         CreateObject(
 
             OBJECT_TYPE_CREATURE,
 
             OBJECT_TYPE_CREATURE,
 
             R"joblo.utc",
 
             R"joblo.utc",
             Location(oTown, vJobloLocation, 180.0f); //See below for how to get the value for orientation
+
             Location(oTown, vJobloLocation, 180.0f); //О том, как определить ориентацию, смотрите ниже
 
         )
 
         )
  
Line 132: Line 126:
 
</dascript>
 
</dascript>
  
Since you can't add [[waypoint]]s to an existing area you'll need to enter the position and orientation values for the target location manually. You can find them by creating a local copy of the area in question and temporarily adding a waypoint to copy down the coordinates and orientation you'll need.
+
Так как нельзя добавить в существующую локацию {{ulink|waypoint|точку назначения}}, вам необходимо знать позицию и ориентацию точки, куда вы будете добавлять существо. Чтобы узнать их, я открываю в тулсете необходимую локацию, ставлю точку назначения и списываю её координаты.
  
== Move Inventory (e.g. remove and store player's equipment) ==
+
== Перемещение предметов между объектами ==
  
Here's a fairly general function for moving items from one creature / placeable to another.
+
Возможности:
 
+
* Перемещение шмоток игрока(в том числе снаряжения и денег) в сундук, когда игрок попадает в тюрьму (с возможностью оставления его голым).
Applications might include
+
* Замещение снаряжения НПС новым набором, используя спрятанный в потаённом месте размещаемый объект(РО).
 
+
* Удаление всех предметов НПС, за исключением его снаряжения.
* Moving a player's equipped items, inventory and money to a chest while they are in jail (with an option to prevent them being naked).
+
* Replacing an NPC's equipment with a new set from a nearby invisible placeable.
+
* Removing all items from an NPC except their equipment.  
+
 
<dascript>
 
<dascript>
 
/**
 
/**
* @brief Move inventory from one object to another
+
* @brief Перемещение предметов между объектами
*
+
* Параметры:
* @param oSource        - object to move inventory from
+
* @param oSource        - объект-источник
* @param oTarget        - object to move inventory to
+
* @param oTarget        - объект-цель
* @param bUnequipSource  - TRUE if any items that the source has equipped should be moved
+
* @param bUnequipSource  - TRUE если снаряжение перемещается
* @param bEquipTarget    - TRUE if target should equip items received if possible
+
* @param bEquipTarget    - TRUE если полученные объектом-целью предметы будут снаряжены на него (по возможности)
* @param bRemoveClothing - TRUE if chest slot should be unequipped when bUnequipSource is TRUE
+
* @param bRemoveClothing - TRUE если одежда должна переместиться (при включенном параметре bUnequipSource
* @param bMoveMoney      - TRUE if creature money should move from source to target
+
* @param bMoveMoney      - TRUE если деньги должны быть перемещены
 
*
 
*
* The target will acquire the items even if its maximum inventory is exceeded.
+
* Объект-цель получает предметы, даже если её инвентарь уже заполнен под завязку.
* If the source contains more than one item for an inventory slot, the outcome of equipping
+
* Если перемещаются несколько предметов, которые могут быть снаряжены в какой-либо из слотов объекта-цели, снаряжение произойдёт в случайном порядке.
* on the target is unpredictable.
+
* Если деньги перемещаются от существа к размещаемому объекту, то создаётся предмет "деньги".
* If money is moved from a creature to a placeable, money items are created.
+
 
*
 
*
 
* @returns void
 
* @returns void
Line 223: Line 213:
 
</dascript>
 
</dascript>
  
== Create a lootable placeable that vanishes when looted ==
+
== Использование размещаемого объекта(РО) ==
  
For a player-usable placeable, use the following event script to make it give its contents to the player and then vanish when clicked on.
+
Для размещаемых объектов, используемых игроком, примените следующую обработку события, что позволить передать игроку содержимое РО и уничтожить его.
  
 
<dascript>
 
<dascript>
Line 246: Line 236:
 
</dascript>
 
</dascript>
  
If you wanted to use standard resources you could achieve the same thing (though not destroying the placeable) simply by adding "_autoloot" to the end of the placeable's tag.
+
Можно достичь того же эффекта (без уничтожения РО) просто добавив суффикс "_autoloot" в тэг размещаемого объекта.
  
== Move the player to a new area after a cutscene plays ==
+
== Перемещение игрока в новую локацию после окончания катсцены ==
  
Stand-alone cutscenes have an "end script" parameter that sets a script to run once the cutscene ends. Use a script such as the following:
+
В свойствах катсцены присутствует параметр "end script", который устанавливает, какой скрипт запускается после окончания катсцены. Используйте что-то наподобие:
  
 
<dascript>
 
<dascript>
 
void main()
 
void main()
 
{
 
{
   DoAreaTransition("destination_area_tag", "destination_waypoint_tag");
+
   DoAreaTransition("тэг_локации_назначения", "тэг_точки_назначения");
 
}
 
}
 
</dascript>
 
</dascript>
  
== Override Events (e.g. those in player_core) ==
+
== Переопределение обработки событий ==
  
Look here: [[Event override]]
+
Смотрите здесь: {{ulink|Event override|Переопределение обработки событий}}
  
 
== Переводчики ==
 
== Переводчики ==

Revision as of 07:45, 9 November 2010

Скрипты
все статьи категории
описание функций

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

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

Смотрите также: Шаблоны скриптов 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("тэг_локации_назначения", "тэг_точки_назначения");
}

Переопределение обработки событий

Смотрите здесь: Переопределение обработки событий

Переводчики

kelamor / Страница / Почта / Как переводить DA Builder Wiki

Язык: English  • русский