Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: 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 по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
makdmДата: Вт, 27.08.2013, 17:02 | Сообщение # 286
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

denis2000, Спасибо, что откликнулся.
Самое интересно, что функция get_clsid(object) при проверке объекта сквада возвращает число 94.
А у объекта сквад, как выяснилось, нет клиентской части, только серверный объект.
Поэтому решил немного по другому.

http://sigerous.ru/forum/17-3149-1189430-16-1377608146


Терпение......
И все получится!
 
metalistДата: Ср, 28.08.2013, 16:08 | Сообщение # 287
Гражданский
Пользователи
Сообщений: 6
Награды: 0
Репутация: [ 15 ]

Подскажите, пожалуйста, где можно почитать про callback'и. Заранее благодарен.
 
denis2000Дата: Ср, 28.08.2013, 17:04 | Сообщение # 288
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

metalist, Описание класса "callback" есть, например на АМК в контексте описания класса "object_binder"

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
NIVДата: Чт, 29.08.2013, 19:36 | Сообщение # 289
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Подскажите, пожалуйста по здоровью актора. Написал в функции:
Код
db.actor.health = -1

Вроде как здоровье должно уменьшаться на 100%, но получается не совсем так.
Если у актора было 100% здоровья, то после этой функции здоровье падает до одной полосочки, автоматом включается тяжелое дыхание (тяжелое ранение?). А если у актора здоровье было меньше полного, то оно падает до трёх полосочек и тяжелого дыхания нет. В чем может быть дело?
Можно ли такой функцией уменьшения здоровья убить актора?
Можно ли установить уровень здоровья актору / НПС, аналогично функции set_condition для предмета?


Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
 
FantomICWДата: Чт, 29.08.2013, 20:36 | Сообщение # 290
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

NIV, ГГ можно убить оборотом db.actor:kill(db.actor). Кстати, в xr_effects.script даже существует функция kill_actor с таким наполнением:
[cut=Функция ]
Код
function kill_actor(actor, npc)
   db.actor:kill(db.actor)
end
[/cut]
А также ей подобные kill_npc и kill_squad:
[cut=Функции]
Код
function kill_npc(actor, npc, p)
   if p and p[1] then
    npc = get_story_object(p[1])
   end
   if npc ~= nil and npc:alive() then
    npc:kill(npc)
   end
end

Код
function kill_squad(actor, obj, p)
   local story_id = p[1]
   if story_id == nil then
    abort("Wrong squad identificator [NIL] in kill_squad function")
   end
   local squad = get_story_squad(story_id)
   if squad == nil then
    return
   end
   local squad_npcs = {}
   for k in squad:squad_members() do
    squad_npcs[k.id] = true
   end

   for k,v in pairs(squad_npcs) do
    local cl_obj = db.storage[k] and db.storage[k].object
    if cl_obj == nil then
     alife():object(tonumber(k)):kill()
    else
     cl_obj:kill(cl_obj)
    end
   end
end
[/cut]





Сообщение отредактировал FantomICW - Чт, 29.08.2013, 20:36
 
NIVДата: Чт, 29.08.2013, 21:24 | Сообщение # 291
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

FantomICW, спасибо, это понятно. Я же спрашивал, почему параметр db.actor.health не становится отрицательным. А может и становится, но потом преобразуется в положительный?

Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"

Сообщение отредактировал NIV - Чт, 29.08.2013, 21:25
 
sergej5500Дата: Чт, 29.08.2013, 21:58 | Сообщение # 292
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый Вечер.
В тестовых целях нужно в СГМ 2.1 удалять сквады с конкретным ID и НПС с конкретным ID. Нужно, чтобы функции вызывались через ui_main_menu при нажатии определённой клавиши. Что-то вроде:
elseif db.actor~=nil and dik==DIK_keys.DIK_F5 then
self:mod_options()
elseif db.actor~=nil and dik==DIK_keys.DIK_A then
release_npc("zat_b38_alfa1")
elseif db.actor~=nil and dik==DIK_keys.DIK_S then
remove_squad("zat_b104_zombied_1")


Вопрос, какие СГМ-функции для этой цели можно применить?
 
FantomICWДата: Пт, 30.08.2013, 00:58 | Сообщение # 293
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

Сергей, из СГМ-функций я накопал set_squad_removed из _g.script, которая, фактически, является дочерней от функции remove_squad из xr_effects.script. Это для сквадов, разумеется. А вот для НПС из набора функций СГМ не вижу. Есть все из того же xr_effects.script функция remove_npc, в которой есть СГМ-правки.




Сообщение отредактировал FantomICW - Пт, 30.08.2013, 00:59
 
denis2000Дата: Пт, 30.08.2013, 10:38 | Сообщение # 294
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

NIV, db.actor.health - это не функция, а параметр. К тому-же вы не управляете им на прямую, а передаете величину на которую его нужно изменить.
Цитата (NIV)
Можно ли такой функцией уменьшения здоровья убить актора?

Да:
Код
db.actor.health = -1
db.actor.health = -1
гарантированно убивает.
Цитата (NIV)
Можно ли установить уровень здоровья актору / НПС, аналогично функции set_condition для предмета?

Да, на примере ГГ:
Код
db.actor.health = 0.3 - db.actor.health

Цитата (NIV)
почему параметр db.actor.health не становится отрицательным

ГГ умрет - станет


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
9vova8Дата: Пт, 30.08.2013, 18:24 | Сообщение # 295
Новичок
Пользователи
Сообщений: 91
Награды: 2
Репутация: [ 6 ]

Доброго времени суток, у меня вопрос: как телепортировать ГГ по условию в диалоге, сделал функцию в dialogs_zaton.script с ссылкой <action>dialogs_zaton.teleport_to_pripyat</action>
[cut]function teleport_to_pripyat(actor, npc, p)
db.actor:set_actor_position(vector():set(-180.71,13.94,78.24)145,580244)
level.add_pp_effector ("teleport.ppe", 333, false)
end[/cut]

Игра вообще не реагирует.




Сообщение отредактировал 9vova8 - Пт, 30.08.2013, 18:26
 
sergej5500Дата: Пт, 30.08.2013, 18:29 | Сообщение # 296
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

9vova8,
Попробуй убрать из функции гейм и левел вертекс. Должны быть 3 координаты точки, на которую переносится ГГ.
 
9vova8Дата: Пт, 30.08.2013, 18:43 | Сообщение # 297
Новичок
Пользователи
Сообщений: 91
Награды: 2
Репутация: [ 6 ]

sergej5500, теперь телепортирует, но вот ошибка
[cut]FATAL ERROR

[error]Expression : error handler is invoked!
[error]Function : handler_base
[error]File : D:\prog_repository\sources\trunk\xrCore\xrDebugNew.cpp
[error]Line : 764
[error]Description : pure virtual function call


stack trace:[/cut]


 
sergej5500Дата: Пт, 30.08.2013, 18:55 | Сообщение # 298
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

9vova8,
Попробуй убрать строку
level.add_pp_effector ("teleport.ppe", 333, false)
 
9vova8Дата: Пт, 30.08.2013, 18:59 | Сообщение # 299
Новичок
Пользователи
Сообщений: 91
Награды: 2
Репутация: [ 6 ]

sergej5500, не помогло

 
sergej5500Дата: Пт, 30.08.2013, 19:06 | Сообщение # 300
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

9vova8,
Что, собственно, должно произойти после телепортации ГГ на эту точку?
 
Поиск: