×
Меню
Индекс

MSFD Создание копий объектов с помощью PlaceItem

[no fix] PlaceItem "object ID", float_var_X, float_Y, float_Z, float_Zrot
 
[no fix] PlaceItemCell "object ID", "cellID", X, Y, Z, Zrot
 
Эти функции создают новые копии объектов.
PlaceItem создаст объект "Object ID" в координатах (X, Y, Z) с вращением по оси Z равном Zrot в текущей локации.
Z_Rot устанавливается не в градусах (0-360°) а в минутах (1° = 60 min): так что, если хотите повернуть кого-то на восток, пишите 5400.
На юг - 10800. Запад - 16200.
 
Функция принимает локальные переменные типа float.
PlaceItemCell делает тоже самое, но также позволяет указать ячейку, в которой будет создан предмет, включая внешние ячейки.
Это позволяет добавлять в мир предметы без предварительно расположения их в редакторе.
JOG прислал следующую инфу по PlaceItemCell:
Ну, когда я впервые попробовал PlaceitemCell, я подумал, что это очень хорошая функция, чтобы ставить предметы прямо в игре, без предварительной их установки в редакторе.
Однако я скоро понял, что нельзя обращаться к таким объектам через скрипты (Например удалять их).
Скрипт не будет компилироваться до тех пор, пока хотя бы одна копия объекта используется, и тогда удаление будет относиться к этому первому объекту, то есть все равно нужно использовать PositionCell.
 
(Примечание от GBG: это можно обойти, используя скрипт на самом объекте, тогда можно опустить стрелку в функции.)
DinkumThinkum добавил:
PlaceItemCell могла бы быть великолепной функцией для того, что я задумывал, пока я не обнаружил, что установленные таким образом NPC исчезают при сохранении и загрузке, если игрок не побывал в ячейке с ними.
(Примечание от GBG: этого можно избежать, если сделать установку NPC зависимой от нахождения игрока в ячейке. Я все равно думаю, что PlaceItem очень полезная функция.)
 
А это баг движка, который был поправлен в МСП 2.4 году так в 2018ом.
Т.е. призванные объекты которых игрок не успел увидеть, исчезают.
Т.е. если некий объект был "призван" в ячейку которую игрок не посетит в текущем сеансе игры, так в ней никогда и не появлялся.
Но если ячейка была посещена, все работало!
Но... призванные таким образом существа никак не реагировали на стражников, обратное тоже верно.
Однако, если сохраниться и повторно зайти в ячейки, можно наблюдать реакцию стражей.
Т.е. это еще один баг движка, когда "динамически" добавляемые объекты не учитываются пока не будут прочитаны из "сохранения".
Которое, фактически, является своего рода еще одним плагином... да, сохранение это плагин, в котором Игрко создает свой собственный Мир (без участия Тес Кс).
 
Примечание.
PlaceItem действительно очень полезная вещь!
Которая позволяет избегать проблем с другим плагинами.
Т.е. в плагине может быть единый скрипт, который раскидывает все новые объекты по местам и целям!
Но сами места и цели остаются неизменными, что сокращает кол-во конфликтов с другим плагинами.
Хотя, правильное указание координат требует временного размещения объекта в сцену редактора и здесь, либо:
- использовать 2 редактора, в одном писать скрипт, в другом смотреть координаты.
- использовать 1 редактор, но после вычистить все ячейки через ТЕЗАМУ.
- использовать 1 редактор, но писать скрипт во внешнем текстовом редакторе, откуда затем вставить готовый скрипт в новый плагин.
 
Пример:
При помещении этого скрипта на предмет, во время активирования предмета будет задан вопрос о типе объекта, а затем создан этот объект в 100 единицах над активированным предметом с углом вращения 45 градусов. Если выбран ключ, то ключ будет помещен в ячейку “key room”.
 
Begin makethingsimple
 
short questionAsked
short button
float myX
float myY
float myZ
 
if ( MenuMode )
     return
endif
 
if ( OnActivate == 1 )
          if ( questionAsked == 0 )
               MessageBox, "Создать новый..."  "...Горшок"  "...Ключ"
               set questionAsked to 1
               set myX to GetPos X
               set myY to GetPos Y
               set myZ to GetPos Z + 100
          endif
endif
 
if ( questionAsked != 0 )
     if ( questionAsked == 1 )
          set button to GetButtonPressed
          if ( button == -1 )
          else
               if ( button == 0 )
                    PlaceItem "Misc_pot_redware_01" myX myY myZ 45
               elseif ( button == 1 )
                    PlaceItemCell "misc key" "key room" myX myY myZ 45    
               endif
               set questionAsked to 0
               set button to –1
          endif
     endif
endif
 
end