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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sniper777Дата: Чт, 18.07.2013, 22:20 | Сообщение # 241
Мастер
Пользователи
Сообщений: 598
Награды: 3
Репутация: [ 49 ]

Снимаю вопрос, решил сам

Добавлено (18.07.2013, 22:20)
---------------------------------------------
Прописал нпс анимпоинт, вылет:
[cut noguest=лог][/cut]



[cut=тл][/cut]
 
denis2000Дата: Чт, 18.07.2013, 22:39 | Сообщение # 242
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sniper777, Похоже неверное имя смартковера в логике.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sniper777Дата: Пт, 19.07.2013, 09:42 | Сообщение # 243
Мастер
Пользователи
Сообщений: 598
Награды: 3
Репутация: [ 49 ]

Можно ли в скрипте спавна добавить параметр direction?


[cut=тл][/cut]
 
FantomICWДата: Пт, 19.07.2013, 09:54 | Сообщение # 244
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

sniper777, насколько я знаю, параметр direction в скриптах можно сделать если спавнишь через Net Packet.


 
makdmДата: Пт, 19.07.2013, 09:57 | Сообщение # 245
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата (sniper777)
Можно ли в скрипте спавна добавить параметр direction?

Можно. Откройте файл gamedata\configs\xr_effects.script

Найдите функцию spawn_object

В ней есть возможность поворота объекта по оси Y при спавне.


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


Сообщение отредактировал makdm - Пт, 19.07.2013, 10:10
 
strelok200Дата: Вт, 30.07.2013, 12:04 | Сообщение # 246
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Помогите разобраться пожалуйста. По условию (инфопоршень) должна появиться отметка перехода на другую локацию (ЗП)
pda.script
function fill_primary_objects()
for k,v in pairs(primary_objects_tbl) do
local obj_id = get_story_object_id(v.target)
if(obj_id) then
level.map_add_object_spot(obj_id, "primary_object", v.hint)
end
end
change_anomalies_names()
fill_sleep_zones()
if (db.actor:has_info("polkovnik_info1")) then --Условие
make_changers1() --Функция
end
end

Непосредственно сама функция
function make_changers1()
for k,v in pairs(pre_changer_tbl) do
local obj_id = get_story_object_id(v.target)
if(obj_id) then
level.map_add_object_spot(obj_id, "level_changer_up", v.hint)
end
end
end

Таблица с переходом

local pre_changer_tbl =
{
{target = "mil_to_dar", hint="mil_to_dar_name"},
}

Но ничего не происходит, отметки нету
 
denis2000Дата: Вт, 30.07.2013, 19:45 | Сообщение # 247
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

strelok200, Отсутствует объект со story_id = mil_to_dar видимо.

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

Всем, привет!
Теперь и у меня вопрос ко всем Сталкерам.
Платформа: COP 1.6.0.2
Задача: При гибели НПС , имеющего в руках Гаусс-пушку, сделать так, чтобы пушка самоликвидировалась со взрывом.

[cut noguest=Проблема]Прописыаем взрывчаику в файле weapons.ltx

[gauss_explosive]:explosive_grenade
$spawn = "dynamic_objects\scene_objects\gauss_explosive"
story_id = gauss_explosive
hit_type_blast = chemical_burn
hit_type_frag = chemical_burn
visual = dynamics\light\light_signal.ogf

Прописываем в файле death_manager..script в функции keep_item(npc, item)
после строки

local section = item:section()

следующее

if section == "wpn_gauss" then
local obj = item and item:id() and alife():object(item:id())
if obj then alife():release( obj, true ) end

alife():create( "gauss_explosive", vector():set(npc:position()),npc:level_vertex_id(), npc:game_vertex_id() )
level.add_call(
function ()
if get_story_object("gauss_explosive") ~= nil then
return true
end
end,
function ()
expl_obj = get_story_object("gauss_explosive")
expl_obj:explode(0)
end
)

return
end

И если ГГ убивает врага с расстояния 30...40 метров, то вылета нет. И всё красиво получается: НПС - падает. Оружие самоликвидируется со взрывом.
Если ближе, то вылет рандомный. Причём вылет с пустым логом. (Всё "виснет" и сброс только через Диспетчер Задач).

Тогда, я просто взял и сделал вот так:
if section == "wpn_gauss" then
local obj = item and item:id() and alife():object(item:id())
if obj then alife():release( obj, true ) end
return
end

И вылет пропал. В упор уничтожал НПС( 2..3 метра) - вылета нет
Значит проблема со спавном взрывчатки и её подрывом? Но тут вроде тоже всё правильно. Причём, если убрать удаление "Гаусс-пушки", а оставить только взрыв, то и тогда вылета нет.
Получается так, что по отдельности ( удаление Гаусса( синий цвет) и взрыв( зелёный цвет) ) работают правильно, а вот вместе - никак.[/cut]

В чём проблема?


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


Сообщение отредактировал makdm - Чт, 01.08.2013, 01:05
 
denis2000Дата: Чт, 01.08.2013, 10:32 | Сообщение # 249
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

makdm,
1. Вылет не "рандомный", для него нужны совершенно определенные условия
2. Вылет не зависит от расстояния на котором находиться НПС от ГГ
3. Вылет происходит не при сочетании удаления ствола и спавна взрывчатки, а именно при удалении ствола.
4. Свол не будет удален если до своей смерти НПС выронил его из рук по причине ранения.
И теперь причины вылета: это известная проблема при удаления оружия убитого НПС.
Что нужно для вылета:
1. НПС (враждебные или нет не важно) находящиеся в непосредственной близости от места события и которым не запрещено подбирать выпавшее оружие
2. НПС который гибнет и роняет оружие
3. Класс выпавшего оружия выше класса оружия НПС наблюдающих за этим.
Что происходит:
Во время смерти НПС оружие становиться "бесхозным" и отрабатывает скрипт подбора оружия для "видящих" это других НПС, в этот момент объект удаляется и вылет неизбежен.

На сколько я помню в SGM тоже было удаление оружия павших врагов и Николай вродебы устранил эту проблему.


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

denis2000, спасибо.
Дело в том, что всем сталкерам, которые окружают НПС прописано в файле работ следующее

[cut=Работа на смарте][walker@standart]
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false
wounded = wounded@work
meet = no_meet
;---------------------------------------------------

[logic@walker_1]
suitable = {=check_npc_name(kiborg)} true
active = walker@wait_1
prior = 200

[walker@wait_1]:walker@standart
path_walk = walker_1_walk
path_look = walker_1_look

[wounded@work]
hp_state = 0|wounded_heavy@help_heavy
hp_state_see = 0|wounded_heavy@help_heavy
hp_victim = 0|nil
hp_fight = 0|false
hp_cover = 0|false
;-----------------------------------------------------[/cut]

Как видно из скриптов всем НПС запрещено подбирать оружие, а также НПС запрещено быть ранеными.

Попробую заспавнить одного НПС на пустой локации с гаусс-пушкой.


Терпение......
И все получится!
 
denis2000Дата: Чт, 01.08.2013, 11:46 | Сообщение # 251
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

makdm,
Код
gather_items_enabled = false
- это ведь не означает, что скрипт работать не будет, это означает что НПС не будут реагировать на предметы.
С другой стороны есть логика на смарте или индивидуальная, а есть боевая схема в которой параметры логики могут и не работать.

Цитата (makdm)
Попробую заспавнить одного НПС на пустой локации с гаусс-пушкой.

Да это стоит попробовать. Можно конечно и не на пустой а в метрах 100 от других НПС.


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

Цитата (denis2000)
На сколько я помню в SGM тоже было удаление оружия павших врагов и Николай вродебы устранил эту проблему.

Проблема не устранена, а наоборот имеет место вылет.
Сталкеры жалуются на безлоговый вылет во время атаки на Церковь.
Так вот там спавнятся бандиты из sim_default_bandit_enemy_3
Если не повезло с рандомом, то спавнится бандюк с Абаканом.
У Николая по кондлисту, если основная ветка на Болотах не выполнена, то оружие, указанное в файле death_items_control.ltx подлежит уничтожению при смерти НПС.
Вот когда удаляется Абакан, то и происходит вылет без лога у церкви.
Вылет аналогичный моему.


Терпение......
И все получится!
 
denis2000Дата: Чт, 01.08.2013, 13:36 | Сообщение # 253
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата (makdm)
Проблема не устранена, а наоборот имеет место вылет.

Значит не устранена, но по крайней мере известно почему этот вылет происходит.


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

Провёл тест на пустой локации Лиманск.
Один ГГ против сталкера с Гаусс-пушкой.
Выстрел метров за 40 из снайперки - вылета нет. Оружие удалено со взрывом.
Три раза и всё чётко.
Расстрел в упор из пулемёта -
первый раз - без вылета
второй раз - вылет

stack trace:

001B:070DE345 xrGame.dll, CDialogHolder::CleanInternals()

[error][ 87] : Параметр задан неверно.

Бог его знает, в чём проблема.


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


Сообщение отредактировал makdm - Чт, 01.08.2013, 14:17
 
denis2000Дата: Чт, 01.08.2013, 18:07 | Сообщение # 255
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата (makdm)
Бог его знает, в чём проблема.

Проблема с удалением оружия, а вот каким образом лечить непонятно.


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