Модостроение. Редактирование и создание скриптов
|
|
denis2000 | Дата: Пн, 10.10.2011, 21:17 | Сообщение # 1 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Редактирование и создание скриптов Редактирование и создание скриптов на языке 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 по ссылке из шапки и соседнюю тему "Курс молодого бойца", возможно Ваш вопрос уже рассматривался.
Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки. Помните чем подробнее вопрос, тем точнее ответ.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
denis2000 | Дата: Чт, 12.03.2015, 13:24 | Сообщение # 586 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Скобку поставили, да не в том месте.
local set_model - присвоили nil get_random_string(set_model) - результат функции тоже будет nil (если не вылет) и вылет при попытке спавна пустоты.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Пт, 13.03.2015, 23:06 | Сообщение # 587 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер.
В СГМ есть функция спавна сокровищ группировок.
[cut=Функция]-- 'Создание инвентаря с ценным хабаром. Сокровища группировки. function create_base_treasure(model,x,y,z,lv,gv) local param_sid=sgm_functions.ReadStoryId(model) local param_ts=sgm_functions.ReadBaseTreasureSpot(model) local param_sc=sgm_functions.ReadSelfCommunity(model) local param_nc=sgm_functions.ReadNeedCommunity(model) local param_bi=sgm_functions.ReadBaseItems(model) local param_ii=sgm_functions.ReadTakeItemsInfo(model) local parse_table=utils.parse_spawns(param_bi) if z==nil and lv==nil and gv==nil then base_treasure=alife():create(model,level.vertex_position(x),x,y) else base_treasure=alife():create(model,vector():set(x,y,z),lv,gv) end add_story_object(base_treasure.id,param_sid) if exists(param_ts) then add_spot_on_map(base_treasure.id,param_ts,game.translate_string("st_base_treasure_name").." "..game.translate_string(param_sc)) end for k,v in pairs(parse_table) do for i=1,v.prob do alife():create(v.section,vector(),0,0,base_treasure.id) end end end[/cut]
Вызывается строкой типа
create_base_treasure("jup_witnesses_lager_treasure",311.397,28.803,-138.857,1218459,535)
Попробовал добавить в функцию спавн по спавн-пойнту.
[cut=Мой вариант]-- 'Создание инвентаря с ценным хабаром. Сокровища группировки. function create_base_treasure(model,x,y,z,lv,gv,spot_name,spot_descr) local param_sid=sgm_functions.ReadStoryId(model) local param_ts=sgm_functions.ReadBaseTreasureSpot(model) local param_sc=sgm_functions.ReadSelfCommunity(model) local param_nc=sgm_functions.ReadNeedCommunity(model) local param_bi=sgm_functions.ReadBaseItems(model) local param_ii=sgm_functions.ReadTakeItemsInfo(model) local parse_table=utils.parse_spawns(param_bi) local sp_name = spot_name local sp_descr = spot_descr if type(x) == "string" then if level.patrol_path_exists(x) then local ptr = patrol(x) secret_case = alife():create(model,ptr:point(0),ptr:level_vertex_id(0),ptr:game_vertex_id(0)) sp_name = y sp_descr = z end elseif z==nil and lv==nil and gv==nil then base_treasure=alife():create(model,level.vertex_position(x),x,y) else base_treasure=alife():create(model,vector():set(x,y,z),lv,gv) end add_story_object(base_treasure.id,param_sid) -- 1220 строка if exists(param_ts) then add_spot_on_map(base_treasure.id,param_ts,game.translate_string("st_base_treasure_name").." "..game.translate_string(param_sc)) end for k,v in pairs(parse_table) do for i=1,v.prob do alife():create(v.section,vector(),0,0,base_treasure.id) end end end[/cut]
Вызывал по горячей клавише
elseif dik==DIK_keys.DIK_R then create_base_treasure("jup_witnesses_lager_treasure","jup_witnesses_lager_treasure_pos") --create_base_treasure("jup_witnesses_lager_treasure",311.397,28.803,-138.857,1218459,535)
Спавн по координатам проходит нормально. По спавн-пойнту имею вылет.
[cut=Лог]FATAL ERROR [error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : ...ld publishing\Зов Припяти\gamedata\scripts\_g.script:1220: attempt to index global 'base_treasure' (a nil value)
stack trace:[/cut]
Как устранить вылет?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Пт, 13.03.2015, 23:32 | Сообщение # 588 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, перед строкой
if type(x) == "string" then
напиши
local base_treasure = nil
затем вместо
secret_case = alife():create(model,ptr:point(0),ptr:level_vertex_id(0),ptr:game_vertex_id(0))
напиши
base_treasure = alife():create(model,ptr:point(0),ptr:level_vertex_id(0),ptr:game_vertex_id(0))
Терпение...... И все получится!
Сообщение отредактировал makdm - Пт, 13.03.2015, 23:32 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
shram_437 | Дата: Сб, 14.03.2015, 19:51 | Сообщение # 589 |
Сталкер
Вольные сталкеры
Сообщений: 215
| Доброго вечера, товарищи мододелы! Уже давненько мечтаю сделать горячую клавишу для функции "забрать всё из инвентаря" в Тенях Чернобыля наподобие Clear sky и Зов припяти. Перечитал уже много информации на Амк форуме, но вот подходящей для себя не нашёл. Можете подсказать какие файлы отвечают за инвентарь и можно ли назначить выполнение скрипта в окне обыска ящика/трупа на кнопку? Битый час сидел все подряд файлы скриптов пересматривал(((
|
|
|
Эти 0 пользователя(ей) поблагодарили shram_437 за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 14.03.2015, 20:51 | Сообщение # 590 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата shram_437 ( ) Битый час сидел все подряд файлы скриптов пересматривал И зря, исходники движка надо было пересматривать.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
shram_437 | Дата: Сб, 14.03.2015, 21:08 | Сообщение # 591 |
Сталкер
Вольные сталкеры
Сообщений: 215
| denis2000, досадно , но спасибо что пояснили.
|
|
|
Эти 0 пользователя(ей) поблагодарили shram_437 за это полезное сообщение: |
|
|
sergej5500 | Дата: Сб, 14.03.2015, 21:12 | Сообщение # 592 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер.
В СГМ есть функция спавна сквада по координатам.
[cut=_g]-- 'Создание отряда(сквада). function create_force(squad_sect,x,y,z,lv,gv) if y~=nil then local board=sim_board.get_sim_board() local squad=board:create_force(squad_sect,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,squad_sect) 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[/cut]
[cut=sim_board] --' Создание нового отряда function sim_board:create_force(sq_id,x,y,z,lv,gv) printf("create squad called") local squad_id = tostring(sq_id) local squad = alife():create(squad_id,vector():set(x,y,z),lv,gv) squad:create_member(x,y,z,lv,gv) squad:set_squad_relation() sgm_callbacks.on_squad_create(squad_id,squad.id) for k in squad:squad_members() do local obj = k.object squad.board:setup_squad_and_group(obj) end return squad end[/cut]
Функция очень удобна. Позволяет спавнить сквады в произвольной точке. Попробовал сделать аналогичную по смыслу функцию для спавна по спавн-пойнту.
[cut=_g]function create_skvad(squad_sect,spot_name,spot_descr) local sp_name = spot_name local sp_descr = spot_descr if type(x) == "string" then if level.patrol_path_exists(x) then local ptr = patrol(x) local board=sim_board.get_sim_board() local squad=board:create_skvad(squad_sect,spot_name,spot_descr) sp_name = y sp_descr = z 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,squad_sect) 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[/cut]
[cut=sim_board]function sim_board:create_skvad(squad_sect,spot_name,spot_descr) printf("create squad called") local sp_name = spot_name local sp_descr = spot_descr local squad_id = tostring(sq_id) local ptr = patrol(x) local squad = alife():create(squad_id,ptr:point(0),ptr:level_vertex_id(0),ptr:game_vertex_id(0)) sp_name = y sp_descr = z squad:create_member(ptr:point(0),ptr:level_vertex_id(0),ptr:game_vertex_id(0)) squad:set_squad_relation() sgm_callbacks.on_squad_create(squad_id,squad.id) for k in squad:squad_members() do local obj = k.object squad.board:setup_squad_and_group(obj) end return squad end[/cut]
Вылетов при активации функции нет. Спавна тоже нет. Функция просто не работает. Где я допустил ошибку?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 14.03.2015, 21:19 | Сообщение # 593 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| shram_437, Хотя чисто теоретически можно сделать скриптовое перемещение всех объектов инвентаря, обрабатывая событие on_use функция motivator_binder:use_callback в скрипте xr_motivator.script. Но тут придется все самому делать, от рисования окна до обработки нажатий кнопки.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
makdm | Дата: Вс, 15.03.2015, 10:36 | Сообщение # 594 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, в первой функции
Цитата sergej5500 ( ) if type(x) == "string" then if level.patrol_path_exists(x) then local ptr = patrol(x)
и во второй функции
Цитата sergej5500 ( ) local ptr = patrol(x)
А какое значение присвоено X ? У тебя x = nil Поэтому и спавна нет.
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 15.03.2015, 13:30 | Сообщение # 595 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| makdm,
Спасибо за помощь. Возникла такая мысль.
[cut=Функция] -- 'Создание отряда(сквада). function create_force(squad_sect,x,y,z,lv,gv) if y~=nil then local board=sim_board.get_sim_board() local squad=board:create_force(squad_sect,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,squad_sect) 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[/cut]
Её можно применить в двух вариантах.
--create_force("army_sim_squad_novice",-154.44709777832,-29.441591262817,-380.06079101563,96937,1708) create_force("army_sim_squad_novice","esc_smart_terrain_1")
В первом варианте сквад появляется в нужной точке. Во втором варианте - на нужном смарте.
Нужно добавить третий вариант. Спавнить по спавн-пойнту. Если задан спавн-пойнт, то нужно получить от него численные значения X,Y,Z,левел-вертекс,гейм-вертекс. Использовать полученные значения для спавна по первому варианту. Свести задачу к уже решенной.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Вс, 15.03.2015, 14:49 | Сообщение # 596 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата sergej5500 ( ) Нужно добавить третий вариант. Зачем городить огород. Проще написать отдельную функцию для спавна по вей-поинтам Пропиши эту функцию в _g.script и вызывай, когда тебе нужно провести спавн. Например назовём эту функцию create_on_path
Код function create_on_path( squad_sect, path, index ) local ptr = patrol( path ) local ind = index or 0 local position = ptr:point( ind ) local board = sim_board.get_sim_board() local squad = board:create_force( squad_sect, position.x, position.y, position.z, ptr:level_vertex_id( ind ), ptr:game_vertex_id( ind ) ) squad:update() end
Вызов функции create_on_path( секция_сквада, вей-поинт, точка спавна ) Если точку спавна не указывать, то спавн будет на нулевой точке пути.
P.SСкрипт исправил ( ошибка закралась)
Терпение...... И все получится!
Сообщение отредактировал makdm - Вс, 15.03.2015, 15:03 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
shram_437 | Дата: Сб, 21.03.2015, 22:23 | Сообщение # 597 |
Сталкер
Вольные сталкеры
Сообщений: 215
| Доброго времени суток, товарищи. Можете объяснить как правильно добавить в статиску новое оружие(это я про раздел любимое оружие в пда)? В файл xr_statistic.script в таблицу оружия я новое дописал, но почему-то вместо нормальных иконок из ui_actor_weapons отображаются совершенно не те.
|
|
|
Эти 0 пользователя(ей) поблагодарили shram_437 за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 22.03.2015, 00:14 | Сообщение # 598 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата shram_437 ( ) но почему-то вместо нормальных иконок из ui_actor_weapons отображаются совершенно не те. Исправьте upgr_icon_x, upgr_icon_y, upgr_icon_width, upgr_icon_height в конфиге оружия.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
shram_437 | Дата: Пн, 23.03.2015, 02:00 | Сообщение # 599 |
Сталкер
Вольные сталкеры
Сообщений: 215
| denis2000, проблема вроде уменьшилась: неправильные иконки отображаются только у уникального оружия содержащего в названии имена секций стандартного оружия (например: fn2000_nimble). Не могли бы Вы объяснить: в таблице с оружием в файле xr_statistic название оружия - это кусок названия секции оружия (например из такой секции [wpn_fn2000] берется только fn2000 = 0,)?
|
|
|
Эти 0 пользователя(ей) поблагодарили shram_437 за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 23.03.2015, 08:27 | Сообщение # 600 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата shram_437 ( ) Не могли бы Вы объяснить: в таблице с оружием в файле xr_statistic название оружия - это кусок названия секции оружия Да именно так, смотрите внимательнее функцию: Код function set_best_weapon(hit_amount) local active_item = db.actor:active_item() if(active_item) then local s_obj = alife():object(active_item:id()) if(s_obj) then local s = s_obj:section_name() for w in string.gfind(s, "%w+") do if(weapons_table[w]~=nil) then weapons_table[w] = weapons_table[w] + hit_amount end end end local amount = 0 for k,v in pairs(weapons_table) do if(v>amount) then amount = v if(k=="rgd5" or k=="f1") then actor_statistic.favorite_weapon_sect = "grenade_"..k else actor_statistic.favorite_weapon_sect = "wpn_"..k end if(k=="desert") then actor_statistic.favorite_weapon_sect = "wpn_desert_eagle" elseif(k=="rg") then actor_statistic.favorite_weapon_sect = "wpn_rg-6" end end end end end
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
|