Deska Опубликовано 29 апреля, 2008 Опубликовано 29 апреля, 2008 После старта глобальный скрипт отсчитывает 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" в результате диалога (рекомендуется использовать для этого не стандартную морровиндскую тему, а новую, оригинальную). Не забудьте дописать диалоги для персонажей, новые журнальные записи и прочие элементы, из которых состоит квест. Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Deska Опубликовано 29 апреля, 2008 Автор Опубликовано 29 апреля, 2008 Скрипт внезапно погибшего непися для ситуации, когда игрок общался-общался с неписем или с животным, но вернувшись какого-то момента (по журнальному индексу), внезапно нашел только его тело. Ваше дело, к какой ситуации это приложить и что убило беднягу – покушение, которое игрок не успел предотвратить, несчастный случай в яичной шахте, не успел вылечить и т.д. А технически реализовать такую ситуацию несложно. 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, бедный непись или существо превратится в хладный труп... Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Deska Опубликовано 29 апреля, 2008 Автор Опубликовано 29 апреля, 2008 Правила пользования этим разделом --- Скрипт - результат проклятья Лорда Даэдры Мефалы - накладывает ограничения на нахождение игрока в какой-либо ячейке. Если он появится в указанной ниже ячейке, его ждет смерть. 1. Создайте новую журнальную запись "1a_end" с индексом 10, который должен остановить скрипт ("Мне удалось снять проклятье Мефалы. Теперь я могу бродить по Морровинду, где вздумается"). 2. Запустите глобальный скрипт. Как это сделать, см. здесь Цитата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, чтобы остановить скрипт, иначе Нереварин не сможет вообще путешествовать по миру игры. Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Deska Опубликовано 29 апреля, 2008 Автор Опубликовано 29 апреля, 2008 Правила пользования этим разделом --- Скрипт вешается на предмет. При активации предмета, один раз дополняется журнал. В дальнейшем предмет можно также использовать (активация все еще возможна). 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 Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Deska Опубликовано 29 апреля, 2008 Автор Опубликовано 29 апреля, 2008 Правила пользования этим разделом --- Если вы захотите создать непися-вампира, вы не найдете в 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 будут, как у обычного непися. Отличительная черта вампира с этим скриптом - его можно первратить в обычного непися, модернизировав скрипт и убрав заклинания 1 Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Deska Опубликовано 29 апреля, 2008 Автор Опубликовано 29 апреля, 2008 Правила пользования этим разделом --- Этот скрипт создает своего рода ловушку для игрока-вампира. Попав в интерьер, где находится объект с таким скриптом, игрок (если он вампир) начинает получать повреждения. Данный скрипт используется в нашем новом плагине о вампирах «Предрассветные тени». Там было магическое освещение с эффектом вредного для вампиров дневного света, и поэтому игроку-вампиру пришлось бы несладко. Однако скрипт открывает широкие возможности: можно создавать ловушки для лабиринтов и т.д. Цитата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 Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Deska Опубликовано 29 апреля, 2008 Автор Опубликовано 29 апреля, 2008 Правила пользования этим разделом --- В Морровинде довольно часто приходится сталкиваться в турнирных поединках с неписями. Исход таких боев однообразен: как только здоровье у непися достигает определенной отметки, он начинает просить о пощаде. Однако привычную ситуацию можно разнообразить, причем это довольно просто. Я расскажу, как помимо привычного создать альтернативный вариант, когда в бою не только израненный оппонент просит пощады, но и в случае серьезного ранения игрока непись начинает глумиться над ним и требовать, чтобы он просил прощения. 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. Готово. При желании создайте для задиры диалог с новыми темами. Сохраняйте плагин и наслаждайтесь игрой. Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Deska Опубликовано 29 апреля, 2008 Автор Опубликовано 29 апреля, 2008 Правила пользования этим разделом --- Этот глобальный скрипт через 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. Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Deska Опубликовано 29 апреля, 2008 Автор Опубликовано 29 апреля, 2008 Правила пользования этим разделом --- С помощью этого скрипта можно воссоздать в Морре ситуацию, характерную не столько для фэнтезийной РПГ, сколько для игры типа 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 Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Deska Опубликовано 29 апреля, 2008 Автор Опубликовано 29 апреля, 2008 Объект, на который повешен этот скрипт, днем выглядит как обычно, а по ночам исчезает (дисейблится). Цитата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 и т.д. Отсюда, кстати, и название этого скрипта. Удачи и творческих успехов! Но не забудьте Правила пользования этим разделом Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Deska Опубликовано 29 апреля, 2008 Автор Опубликовано 29 апреля, 2008 Этот очень красивый спецэффект можно использовать в сцене с исчезновением актера в результате диалога. Это альтернативный вариант привычного дисейбла, когда непись или существо внезапно растворяется в воздухе. Последнее порой кажется слишком резким и даже неприятным. Однако есть простой способ сделать исчезновение более плавным. После разговора персонаж станет полупрозрачным, а через несколько секунд как бы растворяется. 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 Примечание: время таймера (выделено красным) можно ставить разное. Удачи и творческих успехов! Но не забудьте Правила пользования этим разделом Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Deska Опубликовано 13 мая, 2008 Автор Опубликовано 13 мая, 2008 Имеется в виду интересная возможность, позволяющая сэкономить кучу нервов игроку: скрипт телепортирует актера в то место, где стоит игрок, если между ними возникает существенная дистанция. Это весьма полезно на случай застревания актера где-нибудь в деталях интерьера. Не стану провозглашать себя автором – принцип был подсмотрен мной в одном из плагинов, впрочем, по слухам, даже и там он не был оригинален, и за воплощением этой идеи стоит какой-то известный западный модмейкер. Но я предлагаю вариант упрощенной конструкции, а также оригинального способа введения значений локальной переменной (через диалог). Цитата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 и останавливать работу скрипта, когда он уже не нужен. Таким образом, создается компаньон, который телепортируется, когда ходит за игроком и стоит на месте, когда ждет. Осторожнее с левитацией, когда за вами следует компаньон. Если вы будете высоко в воздухе (и далеко!) он телепортируется за вами, и тут же грохнется с высоты. Скрипт для персонажа, способного применять заклинания левитации и хождения по воде, когда эти заклинания применяет и игрок, мы рассмотрим в следующий раз. Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Deska Опубликовано 14 мая, 2008 Автор Опубликовано 14 мая, 2008 Сегодня предлагаю вашему вниманию скрипт для компаньона, который позволит ему телепортироваться к игроку, если между ними возникает определенная дистанция, и применять заклинание левитации, когда его применяет игрок. Заклинание левитации для компаньона должно быть оригинальным. Мало того, тип заклинания должен быть "характеристика", чтобы не зависеть от времени. В моем случае Ид нового заклинания левитации "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 Следует сказать, летает компаньон очень плохо. У искусственного интеллекта не получается осуществлять такие подъемы и спуски в воздухе, как у живого игрока. Однако с этим скриптом путешествие по башням телванни с компаньоном больше не будет для Нереварина проблемой. Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Asirion Опубликовано 26 мая, 2008 Опубликовано 26 мая, 2008 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...
Deska Опубликовано 18 августа, 2008 Автор Опубликовано 18 августа, 2008 В Морнхолде открывается новая локация - королевский зверинец, в котором можно понаблюдать за повадками разных животных, ну и не только. Планирую, что зверинец не работает в ночные часы. Просто дверь "не пускает". По-моему, это логично и нормально, что там ночью делать... 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. Всё опять норм, появилась кнопка Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Deska Опубликовано 28 октября, 2008 Автор Опубликовано 28 октября, 2008 Если вам нужно, чтобы какой-то персонаж, книга, сундук и т.п. исчез нав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 Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Deska Опубликовано 28 октября, 2008 Автор Опубликовано 28 октября, 2008 Иногда бывает необходимо использовать объект в какой-то новой категории. Допустим, вы хотите, чтобы игрок не мог попасть в определенную пещеру раньше, чем произодет то-то и то-то, и вы заваливаете вход в пещеру камнями. Однако, вы не сможете потом убрать камни, ведь они все, за исключением булыжника в Маарганском храме, являются статиками, на них нельзя повесить скрипт, а значит заставить сдвинуться. Вот если бы они были активаторами... Вообще нет такой команды в КС, которая переводила бы объекты в разные категории. Можно лишь создать в нужной категории новый объект и присвоить ему стандартную модель и текстуру. Все модели и текстуры Морровинда запакованы в большой архив с расширением .bsa (причем, они раскиданы по разным папкам). Программой WinRar его не открыть, только специальными способами. Впрочем, я хочу предложить такой способ, который хоть и покажется ламерским, позволяет очень быстро добиться эффекта и распаковки архива не потребует. Нужно лишь, чтобы у вас были устновлены любые плагины, добавляющие хоть одну новую модель. Итак, приступим. 1. Посмотрите месторасположение модели объекта, у которого вы хотите сменить категорию, и создайте у себя в папке Meshes аналогичную папку. Например, камни находятся в папке f. Создаем в Data Files -> Meshes папку f. Возможно, она уже существует. Модостроители могут назвать свои папки "в тон" стандартным. 2. Создайте новый объект в нужной вам категории (например, в активаторах). 3. Возьмите любой, первый попавшийся файл из папки Meshes с расширением nif. Скопируйте его (не вырезайте!) в другое место. А затем переименуйте в стандартное имя, скажем, Terrain_rock_BM_12.nif - один из камней. Поместите переименованный файл в созданную недавно папку (f). 4. Вернитесь в КС и укажите путь к модели в этой новой папке. Сохранитесь. Не пытайтесь пока вытащить объект в мир игры! Да, первый попавшийся файл, который вы выбрали, может оказаться не камнем. Но программе-то это сейчас все равно, главное, чтобы совпадали имена. 5. Закройте КС. Удалите новый файл модели и/или всю папку. 6. Заново откройте КС. Если вы все указали правильно, модель и текстура нового объекта будет подгружаться в игру и в КС из архива. Таким способом камни можно сделать активаторами, подвешенную над ямой веревку - дверью, то есть путем в другую локацию, часть тела - отрубленной рукой или ногой. И все это - не перегружая архив будущего плагина лишними моделями. Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Deska Опубликовано 17 ноября, 2008 Автор Опубликовано 17 ноября, 2008 Определить пол персонажа, за которого выступает игрок, можно только через диалог. Как известно, есть функции 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 ), вы сможете создавать скрипты, в которых то или иное событие будет происходить в зависимости от пола игрока. Например, можно сделать так, чтобы рядом с игроком появился бы другой непись: девушка, если игрок парень, или парень - если Неревар воплотился в женщину. Или определенный скрипт с такими условиями может запускать разные звуковый файлы - типа голос таинственного лорда даэдра, говорящий "Кто ты, странник, вторгшийся в мое святилище?", или "Кто ты, странница, вторгшаяся..?" Возможности КС практически безграничны. Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Deska Опубликовано 9 декабря, 2008 Автор Опубликовано 9 декабря, 2008 Конечно, в случаях когда игрок путешествует по Морровинду и по ходу квеста находит определенного непися то в одной ячейке, то в другой, делать такие переходы непися через локальные скрипты на двух разных персонажах: один энейблится, другой дизейблится. Но иногда лучше всего, чтобы в определенную ячейку перенесся один и тот же непись. Делается это с помощью глобального скрипта. Вот, например, как выглядит скрипт Мехры Мило в игре, когда она перекочевывает из Министерство Правды в монастырь: Цитата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 Нет мира кроме тех, к кому я привык, И с кем не надо нагружать язык, А просто жить рядом и чувствовать, что жив.
Invire Опубликовано 22 декабря, 2008 Опубликовано 22 декабря, 2008 Очень странная штука. Если два раза кликнешь на предмет который активируется, то выполняется действие, а потом, когда оно завершено, выполняется снова (если условия позволяют), как если бы ты снова кликнул на активатор. Но ты не кликал, ты в первый раз кликнул два раза и второй клик как бы получился отложенным во времени. Для третьего клика это уже не проходит. Т.е. к примеру так: дабл клик на дверь - она открывается и сразу же закрывается, как если бы ты на нее кликнул. Но для двери все нормально, а вот для некоторых активаторов нет. В чем тут дело? В написанном мной скрипте активатор кликом приводится в действие. Однако если быстро кликнуть два раза, то после завершения цепочки действий и установки переменной снова в 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 раз.
Uzbek Опубликовано 30 декабря, 2008 Опубликовано 30 декабря, 2008 Делается это довольно просто. Неважно на кого мы повесим этот скрипт, любой обьект кроме статика исчезнет ночью(или днем если поменять местами Disable и Enable).Begin Settings_scp if ( GameHour >= 20 ); Ночь Disable elseif ( GameHour >= 8 ); День Enable endif End Settings_scp
Uzbek Опубликовано 30 декабря, 2008 Опубликовано 30 декабря, 2008 Скрипт для автоматического запирания дверей на ночь. Begin exDoor short lock short unlock if ( GameHour >= 19 ); ночь if ( lock == 0 ) Lock 60; уровень замка set lock to 1 set unlock to 0 endif elseif ( GameHour >= 6 ); день if ( unlock == 0 ) Unlock; открывашка set unlock to 1 set lock to 0 endif endif End exDoor
Invire Опубликовано 19 января, 2009 Опубликовано 19 января, 2009 Функции deactivate в скриптовом языке ТЕС не существует, так что название темы - шутка (я решил назвать по аналогии с темой Скрипт с disable, созданной Deska). Есть пара функций enable-disable, отвечающая за включение-выключение присутствия объекта в игровом мире. Функция же activate тоже отвечает за включение, но другого рода - активацию, действие, выполняемое с объектом. Почему бы и ей не иметь своего антипода deactivate, деактивировать (я иногда путаю и пишу deactivate вместо disable). Если это дверь, контейнер или книга, то при клике на них они откроются, все остальные предметы помещается в инвентарь - все это работа функции activate. То есть момент помещения в инвентарь можно определить точно (для этого в скрипте вызываем условие onActivate == 1, внутри ставим нужной переменной нужное значение и функцию Activate). А момент выкладывания? Вот тут-то нам и поможет функция deactivate. Ну на самом деле такой функции нет)), так что мы сымитируем те действия, которые она должна выполнять, а именно определять момент выкладывания предмета из инвентаря (поскольку само выкладывание производим мы сами). Для этого необходимо прежде всего определить, что конкретный объект находится в инвентаре. Если копия объекта одна, то нет проблем ( Player -> GetItemCount, название == 1 ), а если копий несколько? Можно локальной переменной в скрипте каждой копии объекта присвоить свое уникальное значение, а можно поступить еще проще. Определить любую координату объекта (например, для координаты х это GetPos, x). Если объект находится в инвентаре, то любая его координата равна нулю. Однако тут следует иметь ввиду, что координата объекта, находящегося не в инвентаре (скажем так, в мире) на самом деле может быть равна нулю. В этом случае можно поставить проверку условия сразу на две координаты, что еще более уменьшит и без того малую вероятность совпадения координат, а еще лучше на все три - тогда в мире будет существовать всего лишь одна-единственная точка, начало координат, где координаты предмета в мире будут равны координатам объекта в инвентаре. В эту точку можно поставить камень, колонну, бочку - в общем любой неподвижный объект и перекрыть игроку доступ туда, или сделать локацию "в обход". Теперь, когда мы знаем, что предмет в инвентаре, можно обнаружить и момент выкладывания из инвентаря. Значение локальной переменной в скрипте объекта постоянно проверяется и когда при старом значении обнаруживается изменение координат с нуля на число, то значит предмет был выложен. Вот примерный скрипт: begin scr_deactivate short varBag if ( varBag == 0 );предмет в мире if ( GetPos, x == 0 ) if ( GetPos, y == 0 ) if ( GetPos, z == 0 ) set varBag to 1 endif endif endif else;предмет в инвентаре if ( GetPos, x != 0 ) if ( GetPos, y != 0 ) if ( GetPos, z != 0 ) MessageBox "Предмет выложен" set varBag to 0 endif endif endif endif end Этот скрипт запаздывает на 1 кадр, поскольку мы обнаруживаем "неладное" тогда, когда предмет уже имеет новые координаты, а значит был выложен. Однако момент взятия можно не упустить - переменной varBag можно присваивать значение 1, когда вызывается функция Activate if ( onActivate == 1 ) set varBag to 1 Activate endif но по скорости выполнения это хуже, так как в этом случае будет проверяться сразу два условия (второе, что varBag == 1 ), а не одно, как в верхнем скрипте, к тому же скрипт теряет свою красивую симметрию... Похожий принцип будет у скрипта, обнаруживающего момент выхода из режима меню (что может быть также полезно в некоторых случаях). begin scr_menu_out short varMenu if ( MenuMode == 1 ) if ( varMenu == 1 ) return else set varMenu to 1 endif else if ( varMenu == 0 ) return else MessageBox "Вы вышли из меню" set varMenu to 0 endif endif end 1
Siegrun Опубликовано 20 января, 2009 Опубликовано 20 января, 2009 а при употреблении зелья и исчезновении ингредиентов и камней душ ничего не будет происходить? если скажем скрипт висит на зелье - что будет? просто предмет исчезнет вместе со скриптом? Кстати! а ведь так можно зарпетить выкладывать квестовые вещи, как в Обле)))) Да я тоже тебя люблю (пока его тут нет). © Монгол Я трудный человек, но если вы рядом со мной, то и вы не простые люди.
Invire Опубликовано 20 января, 2009 Опубликовано 20 января, 2009 Да, если игрок съест предмет или тот исчезнет функцией RemoveItem, то исчезнет навсегда, а вместе с ним и скрипт, который прикреплен к нему (прекратив следовательно свое выполнение). В отличие, кстати, от функции disable - при ее вызове предмет не исчезает, а выключается из игрового мира, а скрипты на нем все еще продолжают выполняться! Я был удивлен, узнав это. В оригинальной игре есть скрипт SealedTreasuryReport на свитке с печатью, которую можно распечатать, а потом попытаться снова запечатать. Так вот, там в скрипте свиток просто дизейблится, а игроку в инвентарь добавляется новая копия. А я их выкладывал, брал обратно... Представляете, сколько теперь невидимых копий свитков болтается неизвестно где? И на каждой скрипт, который по прежнему продолжает выполняться! Пример того, как как неаккуратно написан скрипт. Чтобы полностью удалить копию объекта из игры следует использовать функцию setdelete. Как я понял, ее работа распространяется только на копии объектов, созданные во время самой игры, а не в редакторе, например, функцией PlaceItem. Функция setdelete всегда должна выполняться после того, как предмет был отключен функцией disable, и в том же скрипте одновременно с ней ничего больше не должно выполняться, а то игра вылетит. Поэтому ставим этот блок в начало, а в конце его слово return. Скрипт на объекте object: begin scr_delete_copy if ( GetDisabled == 1 ) setdelete 1;полное удаление старой копии return endif if ( onActivate == 1 ) PlaceAtMe, object, 1 0 0;создаем новую копию Disable;выключаем старую endif end Если же в редакторе была установлена хоть одна копия объекта, то удалить ее с помощью функции setdelete невозможно, даже если это и прописано в скрипте. И если создается новая копия, то игра по прежнему продолжает обращаться к старой, так как та является первой для нее.
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти