Перейти к содержанию

Ошибки в скрипте


Рекомендуемые сообщения

Скрипты исполняются КАЖДЫЙ КАДР сверху вниз пока действуют, соответственно если у тебя 35 fps, он будет выполнен 35 раз за одну секунду. В том то и проблема всех начинающих скриптеров - они не знают принцип действия.

 

 

Хм.. не всегда логика работает там, дге она обязана работать!... Сам автор MSFD говорит о том, что: (считаем цитатой) "Казалось бы не имеет смысла выводить в отдельные блоки, но при обособлении все начинает работать! Сколько нерабочих скриптов заработало у меня только по тому, что вместо констукции if/elseif/endif Я использовал if/endif, if/endif?" (конец считаемой цитаты) Так что не всегда все гладко, хотя казалось бы, по логике вещей все обязано работать гладко!!!

Ссылка на комментарий
Поделиться на другие сайты

lost, раз уж исправил, вышли мне на мыло, плиз!!!

 

 

не вопрос, лови! ;)

 

 

мля, поторопился постить... с почтой траблы были, ща 100-пудово выслал, так что держи, да, без темы письмо, тоже прокосячил... сорри ;)

Изменено пользователем lost81
Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Так-с, сэры, нужна ваша помощь.

 

Есть два коварных скрипта, части которых не работают.

 

Первый, переделанный из Трибунала (смерть главы ТБ в Морнхолде):

 

Begin loranScript

Short NoLore
short deathbed
float loranHealth

if ( deathbed == -1 )
return
endif

if ( GetJournalIndex ANB_DaedraDet < 120 )
  if ( GetDisabled == 0 )
      Disable
  endif
  Return
endif

if ( GetJournalIndex ANB_DaedraDet >= 120 )
  if ( GetDisabled == 1 )
      Enable
  endif
  Return
endif

if ( GetDisabled == 0 )
  Disable
endif

; вот с этого момента и не работает. Не выскакивает гритинг, когда Лоран при смерти.

set loranHealth to GetHealth

if ( GetJournalIndex ANB_DaedraDet >= 170 )
if ( loranHealth <= 50 )
if ( loranHealth < 1 )
 resurrect
 modHealth 100
endif
set deathbed to 1
endif
endif

if ( deathbed == 1 )
ForceGreeting
endif

End

 

Второй, завязан на диалоге, это переделанный из Бладмуна (квест с саблей Элберота):

 

Begin lordFalicia

short nolore
short weaponout
short saberout

if ( MenuMode == 1 )
return
endif

if ( GetDistance Player < 512 )
if ( player->GetWeaponDrawn == 1 )                                  ; игрок обнажает оружие
if (  player->HasItemEquipped "glass longsword_lord" == 1 )
 set saberout to 1                              ;нужное оружие - Меч Владыки
else
 if ( player->GetWeaponType == -1 );видимо, это рукопашный бой
  set weaponout to 1
 else
  set weaponout to 2        ;любое другое оружие
 endif
endif
else
set saberout to 0
endif
endif

End

 

Диалог же такой (строки сверху вниз, начиная с первой в самом верху, Greeting 0):

 

Ты хочешь запугать меня?.. Меч Владыки Дома! Хорошо, вы меня убедили. (Local | saberout | = |1)

Уберите оружие, или я за себя не отвечаю! (Local | weaponout | = |2)

Для чего все эти позы? Вы угрожаете мне? (Local | weaponout | = |-1)

Зачем вы беспокоите меня?

 

Непись реагирует только на Меч, то есть на срабатывание переменой saberout, а вот на другое оружие или рукопашную позу отвечает "Зачем вы беспокоите меня", что не правильно.

Ссылка на комментарий
Поделиться на другие сайты

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

Хотя в 1 скрипте:

if ( GetDisabled == 0 )
 Disable
endif

Зачем дисеблим дяденьку при JournalIndex ANB_DaedraDet от 120 до 170 и потом не востанавливаем? А может ли задисабленный дяденька гритинги давать?

 

И последний блок я бы изменил так:

if ( deathbed == 1 )
ForceGreeting
set deathbed to -1
endif

Чтобы он ForceGreeting бесконечно не повторял.

Ссылка на комментарий
Поделиться на другие сайты

Нет, не так. Дядя дизэйблится только до тех пор, пока у игрока не появляется запись со строкой 120. как только индекс равен 120 - дядя на месте и с этих пор дает квесты. Все в порядке, это работает. Я его нахожу, он дает квесты. Ты смотри дальше, когда индекс равен и больше 120, он в энейбле.

 

ФорсГритинг взхят из оригинального скрипта.

 

А ты попробуй на компе у себя потестить.

Ссылка на комментарий
Поделиться на другие сайты

Все, я понял в чем фикус-пикус, смотри:

if ( GetJournalIndex ANB_DaedraDet >= 120 )
 if ( GetDisabled == 1 )
     Enable
 endif
 Return
endif

Проверяем запись и если она >=120 идет команда return!!! А 170 - это тоже, знаешь ли, больше 120. Вот дальше этой команды скрипт и не отрабатывает. Поставь не >=, а просто == - все должно заработать. И удали следующий за этим блок:

 

if ( GetDisabled == 0 )
 Disable
endif

Иначе он постоянно будет инеблится/дисеблится... ну и те изменения, что и раньше писал, т.е. после вызова ForceGreeting нужно переменую сбрасывать, иначе он постоянно говорить будет.

Ссылка на комментарий
Поделиться на другие сайты

Второй скрипт я бы переписал так:

if ( GetDistance Player < 512 )
  if ( player->GetWeaponDrawn == 1 ); игрок обнажает оружие
     if (  player->HasItemEquipped "glass longsword_lord" == 1 )
        set saberout to 1;нужное оружие - Меч Владыки
     else
        if ( player->GetWeaponType == -1 );видимо, это рукопашный бой
           set saberout to 0
           set weaponout to 1
        else
           set saberout to 0
           set weaponout to 2;любое другое оружие
        endif
     endif
  else
     set saberout to 0
  endif
endif

 

А в диалогах фильтровал бы 2 и 3 сообщение и по saberout = 0.

Кстати там же у тебя идет проверка на weaponout= -1 а скрипт устанавливает ее в 1 или 2. Можно попробовать их местами поменять, saberout вниз, но не факт, что тогда эта нужная запись глючить не будет.

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...