×
Меню
Индекс

MSFD Обнаружение использования свитков или книг

 
Это на удивление трудная задача, так как необходимы OnActivate и OnPCEquip, И обе они не работают так, как ожидалось.
 
Kir нашел решение, показанное в этом скрипте для кредитного письма:
 
Begin BankLetter10
 
short button
short messageOn
short invoke
short gone
short goneway
short testdist
short PCSkipEquip
short OnPCEquip
 
set PCSkipEquip to 1
; отключаем при использовании (одноразовый объект)
if ( gone == 1 )
     if ( goneway == 1 )      ; активируется как внешний объект
          Disable
     else                         ; перетаскивается из инвентаря
          startscript BankLetter10Remove
     endif
     set gone to 0
     return
endif
 
if ( OnActivate == 1 )
     Set messageOn to 2
     set goneway to 1
endif
 
If ( OnPCEquip == 1)
     Set messageOn to 2
     Set OnPCEquip to 0    
     set goneway to 2
endif
 
if ( messageOn == 0 )
     return
endif
 
if ( messageOn == 2 )
     MessageBox " Вы хотите получить Кредитное письмо?" "Да" "Нет"
     Set messageOn to 1
     return
endif
 
if ( messageOn == 1 )
     set button to GetButtonPressed
     if ( button == 0 )
          Set invoke to 1
          Set messageOn to 0
;          return
     endif
     if ( button == 1 )
          Activate
          Set messageOn to 0
          return
     endif
endif
 
if ( invoke == 1 )
     PlaySound "Item Gold Up"
     Player->AddItem, Gold_001, 10000
     set gone to 1
     set invoke to 0
endif         
 
End
 
Вдохновленный скриптом BankLetter, я обнаружил способ исполнять скрипты на книгах и свитках, когда они экипируются из инвентаря или активируются в игровом мире и свиток/книга нормально отображаются.
Удивительно, но PCSkipEquip, а не OnPCEquip устанавливается в 1 при экипировке книги на игрока. Вот что я сделал:
 
Begin activateBook
 
short OnPCEquip
short PCSkipEquip
short doOnce
short actionFlag
 
if ( actionFlag == 1 )
     if ( doOnce == 0 )
          ; добавьте сюда ваш код
          set doOnce to 1
     endif
     set actionFlag to 0
endif
 
; PCSkipEquip устанавливается 1 каждый раз когда книги экипируется
if ( PCSkipEquip == 1 )
     set PCSkipEquip to 0
     set actionFlag to 1
     return
endif
 
; эти строки нужны, иначе книгу нельзя будет поднять с земли
if ( MenuMode == 1 )
     return
endif
 
; для активации книги снова при подъеме с земли
if ( OnActivate == 1 )
     set actionFlag to 1
     Activate
endif
 
End
 
Это должно работать без однократного условия в том случае, если вы хотели, чтобы действие совершалось каждый раз, когда вы надеваете книгу, но я это еще не тестировал.