Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Модостроение. Редактирование и создание скриптов
denis2000Дата: Пн, 10.10.2011, 21:17 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Редактирование и создание скриптов

Редактирование и создание скриптов на языке LUA

Если у вас появились вопросы по применению скриптов в игре. Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


Много интересного материала здесь (wiki), Lua_help.script, Help из SDK 0.7

Сборник модостроения ЗП v10.10.11 (автор: XOBAH): *.CHM, *.HTML
[cut noguest=Если у вас не открывается файл CHM]Если у вас не открывается файл:
1. Запустите [Пуск]=>[Выполнить] (либо хот-кей [WIN]+[R])
2. Введите команду (без кавычек) "regsvr32 %windir%\system32\hhctrl.ocx"
3. Если вылезло окно об успешном завершении вы все сделали правильно и можете перезагружать компьютер (а может и не надо)
Также: файлы МОГУТ не открываться если в пути к файлу есть: символы кириллицы, "_", "#"
Также: есть не стандартные программы-просмоторщики CHM файлов. Например: FBReader[/cut]

[cut=Где найти лог игры после вылета]Что такое LOG ошибки, и как мне его найти?
Это система отладки происходивших вылетов, которая подается игрой в форме текста, хотя не всегда.
Для того чтоб найти LOG необходимо зайти вот сюда:

В Win хр лог находится:

C:\Documents and Settings\All Users\Документы\S.T.A.L.K.E.R. - Зов Припяти\logs

Затем открываете первый файл в формате TXT, и в нем отбираете с низу 25 строчек. После кидаете эти 25 строчек в сообщение на форум.

В Win7 лог находится C:\Users\Public\Documents\S.T.A.L.K.E.R. - Зов Припяти\logs

Путь к папке с логом можно найти открыв файл fsgame.ltx который находится в корневой директории ЗП, за это отвечает строка:
...
$app_data_root$ = true | false| $fs_root$| users\
(тут мы указываем что папка пользователя, будет хранится рядом с Fsgame.ltx)
...
$logs$ = true| false| $app_data_root$| logs\
(а тут мы указываем что в папке пользователя, в подпапке Logs будут храниться наши логи)
...
[/cut][cut=Получение более подробной информации о вылете (ХОВАН)]
Открываем файл _g.script и ищем такую функцию: function abort(fmt, ...)
Там есть заккомментированная строчка "--error_log(reason)", ее и надо расскомментировать, должно получиться вот так:
Code
function abort(fmt, ...)
                             local reason = string.format(fmt, ...)
                             error_log(reason)
end

Вот для примера два одинаковых вылета, первый с функцией по умолчанию, второй - с поправленной функцией

Первый:
Code
Expression    : !m_error_code
Function      : raii_guard::~raii_guard
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
Line          : 748
Description   : ....a.l.k.e.r. - Зов Припяти\gamedata\scripts\_g.script:478: bad argument #2 to 'format' (string expected, got nil)

Второй:
Code
Expression    : 0
Function      : ErrorLog
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_engine_script.cpp
Line          : 49
Description   : 'Attempt to read a non-existant string field 'path_walk' in section 'walker@mechanic'

[/cut]


Перед тем, как задать вопрос в этой теме, прочтите все предыдущие страницы,
статьи в wiki по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки.
Помните чем подробнее вопрос, тем точнее ответ.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
FantomICWДата: Вс, 10.11.2013, 12:11 | Сообщение # 331
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

Добрый день! Хотелось бы из рестриктора запустить функцию, которая бы выбрасывала и портила все оружие, которое есть у ГГ, не считая ножа. Возможно ли такое?

Именно так и сделано при старте новой игры в оригинальном ЗП функцией damage_actor_items_on_start. А выбросить можно функцией drop_item. denis2000



 
strelok200Дата: Вт, 12.11.2013, 18:42 | Сообщение # 332
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

можно ли написать такой скрипт? При нахождении ГГ около любой аномалии (не дальше 2-х метров), на экран выводилась информация (Название аномалии, ну проч.). Если да, то как сделать проверку на то, что ГГ близок к аномалии и какая рядом аномалия?
 
denis2000Дата: Вт, 12.11.2013, 23:43 | Сообщение # 333
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

strelok200, В сктрипте bind_anomaly_field.script в функции anomaly_field_binder:update, добавляешь вызов:
Код
my_script.anom_field_update(self.object)
Создаешь скрипт my_script.script в функции anom_field_update пишешь:
Код
function anom_field_update(anomaly)
   if db.actor then
    local act_pos = db.actor:position()
    local anom_pos = anomaly:position()
    if act_pos:distance_to_sqr(anom_pos) < 4 then
           --[[Код который выполняется если ГГ на расстоянии менее 2 метров от аномалии,
                   переменная anomaly содержит объект-аномалию, параметры которой можно считать]]
    end
   end
end


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
АзазельДата: Чт, 21.11.2013, 19:36 | Сообщение # 334
Новичок
Пользователи
Сообщений: 77
Награды: 0
Репутация: [ 0 ]

Доброго времени суток. Такой ряд вопросов назрел.
Есть ли туториалы и разборы скриптов Smart cover в чн ? Очень понадобились онные. В частности добавление большего кол-ва idle анимаций. И вообще что данные скрипты из себя представляют кроме набора анимаций.
 
denis2000Дата: Пт, 22.11.2013, 12:10 | Сообщение # 335
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата Азазель ()
Есть ли туториалы и разборы скриптов Smart cover в чн

Я в этом сильно сомневаюсь, поскольку ЧН не сильно популярен у модостроителей.

Цитата Азазель ()
И вообще что данные скрипты из себя представляют кроме набора анимаций.

В основном это таблици и функции используемые другим скриптом для настройки поведения НПС (там не только список анимаций, но и много других параметров) в самарт коверах.

Цитата Азазель ()
В частности добавление большего кол-ва idle анимаций.

Поскольку это скрипты, то и исследуй из как скрипты.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
АзазельДата: Пт, 22.11.2013, 20:38 | Сообщение # 336
Новичок
Пользователи
Сообщений: 77
Награды: 0
Репутация: [ 0 ]

denis2000, Хм. Поковырялся больше.. Есть скрипт смарт ковер. Который задает имена и как вы и сказали там есть и о поведении строки. Вообщем спасибо. Пойду дальше изучать.
 
sergej5500Дата: Ср, 27.11.2013, 22:21 | Сообщение # 337
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер. Для квеста в СГМ 2.1 понадобилось сделать группу сталкеров, преследующих игрока.
Оптимальной для НПС оказалась следующая логика.

[cut=Логика][move@walker2]
move_pursue_actor = true
move_pursue_range = 15|45
move_pursue_formation = back[/cut]

Определяющими являются дистанции 15 и 45 метров. Если дистанция до ГГ меньше 15, то НПС останавливается с оружием на изготовку. Если это дружественный НПС, то он не будет перекрывать линию огня. Если дистанция от 15 до 45, то НПС с оружием в руках преследует игрока рысью. Но игрок может сохранять нужную дистанцию, не давая НПС слишком приближаться. Если расстояние больше 45, то НПС бежит как олимпийский чемпион. При разумной скорости игрока оторваться от НПС невозможно. Дистанции можно менять.

Проблема в том, что больше 6-ти НПС под эту схему поставить нельзя. Можно сделать 30 неписей. В погоню рванут максимум шестеро. Схемы поведения НПС прописаны в файле xr_move. Есть ли в СГМ ограничения на использование данной схемы поведения НПС и можно ли снять проблему 6 НПС? Заранее благодарен за советы.
 
makdmДата: Ср, 27.11.2013, 23:02 | Сообщение # 338
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, для параметра move_pursue_formation = back в файле xr_move.script определены только шесть позиций.

[cut=позиции]back = {point_1 = {dir = vector():set(0.3,0,-1), dist = 2.2}, point_2 = {dir = vector():set(-0.3,0,-1), dist = 3.4}, point_3 = {dir = vector():set(0.3,0,-1), dist = 4.6}, point_4 = {dir = vector():set(-0.3,0,-1), dist = 5.8}, point_5 = {dir = vector():set(0.3,0,-1), dist = 7}, point_6 = {dir = vector():set(-0.3,0,-1), dist = 8.2}}[/cut]

Поэтому либо не используйте move_pursue_formation, либо добавляйте позиции.

Кстати вроде как back - это "пятится назад" или "ракоход". Интересно, у вас сталкеры догоняют ГГ двигаясь задом вперёд?


Терпение......
И все получится!


Сообщение отредактировал makdm - Ср, 27.11.2013, 23:10
 
sergej5500Дата: Пт, 29.11.2013, 20:44 | Сообщение # 339
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

makdm,
Дмитрий, спасибо за совет. Сталкеры движутся вполне обычно. Задом наперед никто не ходит. Возможно у параметра неудачное название.

Добавлено (29.11.2013, 20:44)
---------------------------------------------
Добрый вечер. Для эксперимента в чистом ЗП попробовал сделать персональный тайник. Добавил секцию тайника.

[zat_test_stalker_container_1]:inventory_box
visual = dynamics\devices\dev_rukzak\dev_rukzak.ogf
story_id = zat_test_stalker_container_1


Функции для рюкзака в xr_effects

function zat_test_stalker_container_1_spawn(actor, npc)
alife():create("zat_test_stalker_container_1",vector():set(-317.32217407227,19.277782440186,610.07440185547),315400,212)
end
function zat_test_stalker_container_1_item_spawn(actor, npc)
spawn_object_in("wpn_ak74","zat_test_stalker_container_1")
end


Повесил вызов функций в ui_main_meny. Рюкзак заспавнился нормально. При наведении появляется надпись "обыскать
ящик". При попытке заспавнить в рюкзаке автомат получаю вылет:
attempt to call field 'zat_test_stalker_container_item_1_spawn

Как написать функцию, чтобы не вылетало?
 
denis2000Дата: Пт, 29.11.2013, 23:07 | Сообщение # 340
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Написали одну функцию, а вызываете другую:
zat_test_stalker_container_1_item_spawn
zat_test_stalker_container_item_1_spawn

Передаваемые параметры функции spawn_object_in - неверные, нужно так:
spawn_object_in(actor, npc, {"wpn_ak74","zat_test_stalker_container_1"})


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Сб, 30.11.2013, 11:51 | Сообщение # 341
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Доброе утро. В СГМ есть функции спавна сквада через скрипт.
create_force("val_a2_snork_squad","val_monster_burrow_2") -- указан сквад и смарт.
create_force("zat_mad_dog_squad",-349.61730957031,39.804275512695,-294.8235168457,256767,303) -- спавн по координатам.

Есть ли в чистом Зове Припяти такая возможность?
 
denis2000Дата: Сб, 30.11.2013, 12:52 | Сообщение # 342
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, В xr_effects.script есть функция спавна сквада на смарте: function create_squad(actor, obj, p), но если добавишь функцию create_force из SGM, то будет и она.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
FantomICWДата: Сб, 30.11.2013, 12:55 | Сообщение # 343
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

sergej5500, доброго утра. Есть функция create_squad из xr_effects.script. Ее можно вызвать двумя способами:
1) Красиво через логику:
Код
%=create_squad(squad : smart)%

2) Не очень красиво через скрипт:
Код
xr_effects.create_squad(nil, nil, {"squad", "smart"})

Если нужно заспавнить по координатам, то в _g.script надо переносить как-раз функцию create_force из SGM:
[cut=Код]
Код
function create_force(squad_sect,x,y,z,lv,gv)
      local squads_list=utils.parse_spawns(squad_sect)
      for k,v in pairs(squads_list) do
         for i=1,v.prob do
            if y~=nil then
               local board=sim_board.get_sim_board()
               local squad=board:create_force(v.section,x,y,z,lv,gv)
               for k in squad:squad_members() do
                  board:setup_squad_and_group(k.object)
               end
               squad:update()
            else
               local board=sim_board.get_sim_board()
               local smart=board.smarts_by_names[x]
               local squad=board:create_squad(smart,v.section)
               board:enter_smart(squad,smart.id)
               for k in squad:squad_members() do
                  board:setup_squad_and_group(k.object)
               end
               squad:update()
            end
         end
      end
end
[/cut]





Сообщение отредактировал FantomICW - Сб, 30.11.2013, 12:57
 
LazurДата: Сб, 30.11.2013, 12:57 | Сообщение # 344
Новичок
Пользователи
Сообщений: 82
Награды: 3
Репутация: [ 96 ]

Здравствуйте.
В моде Dynamic_helment визуал сменяется не только в зависимости от костюма, но и от надетого шлема. Там используется функция set_visual_name, которая доступна для ГГ. И вот пришла кой-какая идейка, но для её реализации нужна замена визуала детектора. Для класса детектора в lua_help.script подобной функции не нашёл, значит замену визуала не сделать? Или можно, но придётся заменять текущий детектор на какой-либо?


На пыльных тропинках аномальных полей
Заспавнятся наши следы...
 
denis2000Дата: Сб, 30.11.2013, 13:09 | Сообщение # 345
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Lazur, Только если переспавнить детектор с новым визуалом. Хотя ничего ведь не мешает проверить.

Цитата FantomICW ()
Не очень красиво через скрипт

Ну почему же, ведь xr_logic.script читая твою строку %=create_squad(squad : smart)%, именно так эту функцию и запустит.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
Поиск: