×
Меню
Индекс

MSFD Полное удаление копии

[no fix?] SetDelete flag_enum
 
     SetDelete 1
 
SetDelete использоваться в комбинации с DisableЭто означает, что Disable нужно всегда вызывать перед SetDelete. (Прим. Gwathlobal), чтобы полностью удалить объект из игры.
SetDelete 1 отмечает объект для удаления, SetDelete 0 снимает этот флаг.
Это может быть полезно в оптимизации.
Некоторые объекты симулируют свое поднятие отключением активированной копии, а затем добавлением нового объекта в инвентарь.
Это оставляет невидимые объекты в игре (что съедает время процессора и память, так как скрипт на таких объектах все равно исполняется).
Если копия отмечена для удаления, она полностью исчезает.
Если это копия из мастер-файла, то она остается, но при этом не модели, ни скрипты не используются. Если копия была создана в игре, она исчезает навсегда.
 
Примечание: Использование SetDelete с любой другой функцией в одном и том же фрейме приведет к вылету.
 
Этот скрипт вылетит:
 
Begin _spell_effect
float timer
rotate y 120 ; вылет спровоцирован этим
if ( timer < 3 )    
     set timer to ( timer + GetSecondsPassed )
else    
     disable    
     setdelete 1
endIf
 
Решения этой проблемы – сначала отключение объекта, а затем используя GetDisabled и Return, безопасное его удаление:
Begin _spell_effect
 
DontSaveObject
 
float timer
     if ( GetDisabled == 1 )
     setdelete 1
     return
endIf
 
     rotate y 120
if ( timer < 3 )
     set timer to ( timer + GetSecondsPassed )
else
     disable
 
endIf
 
end
 
Другое решение предложено Soralis, с использование локальной переменной "deletobj" как флага:
 
if ( deleteobj = 1 ) ;локальная переменная, установлена, когда хотите удалить
    if ( deletetimer == 0 )
        Disable
    endif
    if ( deletetimer < 10 )
        set deletetimer to ( deletetimer + 1 )
    endif
    if ( deletetimer == 10 )
        SetDelete, 1
    endif
    Return
endif
 
И все куда проще!
 
Begin SeDeletedObjectScript
 
DontSaveObject ; указывает не писать объект в сохранение! И это должно быть на том объекте который хотим удалить (обычно это некие динамические "помощники").
 
Short DoOnce
 
If ( DoOnce == 2 )
Set Doonce to 3 ;опционально. Т.к. объект уже улете в астрал.
        SetDelete 1
    Return
endif
 
If ( DoOnce == 1 )
Disable
Set Doonce to 2
    Return
endif
 
If ( Doonce == 0 )
делаем что-то полезное.
Set Doonce to 1
endif
 
End
 
Также, вызывайте SetDelete только из скрипта того объекта, который хотите удалить.
Object->SetDelete 1 обычно приводит к вылету.
Предмет в вашем инвентаре тоже не должен удалятся, так как это приведет к неверному расчету нагрузки.
Если вам действительно нужно удалить предмет из инвентаря, и вы знаете, что игрок его носит, то можно использовать команду Drop, перед отключением и удалением.
Также иногда при использовании SetDelete магические эффекты вызывают проблемы (Информация с форумов / Dan_Wheeler).