×
Меню
Индекс

MSFD Манекены

Это очень популярно, т.к. позволяет показать коллекцию собранной брони.
Найти манекены можно во многих модах с домами.
Здесь показано, как это работает (огромное спасибо Stephen Kent aka Riiak Shi Nal за то, что поделился скриптом).
Этот пример «следующего поколения», который использует функции Трибунала, чтобы проверить наличие брони/оружия на манекене и предупредить об этом пользователя, пока он не поднял манекен. (Riiak еще не разобрался, как заставить манекены показывать оружие).
Также разбит на два различных скрипта, чтобы поддерживать и мужскую, и женскую версию манекенов.
Эти изменения не предохраняют игрока от потери прочих вещей при подъеме манекена, если они в то время были на нем.
Я добавил свои комментарии к комментариям Riiak'а.
 
На самом деле манекен — обычный NPC со здоровьем равным нулю или труп (здоровье установлено в 0 из TES CS). В этой версии нужно просто активировать их, чтобы дать предметы, манекен автоматически наденет броню.
 
Begin rsn_mannequin_f_script
 
short button
short questionState
short nEquipType
short nStillEquipped
float fDeleteTimer
 
SkipAnim ;GBG: Это необходимо, это заставит манекена, который явл. NPC, стоять на месте
 
if ( menumode == 1 )
return
endif
 
if ( GetDisabled == 1 )
; если манекен отключен, ждем немного и удалим копию
Set fDeleteTimer to ( fDeleteTimer + GetSecondsPassed )
if ( fDeleteTimer > 5 )
SetDelete 1
endif
return
endif
 
if ( OnActivate == 0 )
if ( questionState == 0 )
return
endif
endif
 
if ( questionState == 0 )
MessageBox, "Одеть манекен", "Передвинуть манекен", "Доб/Удалить Броню"
set questionState to 1
endif
 
if ( questionState == 1 )
set button to GetButtonPressed
 
if ( button == 0 )
set questionState to 10
elseif ( button == 1 )
set questionState to 0
Activate
endif
endif
 
if ( questionState == 10 )
  ; Эта секция разбита на 2 группы вложений из-за ограничений на вложения
  ; скриптового языка.
  Set nStillEquipped to 0
  ; Проверка, есть ли оружие (в основном для того, если кто-то догадается
  ; как заставить манекены показывать оружие)
  Set nEquipType to ( GetWeaponType )
  if ( nEquipType == -1 )
    ; Проверка, есть ли броня (Примечание: есть 10 различных частей
    ; брони, так что проверяем каждую индивидуально)
    Set nEquipType to ( GetArmorType 0 )
    if ( nEquipType == -1 )
      Set nEquipType to ( GetArmorType 1 )
      if ( nEquipType == -1 )
        Set nEquipType to ( GetArmorType 2 )
        if ( nEquipType == -1 )
          Set nEquipType to ( GetArmorType 3 )
          if ( nEquipType == -1 )
            Set nEquipType to ( GetArmorType 4 )
            if ( nEquipType == -1 )
              Set nEquipType to ( GetArmorType 5 )
              if ( nEquipType != -1 )
                Set nStillEquipped to 1 ;GBG: Установить в 1, если броня все еще надета
              endif
            else
              Set nStillEquipped to 1
            endif
          else
            Set nStillEquipped to 1
          endif
        else
          Set nStillEquipped to 1
        endif
      else
        Set nStillEquipped to 1
      endif
    else
      Set nStillEquipped to 1
    endif
  else
    Set nStillEquipped to 1
  endif
 
if ( nStillEquipped != 1 ) ;Продолжаем, только если не нашли ничего надетого.
  Set nEquipType to ( GetArmorType 6 )
  if ( nEquipType == -1 )
    Set nEquipType to ( GetArmorType 7 )
    if ( nEquipType == -1 )
      Set nEquipType to ( GetArmorType 8 )
      if ( nEquipType == -1 )
        Set nEquipType to ( GetArmorType 9 )
        if ( nEquipType == -1 )
          Set nEquipType to ( GetArmorType 10 )
          If ( nEquipType == -1 )
            ;Показать этот вопрос только если на манекене не осталось оружия/брони.
            MessageBox "Вы убрали все вещи с манекена?", "Да", "Нет"
          else
            Set nStillEquipped to 1
          endif
        else
          Set nStillEquipped to 1
        endif
      else
        Set nStillEquipped to 1
      endif
    else
      Set nStillEquipped to 1
    endif
  else
    Set nStillEquipped to 1
  endif
endif
 
; Теперь переходим к следующей стадии обработки (либо ждем выбора пользователя, либо
; активируем немедленно)
set questionState to 20
endif
 
if ( questionState == 20 )
if ( nStillEquipped != 1 )
set button to GetButtonPressed
else
; На манекене все еще есть оружие/броня, так что мы активируем его и предупреждаем
; пользователя вместо убирания манекена.
          MessageBox "Вы не забрали все вещи."
          Set button to 1 ;говорит, что на манекене есть вещи
     endif
 
if ( button == 0 )
          set questionState to 0
; Отключаем текущий манекен
; и создаем новый, не заботясь о потере вещей
; GBG: если манекен будет много перемещаться
; то функция SetDelete пригодиться
          Disable
; Это предмет, содержащий скрипт
; на создание нового манекена при выбрасывании.
; GBG: для "женского" манекена будет другой предмет
player->addItem, "_rsn_man_f_holder", 1
playSound "Item Misc Up"
elseif ( button == 1 )
; На манекене остались вещи (либо с проверки, либо по выбору пользователя)
set questionState to 0
Activate
endif
endif
 
end
 
Следующий скрипт вешается на предмет, добавляемый в инвентарь, когда мы перемещаем манекен.
Когда вы бросите его, у ваших ног появиться новый манекен, без брони. Вы ее все иначе потеряете:
 
; Скрипт разбит на 2 скрипта, чтобы поддержать 2 пола манекена.
 
Begin rsn_man_f_holder_script
 
short OnPCDrop
float fDeleteTimer
 
if ( GetDisabled == 1 )
; если держатель был отключен, тогда подождем и удалим копию
Set fDeleteTimer to ( fDeleteTimer + GetSecondsPassed )
if ( fDeleteTimer > 5 )
SetDelete 1
endif
return
endif
 
if ( OnPCDrop == 1 )
Disable
; Это NPC с 0 здоровьем, стоящий труп.
PlaceAtPC, "_rsn_mannequin_female", 1, 0, 0
Set OnPCDrop to 0
endif
 
end
 

 
Самый простой манекен, это тело (труп) с уникальной анимацией (стояния вместо лежания) (т.е. Death1 анимация = стойке в которое манекен должен стоять).
И флаг Corpses persist. Что не даст случайно убрать тело.
Т.е. такой статичный шкафчик который будет напяливать на себя самые крутые шмотки которые в него будут положены.
А также, анлим по весу...
И не нужно никаких скриптов на нем от слова совсем!
 
Другой вопрос каким методом размещать "это" в желаемой локации и координатах.
Т.е. если нужна "простая витрина", то проще всего создать плагин (с новым домом) куда поставить "чучелку" без возможности ее перестановки.
 
Либо писать (придется) скрипт примерно такого вида:
Это позволит передвигать манекен по помещению, без необходимости вытаскивания вещей из оного.
Другой вопрос, как делать объект "транспортабельным", впрочем об этом было выше.
При активации (можно) спросить игрока, что он хочет сделать.
Либо опрашивать на режим, как ниже.
Если снейк, то даем доступ к инвентарю (либо двигаем рядом с игроком), если обычный режим (движения игрока) сбрасываем активацию.
Если игрок прочитал особое заклинание, убираем манекен и даем игроку "маркер" который станет "новым" манекеном при выбросе из инвентаря в новой локации.
Главное, не забыть сначала взять все вложенное...
 
Begin C00_BrazerMooverlampV1
 
; передвижные светильники в приделах помещения.
; ПодсвещникЪ 141 ед +z. light_com_lamp_02_128
;***************************************************************
float myx
float myy
float myz
Short MOOW ;абстрактная переменная
Short framecounter
;************************************************************
DontSaveObject
;***************************************************************
if ( MenuMode == 1 )
     return
endif
;***************************************************************
if ( getDisabled == 1 )
     setDelete 1
     return
endif
;************************************************************
if ( GetDistance Player >= 256 )
     return
endif
;*************************************************************** это секция передвижения объекта.
if ( MOOW == 1 )
     set myx to ( Player->GetPos x )+80
     set myy to ( Player->GetPos y )
     set myz to ( Player->GetPos z )+141
     SetPos x myx
     SetPos y myy
     SetPos z myz
endif
;***************************************************************
if ( GetPCSneaking == 0 )
     if ( MOOW == 1 )
     set MOOW to 0
     set MLOOK to 0
     return
     endif
endif
;************************************************************ Возможность взять светильник с собой.
if ( GetDistance Player <= 170 ) ; дистанция вытянутой руки
     if ( player->GetSpellEffects "#_Lch_Pick" == 1 ) ;собственно особый спелл (заклинание) которое (здесь) упаковывает жаровню даэдрическую в инвентарь игрока.
     DISABLE
     Player->AddItem "#_brazier_lamp_02_128" 1
     Player->PlaySound3d "Pack"
     return
     endif
endif
;************************************************************
If ( framecounter < 100 ) ; это блокирует от поспешной активации движения. Т.е. игроку надо несколько подождать рядом, что бы объект пришел в движение.
     set framecounter to ( framecounter + 1 )
     Return
Endif
set framecounter to 0
;************************************************************
if ( GetDistance Player <= 158 ) ; дистанция вытянутой руки
;************************************************************
if ( GetPCSneaking == 1 ) ; тригер (запускающий перемещение объекта рядом с игроком) иначе - объект спокойно стоит. В теории, можно использовать особое заклинание.
     if ( MOOW == 0 ) ;
     if ( MLOOK == 0 ) ;
     set MOOW to 1 ; локальная перемещалка
     set MLOOK to 1 ; глобальный лок, дабы не таскать множество светильников. Т.е. это Глобальная переменная! Впрочем для отдельного манекена она вряд ли будет нужна.
     return
     endif
     endif
     endif
endif
 
end