Перейти к содержимому


Фотография
- - - - -

Готовые скрипты

мануал скрипты скрипты

  • Авторизуйтесь для ответа в теме

#1 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

После старта глобальный скрипт отсчитывает 3 дня. Затем стоит только игроку уснуть, как его разбудит появление какого-либо существа, например, даэдры Мефалы в облике прекрасной девушки (aa_mephala).


1. Создайте новую журнальную запись ("aaa_note" ) и сделайте запись для нее с индексом 1. Это запись, после которой начинается отсчет времени.
Например "Она сказала, чтобы я не беспокоился и продолжал путешествие: она сама найдет меня через несколько дней"


2. Создайте в редакторе новый скрипт. Примерно такой.

begin AA_global_time2

short daysPassed
short myDay
short state
; составитель - LofZ
if ( daysPassed == 0 )
set myDay to Day
set daysPassed to 1
endif

if ( myDay != Day )
set daysPassed to daysPassed + 1
set myDay to Day
endif

if ( GetPCSleep == 1 )
if ( state == 0 )
if ( GetJournalIndex "aaa_note" == 1 )
if ( daysPassed >= 3 ) ; количество дней можно регулировать
WakeUpPC
placeatpc "aa_mephala" 1 128 1
set state to 1
endif
endif
endif
endif

if ( state == 1 )
stopscript "AA_global_time2"
endif

end



Примечания:
1. Скрипт не сразу скомпилируется. Дело в том, что он пока отсутствует в реестре. Редактор считает, что ему нечего останавливать.

Выделите кусочек

if ( state == 1 )
stopscript "AA_global_time2"
endif


и вырежьте его (клавиши alt-x).
Сохраните скрипт.
Затем вставьте все как было через клавиши ctrl-V и пересохраните.

2. После строчки WakeUpPC можно добавить
MessageBox "Вам снилось то-то и то-то"


3. Запустите новый скрипт.  Это можно сделать, напрмиер, написав journal "aaa_note" 1
"startscript "AA_global_time"
  в результате диалога (рекомендуется использовать для этого не стандартную морровиндскую тему, а новую, оригинальную).


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

Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 



  • Авторизуйтесь для ответа в теме
Сообщений в теме: 34

#2 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

Скрипт внезапно погибшего непися
для ситуации, когда игрок общался-общался с неписем или с животным, но вернувшись какого-то момента (по журнальному индексу), внезапно нашел только его тело.

Ваше дело, к какой ситуации это приложить и что убило беднягу – покушение, которое игрок не успел предотвратить, несчастный случай в яичной шахте, не успел вылечить и т.д. А технически реализовать такую ситуацию несложно.

1. Создайте жертву, непися или существо (aa_victim).
2. Создайте  новую журнальную запись 1a_vd, и напишите фразу для индекса 1, которая
свидетельствовала бы о неудачном для непися исходе квеста. Например, «Я узнал, что Каммона Тонги собираются убить такого-то», «Такой-то сказал, что дал заболевшей матке квама зелье того странного старика. Зря он это. Я ему не верю. Надо отправиться в шахту и посмотреть, как там матка квама.»
3. Используйте на жертве следующий скрипт.

 

begin VictimScript

; составитель - lofZ

if ( MenuMode == 1)
return
endif

if ( GetDeadCount "aa_victim" > 0 )
return
endif

if ( GetJournalIndex "1a_vd" < 1 )
return
endif

if ( GetJournalIndex "1a_vd" >= 1 )
Sethealth 0
return
endif

end


Теперь когда у игрока появится в журнале запись  "1a_vd" с индексом 1, бедный непись или существо превратится в хладный труп...

 


Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 


#3 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

Правила пользования этим разделом
---

Скрипт - результат проклятья Лорда Даэдры Мефалы - накладывает ограничения на нахождение игрока в какой-либо ячейке. Если он появится в указанной ниже ячейке, его ждет смерть.


1. Создайте новую журнальную запись "1a_end"  с индексом 10, который должен остановить скрипт ("Мне удалось снять проклятье Мефалы. Теперь я могу бродить по Морровинду, где вздумается").

2. Запустите глобальный скрипт. Как это сделать, см. [url="http://"http://tesforum.jino-net.ru/index.php?showtopic=178""]здесь[/url]

begin LofZ-TerribleDeath

short once

if ( menumode == 1 )
return
endif

if ( GetJournalIndex "1a_end" >= 10 )
stopscript "LofZ-TerribleDeath"
return
endif

if ( once == 0 )
if ( getPCCell "Molag Mar" == 1 )
player->sethealth 0
MessageBox "Чары Мефалы были не настолько сильными, чтобы убить вас если вы покинете шахту. Ее магия действовала по-другому. Она убивала вас, если вы оказывались в определенном городе. Теперь вы это узнали. Но поздно..."
set once to 1
endif
endif
if ( once == 0 )
if ( getPCCell "Sadrith Mora" == 1 )
player->sethealth 0
MessageBox "Чары Мефалы были не настолько сильными, чтобы убить вас если вы покинете шахту. Ее магия действовала по-другому. Она убивала вас, если вы оказывались в определенном городе. Теперь вы это узнали. Но поздно..."
set once to 1
endif
endif
if ( once == 0 )
if ( getPCCell "Balmora" == 1 )
player->sethealth 0
MessageBox "Чары Мефалы были не настолько сильными, чтобы убить вас если вы покинете шахту. Ее магия действовала по-другому. Она убивала вас, если вы оказывались в определенном городе. Теперь вы это узнали. Но поздно..."
set once to 1
endif
endif

if ( once == 0 )
if ( getPCCell "Vivec" == 1 )
player->sethealth 0
MessageBox "Чары Мефалы были не настолько сильными, чтобы убить вас если вы покинете шахту. Ее магия действовала по-другому. Она убивала вас, если вы оказывались в определенном городе. Теперь вы это узнали. Но поздно..."
set once to 1
endif
endif
if ( once == 0 )
if ( getPCCell "Ald-ruhn" == 1 )
player->sethealth 0
MessageBox "Чары Мефалы были не настолько сильными, чтобы убить вас если вы покинете шахту. Ее магия действовала по-другому. Она убивала вас, если вы оказывались в определенном городе. Теперь вы это узнали. Но поздно..."
set once to 1
endif
endif

end

Примечания:
1. Скрипт не сразу скомпилируется. Дело в том, что он пока отсутствует в реестре. Редактор считает, что ему нечего останавливать.

Выделите кусочек

if ( GetJournalIndex "1a_end" >= 10 )
stopscript "LofZ-TerribleDeath"
return
endif


и вырежьте его (клавиши alt-x).
Сохраните скрипт.
Затем вставьте все как было через клавиши ctrl-V и пересохраните.

Вы можете добавлять или удалять названия ячеек по своему усмотрению. Таким образом, можно запретить игроку посещать какие-то города или даже комнаты (интерьеры).

3. Не забудьте развивать квест и в итоге запустить журнальную запись "1a_end"  10, чтобы остановить скрипт, иначе Нереварин не сможет вообще путешествовать по миру игры.

Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 


#4 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

Правила пользования этим разделом
---

Скрипт вешается на предмет.
При активации предмета, один раз дополняется журнал. В дальнейшем предмет можно также использовать (активация все еще возможна).


1. Создайте новую журнальную запись, которая должна добавиться с нужным индексом (journal "1a_map" 12)

2. Используйте скрипт

begin L_forMap

short once


if ( once == 0 )
if ( OnActivate == 1 )
journal "1a_map" 12
activate
set once to 1
endif
endif

if ( once == 1 )
if ( onActivate == 1 )
activate
endif
endif

end


Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 


#5 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

Правила пользования этим разделом
---
Если вы захотите создать непися-вампира, вы не найдете в  TES Construction Set ни такой расы, ни такого класса, никаких опций, чтобы нажатием клавиш превратить персонажа в порождение ночи. Этого просто нет.
За создание вампира-непися отвечают всего 3 скрипта (а по сути всего один): Vampire_Aundae, Vampire_Berne и Vampire_Quarra.  Эти скрипты назначают вампирское личико и все, что с этим связано. Однако есть один недостаток: скрипты очень громоздки. Они насчитывают 88 строк, т.е. почти 2 страницы (по статистике ворда). Они связаны с вампирскими квестами Морровинда, а еще определяют отношение непися, если игрок состоит в одном из кланов.
Для самого Морровинда это просто превосходно, а вот для создания мода – слишком много лишней информации. Если создавать, скажем, плагин о вампирах, особенно, если там есть вампиры, которые выступают не как враги игрока, то стандартные скрипты могут внести путаницу.
Предлагаю вариант упрощенного стандартного скрипта:

begin L-SimpleVampire

short done

short nolore
short nohello
short noflee
short noidle
short nointruder
short nothief



if ( OnDeath == 1 )
AddItem "ingred_vampire_dust_01" 1
endif


if ( done == 0 )
AddSpell, "Vampire Blood Aundae"
AddSpell, "Vampire Attributes"
AddSpell, "Vampire Skills"
AddSpell, "Vampire Immunities"
AddSpell, "Vampire Sun Damage"
AddSpell, "Vampire Touch"
AddSpell, "Vampire Aundae Specials"
ModRestoration 75
set done to 1
endif

end

Отсутствие любого из вышеперечисленных спеллов (строки с AddSpell) приведет к тому, что лицо у персонажа будет невампирское.
Однако если нужно, вместо спеллов для клана Аунда "Vampire Blood Aundae" и "Vampire Aundae Specials", можно вписать названия спеллов для своего клана.
Этих строк достаточно, чтобы непись стал вампиром. В скрипт по необходимости вы можете добавлять другие строки, чтобы регулировать его поведение по ходу квеста.

Примечания:
Этот вампир не будет агрессивен к игроку. Чтобы сделать его агрессивным, зайдите в свойства непися, нажмите на кнопку AI и напишите в параметр Fight цифру 90 и выше.

При назначении этого скрипта новому неписю вы все равно будете видеть в конструкторе стандартное морровиндское лицо. Зато в игре – другое дело.

Крики attack и hit будут, как у обычного непися.
Отличительная черта вампира с этим скриптом - его можно первратить в обычного непися, модернизировав скрипт и убрав заклинания

Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 


#6 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

Правила пользования этим разделом
---

Этот скрипт создает своего рода ловушку для игрока-вампира.
Попав в интерьер, где находится объект с таким скриптом, игрок (если он вампир) начинает получать повреждения.
Данный скрипт используется в нашем новом плагине о вампирах «Предрассветные тени». Там было магическое освещение с эффектом вредного для вампиров дневного света, и поэтому игроку-вампиру пришлось бы несладко. Однако скрипт открывает широкие возможности: можно создавать ловушки для лабиринтов и т.д.

begin L-candle

short once
float timer
float damage
; автор – LofZ
If ( menumode == 1 )
Return
Endif

if ( PCVampire != 1 )
return
endif


if ( PCVampire == 1 )
if ( once == 0 )
set once to 1
endif
endif

if ( once == 1 )
set damage to -10
set damage to ( damage * GetSecondsPassed )
messagebox "От этих свечей исходит слишком яркий свет. Он обжигает вашу кожу."
Player->ModCurrentHealth, Damage
set once to 2
endif

if ( once == 2 )
set timer to ( timer + GetSecondsPassed )
endif
if ( timer >= 3 )
set once to 0
endif
end


Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 


#7 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

Правила пользования этим разделом
---

В Морровинде довольно часто приходится сталкиваться в турнирных поединках с неписями. Исход таких боев однообразен: как только здоровье у непися достигает определенной отметки, он начинает просить о пощаде.
Однако привычную ситуацию можно разнообразить, причем это довольно просто. Я расскажу, как помимо привычного создать альтернативный вариант, когда в бою не только израненный оппонент просит пощады, но и в случае серьезного ранения игрока непись начинает глумиться над ним и требовать, чтобы он просил прощения.

1. Итак, создайте врага с запасом здоровья больше 50 и поместите его в игре. У меня это нордлинг-задира по имени aa_mantas. Товарищ не очень сообразительный, но не лишенный своеобразного очарования. Назван в честь надоедливых монстров из Fallout, ведет себя соответствующе

2. Создайте новую журнальную запись "aaa_zadira" и запишите для нее примерно такие фразы со следующими индексами:

Вначале ячейка диалога с флажком Questname «Задира»
20 – я был атакован незнакомым нордлингом
89 – я проиграл этот бой
30 – отношения выяснены – я побил задиру
95 – я убил обидчика
90 – обидчик не стал меня убивать
В этим трех последних записях поставьте галочку Finished.

3. Используйте на обидчике следующий скрипт:

begin neuvazhay-koryto
; автор - LofZ
short once

if ( Menumode == 1 )
return
endif

if ( GetJournalIndex "aaa_zadira" >= 30 )
return
endif

if ( GetHealth <= 0 )
journal "aaa_zadira" 95
endif

if ( once == 0 )
if ( GetDistance, Player <= 350 )
forcegreeting
set once to 1
endif
endif

if ( once == 1 )
if ( GetHealth, "aa_mantas" < 50 )
say, "vonmHit_NM005.mp3", "стон" ; голос нордлинга
stopcombat
forcegreeting
SetFight 30
set once to 2
endif
endif

if ( once == 1 )
if ( Player -> GetFatigue <= 0 )
if ( Player -> getHealth <= 20 )
say, "vonmFle_NM004.mp3", "Конец драки, я ухожу" ; а что ему еще остается сказать?
journal "aaa_zadira" 89
stopcombat
SetFight 30
forcegreeting
set once to 2
endif
endif
endif

end



Обратите внимание на строчки: if ( Player -> GetFatigue <= 0 )
if ( Player -> getHealth <= 20 )

Во-первых, вы можете регулировать цифры, задавая сколько пунктов должна быть усталость и здоровье игрока (20 – это, конечно, очень мало. Игрок почти при смерти. Если противник слишком силен, он может все-таки прибить Нери и диалог не состоится).
Во-вторых, в самый главных, - уже прокачанного игрока сложно повалить на землю, условие if ( Player -> GetFatigue <= 0 ) для него может не сработать никогда. Если ваш квест рассчитан на опытного игрока, поставьте для «усталости» другое значение или вовсе уберите это условие.

3. Напишите для агрессора гритинг с условием journal “aaa_zadira” < 20 примерно следующего содержания:
«Сейчас я устрою тебе драку, %PCRace! Я не стану убивать тебя, но окуну пару раз в лужи на улице и посмотрю, какого цвета у тебя кровь!»
В результате пишем:
journal "aaa_zadira" 20
startcombat, player
goodbye


4. Создаем следующий гритинг повыше с условием journal “aaa_zadira” == 20: описываем ситуацию, когда наш громила проигрывает:
«Остановись! Я признаю свое поражение. Вот тебе даже пара монет. Купи себе выпивку и не злись»
В результате: player -> additem "gold_001" 50
journal "aaa_zadira" 30
stopcombat
goodbye

5. Создаем еще выше гритинг с условием journal “aaa_zadira” == 89. Описываем самый интересный момент – проигрыш игрока: «Достаточно, %PCRAce? Я победил тебя, все честно! Иди теперь зализывай раны и помни, что я мог даже убить тебя, но не сделал этого! Не каждый из противников, которых ты найдешь в этом мире, способен на такое!»
В результате: journal "aaa_zadira" 90
goodbye

6. Реакция программы, если непись, несмотря ни на что, был убит в этой драке происходит автоматически – возникает журнальная запись с индексом 95.

Готово. При желании создайте для задиры диалог с новыми темами.
Сохраняйте плагин и наслаждайтесь игрой.

Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 


#8 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

Правила пользования этим разделом
---

Этот глобальный скрипт через 3 дня после старта добавляет в мир Морра новый объект, а также добавляет его в инвентарь некоторым товарищам. Этот скрипт был использован для плагина "Дар Ноктюрналь": он делает так, что в Морровинде выходит свежий номер газеты "Длинный язык" ("a_bk_Dl-f"), где есть интервью с Нереварином.
А вообще скрипт представляет широкие возможности для использования. Видоизменяя его, можно  добавлять можно все, что угодно, и куда угодно. Например, можно изменять ассортимент вещей торговцев в глобальном масштабе.

begin L-DF

short daysPassed
short myDay
short state


if ( daysPassed == 0 )
set myDay to Day
set daysPassed to 1
endif

if ( myDay != Day )
set daysPassed to daysPassed + 1
set myDay to Day
endif


if ( state == 1 )
stopscript  "L-DF"
return
endif

if ( state == 0 )
if ( daysPassed >= 3 )
PlaceItemCell "a_bk_Dl-f" "Vivec, Black Shalk Cornerclub" 454, -142, 2 0 
PlaceItemCell "a_bk_Dl-f" "Vivec, Elven Nations Cornerclub" 6, -332, -190 0
PlaceItemCell "a_bk_Dl-f" "Vivec, The Flowers of Gold" -54, 99, -62 0
PlaceItemCell "a_bk_Dl-f" "Vivec, The Lizard's Head" 346, -70, -63 0
"jeanne"->additem "a_bk_Dl-f" 1
"jobasha"->additem "a_bk_Dl-f" 2 ; а Джобаше сразу 2 экземпляра.
"simine fralinie"->additem "a_bk_Dl-f" 1
"tervur braven"->additem "a_bk_Dl-f" 1

     set state to 1
endif
endif
endif

end


Чтобы ваш новый объект не оказался где-нибудь под полом или зависшим в воздухе, лучше предварительно скинуть копию этого объекта в ячейку, записать координаты, а затем удалить и почистить ячейку в TESAMe.

Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 


#9 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

Правила пользования этим разделом
---

С помощью этого скрипта можно воссоздать в Морре  ситуацию, характерную не столько для фэнтезийной РПГ, сколько для игры типа Resident Evil, где нужно проводить разные манипуляции с предметами.
Итак, в замке застрял обломок ключа, что мешает открыть мощную, тяжелую дверь. Магия тут бесполезна – а что сделаешь? Расплавишь этот обломок файэерволом? Угу, вместе с замком. А попасть внутрь надо.   На помощь приходят обычные клещи, с помощью которых обломок автоматически извлекается. После этого дверью можно спокойно пользоваться.

На техническом уровне у нас, конечно, не будет никакого специального обломка, и сцену, как персонаж ковырялся в двери, мы тоже анимировать не будем. Обойдемся одним скриптом.

Повесьте это на нужную дверь.

begin Tel_door

; Автор скрипта - LofZ

if ( MenuMode == 1 )
return
endif

if (GetJournalIndex "aaa_tel" >= 10 ) ; ограничителем скрипта выступает новая журнальная запись journal "aaa_tel" с индексом 10. Вам придется создать аналогичную запись, либо объявить в начале локальную переменную типа once и плясать от нее.
return
endif

if ( OnActivate == 1 )

if ( player->GetItemCount "repair_prongs" == 0 )
MessageBox "В замке застрял обломок ключа. Кто-то слишком торопился закрыть люк, или пытался заблокировать его?.. Если бы были клещи, можно было попробовать извлечь этот обломок.", "Готово"
return
endif
MessageBox "Вам удалось извлечь обломок."
journal "aaa_tel" 10 
activate
endif
endif
endif
endif

end Tel_door


Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 


#10 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

Объект, на который повешен этот скрипт, днем выглядит как обычно, а по ночам исчезает (дисейблится).

begin L-BrineDisable

;  автор – LofZ

if ( menumode == 1 )
return
endif

if ( Gamehour >= 0 )
if ( Gamehour  < 6 )
"ID_объекта"->disable
else
"ID_объекта"->enable
endif
endif

end


Введите в кавычки ИД вашего объекта.
У нас этот скрипт использовался в последнем плагине про не очень сообразительного оборотня на парне, которого звали Брайн (aa_brine). Этот товарищ по ночам уходил из города, а днем был на месте. Соответственно, строчки с командами выглядели так: "aa_brine"->disable и т.д. Отсюда, кстати, и название этого скрипта.

Удачи и творческих успехов!
Но не забудьте Правила пользования этим разделом

Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 


#11 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

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

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

1. Зайдите в закладку Spellmaking и создайте новое заклинание aa_full_illusion, с эффектом невидимости. Можно использовать и эффект хамелеон. Настройки на ваш вкус. Но заклинание должно иметь тип «характеристика», должен стоять флажок «Always Succeds». Слишком высокое значение пункта magnitude у хамелеона (например, 100), может привести к тому, что в определенной местности, с определенным освещением, актера просто можно не заметить.

2. Понадобится новая журнальная запись «new» с индексом 1, в которой должно быть написано что-то вроде «Я поговорил с призраком безумного даэдрота. Он рассказал мне новые факты о своем загадочном убийстве, а потом растворился в воздухе»
3. Используйте на персонаже, который должен исчезнуть, следующий скрипт:

begin hla_az

float timer

if ( Menumode == 1 )
return
endif


if ( journal ”new” >= 1 )
Set timer to ( timer + GetSecondsPassed )
endif
if timer > 5
disable
endif

if ( GetDisabled == 1 )
setdelete 1
return
endif

end

4. Зайдите в диалоги и создайте диалог с нужным персонажем. В последней фразе, после которой последует исчезновение, напишите в результате:
addspell "aa_full_illusion"
journal ”new” 1


Примечание: время таймера (выделено красным) можно ставить разное.
Удачи и творческих успехов!
Но не забудьте Правила пользования этим разделом

Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 


#12 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

Имеется в виду интересная возможность, позволяющая сэкономить кучу нервов игроку: скрипт телепортирует актера в то место, где стоит игрок, если между ними возникает существенная дистанция. Это весьма полезно на случай застревания актера где-нибудь в деталях интерьера.
Не стану провозглашать себя автором – принцип был подсмотрен мной в одном из плагинов, впрочем, по слухам, даже и там он не был оригинален, и за воплощением этой идеи стоит какой-то известный западный модмейкер. Но я предлагаю вариант упрощенной конструкции, а также оригинального способа введения значений локальной переменной (через диалог).

Begin aaa_NewCompanionScript

Short once
float myx
float myy
float myz
float timer

if ( once == 1 )
if ( GetDistance Player > 750 )
    set timer to timer + GetSecondsPassed
           if ( timer > 15 )
              set timer to 0
         set myx to ( Player->GetPos x )
       set myy to ( Player->GetPos y )
      set myz to ( Player->GetPos z )
     SetPos x myx
    SetPos y myy
  SetPos z myz
return
    endif
  endif
endif

end

Расстояние, указанное в скрипте, может быть изменено, время тоже.

Чтобы применить этот скрипт можно воспользоваться диалогом.
По любому ведь создавать специальные фразы для компаньона или того, кого нужно куда-то сопроводить.
Когда ваш актер соберется идти с игроком, напишите  ему в диалоге в результате фразы в духе: «Я готов следовать за тобой в Вивек»
Aifollow, player 0 0 0 0
Set once to 1

Ну и журнальную запись, если надо.

И теперь стоит вам отдалиться от персонажа на значительное расстояние, как через 15 секунд он возникнет прямо у вас за спиной. Удобно и легко совершать путешествия!
Чтобы остановить это дело, когда вы доведете актера до места назначения, или когда вам уже не надо будет ходить с ним, напишите в диалоге фразу типа «Теперь я останусь здесь, дорогой Нереварин» с подходящими условиями, а в результате:
AiWander 0 0 0 60 30 10 0 0 0 0 0 0
Set once to -1


Особенность этого скрипта в том, что его действие после прерывания может снова запускаться. Достаточно писать в диалоге или скрипте команды:
Aifollow, player 0 0 0 0
Set once to 1

и останавливать работу скрипта, когда он уже не нужен.
Таким образом, создается компаньон, который телепортируется, когда ходит за игроком и стоит на месте, когда ждет.

Осторожнее с левитацией, когда за вами следует компаньон. Если вы будете высоко в воздухе (и далеко!) он телепортируется за вами, и тут же грохнется с высоты. Скрипт для персонажа, способного применять заклинания левитации и хождения по воде, когда эти заклинания применяет и игрок, мы рассмотрим в следующий раз.

Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 


#13 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

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

Заклинание левитации для компаньона должно быть оригинальным. Мало того, тип заклинания должен быть "характеристика", чтобы не зависеть от времени. В моем случае Ид нового заклинания левитации "aa_V_MiraSpell" (это скрипт девушки Миры из нашего плагина "Великая мечта").

Используйте нижеприведенный скрипт на вашем компаньоне (в скрипте для примера ИД персонажа представлен как "aa_Companion"):

Begin aaa_NewScript
float myz
float myy
float myx
float timer
short Once

if ( Once == 1 )
if ( GetDistance Player > 700 )
    set timer to timer + GetSecondsPassed
           if ( timer > 10 )
set Once to 2
endif
endif
endif
if ( Once == 2 )
              set timer to 0
         set myx to ( Player->GetPos x )
       set myy to ( Player->GetPos y )
      set myz to ( Player->GetPos z )
     SetPos x  myx
    SetPos y   myy
  SetPos z  myz
set Once to 1
return
endif
if ( Player->GetEffect, sEffectLevitate == 1 )
   "aa_Companion"->AddSpell "aa_V_MiraSpell"
else
      "aa_Companion"->RemoveSpell "aa_V_MiraSpell"
endif
endif

end


Чтобы использовать скрипт, напишите в результате диалога команды,
Aifollow, player 0 0 0 0
Set Once to 1
, чтобы персона начал ходить за вашим игроком.

Прервет действие скрипта фраза с командами в поле result диалога:

AiWander 0 0 0 60 30 10 0 0 0 0 0 0
Set Once to -1


Следует сказать, летает компаньон очень плохо. У искусственного интеллекта не получается осуществлять такие подъемы и спуски в воздухе, как у живого игрока. Однако с этим скриптом путешествие по башням телванни с компаньоном больше не будет для Нереварина проблемой.

Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 


#14 Ссылка на это сообщение Asirion

Asirion
  • Beyond Divinity
  • 643 сообщений

Отправлено

Begin OurScript



short example1



if ( MenuMode == 1 )

    return

endif



if ( example1 == 0 )

    if ( GetJournalIndex Quest == 1A )

        if ( player->GetItemCount "ouritem" > 0 )

            Journal quest 2B

            set example1 to 1

        endif

    endif

endif



end


где:
ourscript - название вашего скрипта
example1 - произвольное название новой переменной
quest - id квеста
ouritem - id вещички
1a - числовой индекс предыдущей квестовой записи
2b - числовой индекс дополняемой в этот момент записи

Эх, вот чем плохи такие уроки, - не написано конкретно при каких условиях что скрипт делает. "Предыдущая запись", "Последующая", "числовой индекс", "произвольное название". Брррр... Но почему нельзя сказать, скрипт вешается на вещь? При добавлении вещи в инвентарь игрока, обновляется журнал (и при этом еще зачем-то надо, чтобы игрок уже прошел какую-то часть квеста - "if ( GetJournalIndex Quest == 1A )").
Новичкам, которые только учатся, и берут готовые скрипты, что к чему здесь будет непонятно. А кто знает, тот сам может это написать.
ЗЫ. Условие равенства по журналу - не слишком хороший вариант в развернутом квесте. Иногда по небрежности других скриптов или в диалоге может добавиться другой индекс записи, и эти условия уже не будут работать.
От многой мудрости много скорби, и приумножающий знание умножает печаль...

Don't let me fall. Just hold me tight. And tell me it will be alright. Tomorrow when I wake up... You'll be there...

#15 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

В Морнхолде открывается новая локация - королевский зверинец, в котором можно понаблюдать за повадками разных животных, ну и не только.
Планирую, что зверинец не работает в ночные часы. Просто дверь "не пускает". По-моему, это логично и нормально, что там ночью делать...


1 вариант
begin Scr_bla_bla_bla
if ( menumode == 1 )
return
endif
if ( OnActivate == 1)
if ( GameHour > 20 )
MessageBox "В зверинец нет доступа по ночам"
return
elseif ( GameHour > 6 )
if ( GameHour < 20 )
Activate
endif
else
MessageBox "В зверинец нет доступа по ночам"
return
endif
endif
end

2 вариант
Begin script
if ( OnActivate == 0 )
return
endif
if ( GameHour > 20 )
MessageBox "Мы вас не пустим"
elseif ( GameHour > 6 )
Activate
elseif ( GameHour < 6 )
MessageBox "Мы вас не пустим"
endif
endif
end

P.S.Модераторы, куда у меня делась кнопка "изменить" сообщение? Я теперь свои сообщения править не могу
P.P.S. Всё опять норм, появилась кнопка

Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 


#16 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

Если вам нужно, чтобы какой-то персонаж, книга, сундук и т.п. исчез навcегда при определенных условиях (условием для исчезновения выступает журнальная запись), нужно повесить на него такой скрипт:


begin aa_L_script


short once

if ( MenuMode == 1 )
return
endif

if (GetJournalIndex "A1_Dreams" >= 1 )
disable
endif

if ( getdisabled == 1 )
setdelete 1
return
endif
end


Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 


#17 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

Иногда бывает необходимо использовать объект в какой-то новой категории.
Допустим, вы хотите, чтобы игрок не мог попасть в определенную пещеру раньше, чем произодет то-то и то-то, и вы заваливаете вход в пещеру камнями. Однако, вы не сможете потом убрать камни, ведь они все, за исключением булыжника в Маарганском храме, являются статиками, на них нельзя повесить скрипт, а значит заставить сдвинуться. Вот если бы они были активаторами...
Вообще нет такой команды в КС, которая переводила бы объекты в разные категории. Можно лишь создать в нужной категории новый объект и присвоить ему стандартную модель и текстуру.
Все модели и текстуры Морровинда запакованы в большой архив с расширением .bsa (причем, они раскиданы по разным папкам). Программой WinRar его не открыть, только специальными способами. Впрочем, я хочу предложить такой способ, который хоть и покажется ламерским, позволяет очень быстро добиться эффекта и распаковки архива не потребует. Нужно лишь, чтобы у вас были устновлены любые плагины, добавляющие хоть одну новую модель.
Итак, приступим.
1. Посмотрите месторасположение модели объекта, у которого вы хотите сменить категорию, и создайте у себя в папке Meshes аналогичную папку. Например, камни находятся в папке f. Создаем в Data Files -> Meshes папку f. Возможно, она уже существует. Модостроители могут назвать свои папки "в тон" стандартным.
2. Создайте новый объект в нужной вам категории (например, в активаторах).
3. Возьмите любой, первый попавшийся файл из папки Meshes с расширением nif. Скопируйте его (не вырезайте!) в другое место. А затем переименуйте в стандартное имя, скажем, Terrain_rock_BM_12.nif - один из камней. Поместите переименованный файл в созданную недавно папку (f).
4. Вернитесь в КС и укажите путь к модели в этой новой папке. Сохранитесь. Не пытайтесь пока вытащить объект в мир игры! Да, первый попавшийся файл, который вы выбрали, может оказаться не камнем. Но программе-то это сейчас все равно, главное, чтобы совпадали имена.
5. Закройте КС. Удалите новый файл модели и/или всю папку.
6. Заново откройте КС. Если вы все указали правильно, модель и текстура нового объекта будет подгружаться в игру и в КС из архива.

Таким способом камни можно сделать активаторами, подвешенную над ямой веревку - дверью, то есть путем в другую локацию, часть тела - отрубленной рукой или ногой. И все это - не перегружая архив будущего плагина лишними моделями.

Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 


#18 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

Определить пол персонажа, за которого выступает игрок, можно только через диалог. Как известно, есть функции PC Sex и Same Sex, которые можно использовать при создании фраз, рассчитанных на то, что их услышит ГГ-парень, или ГГ-девушка.
Но если вам требуется создать какие-то сцены или ситуации, в которых происходило бы то или иное событие в зависимости от пола игрока, это тоже можно реализовать. Есть возможность, заставить КС «увидеть», какого пола игрок и использовать эту информацию в скриптах. Например, создадим кирасу (aaaa_cuirass), которую может нормально надеть персонаж мужского пола, а у персонажа женского пола возникнут с ней проблемы.
Сделать это можно с помощью скрипта на кирасе, который при попытке надеть броню проверял бы пол, а затем если игрок оказывался женского пола, он получал бы проклятье на свою голову, а если мужского – все было бы нормально.
Итак, без диалогов мы все-таки не обойдемся. Нужно обязательно навязать игроку беседу. Создаем в мире игры говорящего, или используем для диалога кого-нибудь из стандартных персонажей.
Потом отправляемся в закладку global и создаем новую глобальную переменную типа short под названием aa_PCSex с исходным значением 0.
Отправляемся в диалоги и создаем две реплики для говорящего. В одной, реплике для игрока-мужчины пишем фразу:
Вот тебе кираса, красивая, добротная. Носи ее с честью.
В поле result - player->additem "aaaa_cuirass" 1
Чуть выше создаем еще одну фразу, в этот раз для игрока женского пола:
Вот тебе кираса, но она зачарована, и ты не сможешь ее носить. Подари ее Крассиусу Курио.
Выставляем для этой фразы условия Function -> PC Sex == 1
В поле result пишем
player->additem "aaaa_cuirass" 1
set aa_PCSex to 1


Чтобы говорящий в дальнейшем не раздавал кирасы каждый раз при диалоге, нужно сделать некоторые шаги для того, чтобы эти две фразы могли звучать лишь однократно. Например, можно ввести журнальную запись, при выдаче кирасы обновить журнал и создать повыше третью фразу с условием по этой журнальной записи. Можно повесить на говорящего скрипт с какой-нибудь локальной переменной и в результате фразы изменить значение этой переменной, а потом создать выше реплику с этим значением переменной как условием. Можно повесить на него скрипт с disable и заставить исчезнуть в конце диалога. Но я сейчас не буду останавливаться на этом моменте, как и на деталях, что это был за странный парень, раздающий такие уникальные кирасы.
Главное, что так у нас появилась глобальная переменная aa_PCSex, имеющая разные значения в зависимости от пола игрока.
0 – если игрок парень.
1 – если девушка.

Можно приступать к созданию скрипта на кирасу. Он будет вот таким:

begin aa_K

short OnPCEquip

If (MenuMode ==1)
Return
Endif

if ( aa_PCSex == 0 )
return
endif

if ( OnPCEquip == 1 )
if ( aa_PCSex == 1 )
MessageBox "Сказано вам было - вы не можете носить эту кирасу!"
player->addspell "ash-chancre" ; это просто пепельная язва.
set OnPCEquip to 0
endif
endif
end


Таким образом, имея в распоряжении эту глобальную переменную, и добавляя в скрипт условия: if ( aa_PCSex == 1 ) или if ( aa_PCSex == 0 ), вы сможете создавать скрипты, в которых то или иное событие будет происходить в зависимости от пола игрока.
Например, можно сделать так, чтобы рядом с игроком появился бы другой непись: девушка, если игрок парень, или парень - если Неревар воплотился в женщину. Или определенный скрипт с такими условиями может запускать разные звуковый файлы - типа голос таинственного лорда даэдра, говорящий "Кто ты, странник, вторгшийся в мое святилище?", или "Кто ты, странница, вторгшаяся..?"
Возможности КС практически безграничны.

Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 


#19 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 105 сообщений

Отправлено

Конечно, в случаях когда игрок путешествует по Морровинду и по ходу квеста находит определенного непися то в одной ячейке, то в другой, делать такие переходы непися через локальные скрипты на двух разных персонажах: один энейблится, другой дизейблится. Но иногда лучше всего, чтобы в определенную ячейку перенесся один и тот же непись.
Делается это с помощью глобального скрипта.
Вот, например, как выглядит скрипт Мехры Мило в игре, когда она перекочевывает из Министерство Правды в монастырь:

begin MoveMehra

if ( GetJournalIndex, "A2_4_MiloGone" == 20 )
if ( cellChanged == 1 )
"Mehra Milo"->PositionCell 1207, 372, -592, 0 "Holamayan Monastery"
StopScript MoveMehra
endif
endif

end

Запомните, что скрипт перенесет персонажа, который уже находится в определенной ячейке мира игры в другую ячейку. Если же непись не выложен в мир игры, произойдет ошибка. Вы даже не загрузите игру, пока не исправите этот глюк в КС.

Журнальный индекс у вас может быть другим, или вовсе отсутствовать, поставьте ID своего персонажа и координаты необходимой ячейки, куда он должен переместиться. Можно добавить в скрипт и другие команды.

Запустите новый глобальный скрипт через диалог, или другим способом.
У меня получилась на базе скрипта Мехры интересная вариация. Наемник по имени Мер (aa_dj_mer2) перемещается в канализацию Морнхолда, при этом он теряет индорильских шлем, бывший при нем, и обновляется журнал.

begin aa_dj_DarMoveMerv
; Мера переносит в канализацию
if ( GetJournalIndex, "1a_dj_love" == 20 )
if ( cellChanged == 1 )
"aa_dj_mer2"->PositionCell -540, 2340, -585 0 "Old Mournhold: Bazaar Sewers"
"aa_dj_mer2"->removeitem "Indoril_MH_Guard_helmet" 1
journal "1a_dj_love" 25
StopScript "aa_dj_DarMoveMerv"
endif
endif

end


Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 


#20 Ссылка на это сообщение Invire

Invire
  • Новенький
  • 19 сообщений

Отправлено

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

В написанном мной скрипте активатор кликом приводится в действие. Однако если быстро кликнуть два раза, то после завершения цепочки действий и установки переменной снова в 0, вся цепочка начинается заново, хотя ты не кликал. А по логике такого происходить не должно (onActivate = 0). Как будто второй клик запоминается и отсылается вперед во времени (причем как будто даже на любое время, именно на длительность цепочки) и в момент конца цепочки активируется. В общем мистика какая-то) Вот схематический вид скрипта.

begin



short var



if ( var == 0 )

  if ( onActivate == 1 )

	set var to 1

  endif

endif



;далее цепочка действий



if ( var == 1 )

  rotate, x 10

  set var to 2

endif



if ( var == 2 )

  move, z -10

  set var to 3

endif



if ( var == 3 )

  set Other_object.var to 1

  set var to 0

endif



end
Т.е. совершенно ничего особенного, движение предметов, установка флаговых переменных в других объектах - ничего связанного с анимацией персонажей. Наверное это связано с движком, но все же у меня возник вопрос, может где-то тут есть ошибка, которую я не уловил?

Наконец-то я понял в чем дело!!! (год спустя, см. дату предыдущего поста)))

Если, скажем так, к условию onActivate доступ ограничен, тогда запрос этого условия как бы откладывается на время, до тех пор, пока проверка этого условия снова не станет доступна. Вот, например, есть активатор и по умолчанию он бездействует, ждет, пока мы на него кликнем. Но вот мы кликнули на него, и он начал что-то делать, но пока еще не закончил и не вернулся к своему обычному положению, а мы уже снова кликнули. Этот второй клик не найдет в данный момент условия onActivate, хотя в скрипте оно есть, и в результате клик как бы отложится в память, будет ждать того момента, когда это условие снова станет доступным, и тогда-то отложенный клик сработает мгновенно. В игре это выражается в том, что мы кликнули, заработало, мы снова кликнули, ничего естественно не произошло, так как и не должно, а вот как только прекратилась работа, то сразу же начинается снова, хотя мы не кликали. Неприятная штука. Для большей ясности вот скрипт.

begin scr_test



short State



if ( State == 0 );первый клик разумеется здесь

  if ( onActivate == 1 )

	set State to 1

  endif

elseif ( State == 1 )

 ;...тут какие-то действия активатора, но потом значение State снова станет равно 0

 ;второй раз кликнули тут (нам достаточно времени, пока работает активатор)

 ;но здесь нет условия onActivate, и запрос условия как бы запоминается

endif



end
Вот как это можно исправить. Конечно, если самосрабатывание активатора не особенно тревожит, можно и не париться. Но все же.

begin scr_test



short State



if ( State == 0 );первый клик разумеется здесь

  if ( onActivate == 1 )

	set State to 1

  endif

else

  if ( onActivate == 1 )

   ;условие есть и тут, но оно пустое

   ;запрос найдет его, но ничего не произойдет

   ;в результате повторного срабатывания не будет

  endif



  if ( State == 1 )

   ;...действия активатора

  endif

endif



end
Проблему можно решить и поменяв местами уровни State и onActivate, но тогда цепочка if-elseif для State разрывается...

begin scr_test



short State



if ( onActivate == 1 )

  if ( State == 0 )

	set State to 1

  endif

endif



if ( State == 1 )

 ;...действия активатора

endif



end
И еще хочу отметить, что, к счастью, запросы, не находящие условия onActivate, не выстраиваются в очереди. Т.е. нет такого, что 3 раза кликнул когда State == 1, а потом 3 раза на автомате сработало. К счастью, только 1 раз.





Темы с аналогичным тегами мануал скрипты, скрипты

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых