Difference between revisions of "Useful Scripts/ru"
(Создание) |
(Правка) |
||
Line 37: | Line 37: | ||
break; | break; | ||
} | } | ||
− | if (!bEventHandled) // | + | 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> | ||
− | + | Комментарий: Изначально использовалась функция IsPlayer, которая, по всей видимости не существует. | |
+ | |||
+ | Отметим, что при использовании тулсета версии 1.0.982.0, вызов функции UT_HireFollower() не позволяет присоединённому спутнику получать экспу. Это происходит вследствие вызова | ||
− | |||
<dascript> | <dascript> | ||
WR_SetFollowerState(oFollower, FOLLOWER_STATE_ACTIVE, TRUE, 0, '''TRUE'''); | WR_SetFollowerState(oFollower, FOLLOWER_STATE_ACTIVE, TRUE, 0, '''TRUE'''); | ||
</dascript> | </dascript> | ||
− | + | для функции | |
<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> | ||
− | + | ||
+ | Для того, чтобы вновь присоединённый спутник мог получать экспу, необходимо сбросить флаг 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> | ||
− | + | изменить на | |
<dascript> | <dascript> | ||
WR_SetFollowerState(oFollower, FOLLOWER_STATE_ACTIVE, TRUE, 0, bPreventLevelup); | WR_SetFollowerState(oFollower, FOLLOWER_STATE_ACTIVE, TRUE, 0, bPreventLevelup); | ||
</dascript> | </dascript> | ||
− | == | + | == Восстание мёртвых == |
− | + | Установите у существа переменную CREATURE_SPAWN_DEAD как '''2'''. | |
− | + | Когда придёт время существу подняться и атаковать выполните следующий код: | |
<dascript> | <dascript> | ||
Line 86: | Line 88: | ||
WR_SetObjectActive(oCreature, TRUE); | WR_SetObjectActive(oCreature, TRUE); | ||
SetCommandable(oCreature, TRUE); | SetCommandable(oCreature, TRUE); | ||
− | // | + | // Убедитесь, что переменная, установленная ранее, сброшена в ноль, для избежания проблем с сохранёнками. |
SetLocalInt(oCreature, CREATURE_SPAWN_DEAD, 0); | SetLocalInt(oCreature, CREATURE_SPAWN_DEAD, 0); | ||
UT_CombatStart(oCreature, oPC); | UT_CombatStart(oCreature, oPC); | ||
</dascript> | </dascript> | ||
− | == | + | == Добавление контента в существующую локацию == |
− | + | Если вы хотите добавить новый контент в существующую локацию(для примера, добавить нового персонажа или новую дверь перехода в локацию основной компании) вы можете выбрать один из двух методов. | |
− | + | Один из них, это замещение существующей локации новой локацией с уже внесёнными вами изменениями. Это прямой, но, вследствие отсутствия совместимости с модами других товарищей, глупый путь. | |
− | + | Более правильный и удобный путь - использование {{ulink|PRCSCR|системы PRCSCR}}. | |
− | + | ||
− | + | ||
− | + | Нижеприведённый пример добавляет новое существо в существующую локацию основной компании: | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
<dascript> | <dascript> | ||
− | |||
− | |||
#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"); // | + | object oTown = GetObjectByTag("lot100ar_lothering"); //Тэг локации, в тулсете указан как имя ресурса |
− | vector vJobloLocation = Vector(126.745f, 120.724f, 0.460568f); // | + | 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); // | + | Location(oTown, vJobloLocation, 180.0f); //О том, как определить ориентацию, смотрите ниже |
) | ) | ||
Line 132: | Line 126: | ||
</dascript> | </dascript> | ||
− | + | Так как нельзя добавить в существующую локацию {{ulink|waypoint|точку назначения}}, вам необходимо знать позицию и ориентацию точки, куда вы будете добавлять существо. Чтобы узнать их, я открываю в тулсете необходимую локацию, ставлю точку назначения и списываю её координаты. | |
− | == | + | == Перемещение предметов между объектами == |
− | + | Возможности: | |
− | + | * Перемещение шмоток игрока(в том числе снаряжения и денег) в сундук, когда игрок попадает в тюрьму (с возможностью оставления его голым). | |
− | + | * Замещение снаряжения НПС новым набором, используя спрятанный в потаённом месте размещаемый объект(РО). | |
− | + | * Удаление всех предметов НПС, за исключением его снаряжения. | |
− | + | ||
− | + | ||
− | + | ||
<dascript> | <dascript> | ||
/** | /** | ||
− | * @brief | + | * @brief Перемещение предметов между объектами |
− | * | + | * Параметры: |
− | * @param oSource - | + | * @param oSource - объект-источник |
− | * @param oTarget - | + | * @param oTarget - объект-цель |
− | * @param bUnequipSource - TRUE | + | * @param bUnequipSource - TRUE если снаряжение перемещается |
− | * @param bEquipTarget - TRUE | + | * @param bEquipTarget - TRUE если полученные объектом-целью предметы будут снаряжены на него (по возможности) |
− | * @param bRemoveClothing - TRUE | + | * @param bRemoveClothing - TRUE если одежда должна переместиться (при включенном параметре bUnequipSource |
− | * @param bMoveMoney - TRUE | + | * @param bMoveMoney - TRUE если деньги должны быть перемещены |
* | * | ||
− | * | + | * Объект-цель получает предметы, даже если её инвентарь уже заполнен под завязку. |
− | * | + | * Если перемещаются несколько предметов, которые могут быть снаряжены в какой-либо из слотов объекта-цели, снаряжение произойдёт в случайном порядке. |
− | + | * Если деньги перемещаются от существа к размещаемому объекту, то создаётся предмет "деньги". | |
− | * | + | |
* | * | ||
* @returns void | * @returns void | ||
Line 223: | Line 213: | ||
</dascript> | </dascript> | ||
− | == | + | == Использование размещаемого объекта(РО) == |
− | + | Для размещаемых объектов, используемых игроком, примените следующую обработку события, что позволить передать игроку содержимое РО и уничтожить его. | |
<dascript> | <dascript> | ||
Line 246: | Line 236: | ||
</dascript> | </dascript> | ||
− | + | Можно достичь того же эффекта (без уничтожения РО) просто добавив суффикс "_autoloot" в тэг размещаемого объекта. | |
− | == | + | == Перемещение игрока в новую локацию после окончания катсцены == |
− | + | В свойствах катсцены присутствует параметр "end script", который устанавливает, какой скрипт запускается после окончания катсцены. Используйте что-то наподобие: | |
<dascript> | <dascript> | ||
void main() | void main() | ||
{ | { | ||
− | DoAreaTransition(" | + | DoAreaTransition("тэг_локации_назначения", "тэг_точки_назначения"); |
} | } | ||
</dascript> | </dascript> | ||
− | == | + | == Переопределение обработки событий == |
− | + | Смотрите здесь: {{ulink|Event override|Переопределение обработки событий}} | |
== Переводчики == | == Переводчики == |
Revision as of 07:45, 9 November 2010
Скрипты |
---|
|
На этой странице будут приведены примеры скриптов, которые часто используются.
Пожалуйста, если у вас есть скрипты, которыми вы можете поделиться, то не стесняйтесь, добавляйте. При большом количестве примеров можно будет разбить страницу на конкретные темы.
Смотрите также: Шаблоны скриптов PRCSCR
Contents
- 1 Запуск катсцены посредством триггера
- 2 Добавление спутника в партию
- 3 Восстание мёртвых
- 4 Добавление контента в существующую локацию
- 5 Перемещение предметов между объектами
- 6 Использование размещаемого объекта(РО)
- 7 Перемещение игрока в новую локацию после окончания катсцены
- 8 Переопределение обработки событий
- 9 Переводчики
Запуск катсцены посредством триггера
Создайте скрипт:
#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("тэг_локации_назначения", "тэг_точки_назначения"); }
Переопределение обработки событий
Смотрите здесь: Переопределение обработки событий
Переводчики
kelamor / Страница / Почта / Как переводить DA Builder Wiki
Язык: | English • русский |
---|