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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
denis2000Дата: Вс, 24.01.2016, 13:29 | Сообщение # 736
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

p[2] - это строка, ее нельзя возвести в квадрат.
Предварительно преобразуйте в число при помощи tonumber(p[2])


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
prohodchikДата: Пн, 25.01.2016, 17:13 | Сообщение # 737
Новичок
Пользователи
Сообщений: 50
Награды: 0
Репутация: [ 0 ]

Цитата asd123 ()
зачем Вы логику на выдачу инфопорций вставили в all.spawn

юзал тутор

Добавлено (25.01.2016, 17:13)
---------------------------------------------
[cut=Секция в алл спавне][12000]
; cse_abstract properties
section_name = space_restrictor
name = actor_cool
position = -437.72619628906,22.54748916626,341.4274597168
direction = 0.83660274744034,0,-0.54781007766724

; cse_alife_object properties
game_vertex_id = 422
distance = 0
level_vertex_id = 20225
object_flags = 0xffffff3e
[logic]
cfg = scripts\jupiter\actor_cool.ltx
END

; cse_shape properties
shapes = shape0
shape0:type = box
shape0:axis_x = 6.5,0,0
shape0:axis_y = 0,6.5,0
shape0:axis_z = 0,0,6.5
shape0:offset = 0,0,0
; cse_alife_space_restrictor properties
restrictor_type = 3[/cut]
[cut=Логика][logic]
active = sr_idle@start
[sr_idle@start]
on_info = {+jup_first_meet_made -stop_infoportions_in_start_game} %+infoportion_start_quests +jup_b217_welcome_faded +jup_b217_welcome_guide_talked +jup_b217_pp_end_in_scene +jup_b217_guide_welcome_end +stop_infoportions_in_start_game%[/cut]
[cut=Координаты]GameVertex ID(вертекс игры): 422
levelVertex ID(вертекс уровня): 20225
Position(Позиция) = -437.72619628906,22.54748916626,341.4274597168
Direction(Поворот) = 0.83660274744034,0,-0.54781007766724[/cut]

Вылет при компиляции:


Проект в разработке – "Болотные легенды"
 
sergej5500Дата: Вс, 31.01.2016, 13:11 | Сообщение # 738
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

prohodchik,

Посмотрите другие секции рестрикторов. Насколько помню, в секции должна быть строка вида

custom_data>>END

Или что то подобной.

За правильность написания не ручаюсь. Сейчас нет под рукой необходимых файлов.

Без такой строки спавн не соберётся.

Добавлено (31.01.2016, 13:11)
---------------------------------------------
Добрый день. Хочу вернуться к вопросу о метках на персональных рюкзаках.

Попробовал воплотить в жизнь совет denis2000 в посте 705.

Установка рюкзака. Реагируем на колбек использования бустера.

[cut]if (s_obj) and (s_obj:section_name()=="personal_rukzak") then
alife():create("personal_rukzak_box",vector():set(db.actor:position().x,db.actor:position().y,db.actor:position().z),db.actor:level_vertex_id(),db.actor:game_vertex_id())
level.map_add_object_spot("personal_rukzak_box", "ui_pda2_actor_rukzak_location", "st_ui_pda_actor_rukzak")
end
[/cut]

Секция рюкзака

[cut][personal_rukzak_box]:inventory_box
$spawn = "devices\personal_rukzak_box"
visual = dynamics\devices\dev_rukzak\dev_rukzak.ogf
custom_data = scripts\personal_rukzak.ltx
;story_id = personal_rukzak_box
[/cut]

После таких правок обнаружил, что метка ставится не на рюкзак, а на актора и перемещается по локации вместе с ним. Наличие или отсутствие у рюкзака СТОРИ ИД никаких изменений не даёт. Метка на акторе.

[cut=Скрины]




[/cut]

В каком месте допущена ошибка?
 
denis2000Дата: Вс, 31.01.2016, 13:33 | Сообщение # 739
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Ошибка естественно в вызове функции установки метки - level.map_add_object_spot, в которой первым аргументом должно быть число: id объекта для метки, а не story_id и не текст. Метка ставиться на ГГ видимо потому, что его id=0, а если в аргументах функции указано не корректное значение 0 будет взято по умолчанию.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
ted80Дата: Вс, 31.01.2016, 17:06 | Сообщение # 740
Гражданский
Пользователи
Сообщений: 15
Награды: 0
Репутация: [ 0 ]

sergej5500, Измените функцию

if (s_obj) and (s_obj:section_name()=="personal_rukzak") then
[blink]obj[/blink]=alife():create("personal_rukzak_box",vector():set(db.actor:position().x,db.actor:position().y,db.actor:position().z),db.actor:level_vertex_id(),db.actor:game_vertex_id())
[blink]local obj_id = level.object_by_id(obj)[/blink]
level.map_add_object_spot([blink]obj_id[/blink], "ui_pda2_actor_rukzak_location", "st_ui_pda_actor_rukzak")
end




Сообщение отредактировал ted80 - Вс, 31.01.2016, 17:10
 
sergej5500Дата: Пн, 01.02.2016, 09:40 | Сообщение # 741
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый день.

Поймал вылет с таким логом.

Зов Припяти\gamedata\scripts\smart_terrain.script:584: attempt to index local 'job_data' (a nil value)

584 строка в скрипте аналогична строке в соответствующем файле из оригинала ЗП. Судя по логу, что то не в порядке с работами НПС в смарте.

Локация Кордон из ЧН. Смарты и работы расставлял в СДК. После заселения каждого смарта спавнил в этом смарте тестовый сквад. Число неписей в тестовом скваде было равно числу работ в проверяемом смарте. Сбоев при проверке не было. Неписи нормально выполняли свои работы. Все точки walk и look находятся на сетке.

В момент вылета в онлайне было 4 смарта.

Главная база - (южный блокпост). В смарте 30 работ для sim_default. Было занято 20. При нахождении игрока внутри блокпоста игра вылетела.
Деревня новичков. В смарте 30 работ для sim_default. Было занято 10.
Два симуляционных смарта. В каждом по 9 работ по sim_default. В момент вылета эти смарты были пустыми.

Я не вижу причин для вылета. Все эти смарты были проверены. До переполнения им далеко.

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

sergej5500, Проверьте эксклюзивные работы, возможно ошибка в имени работы.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
avn1975Дата: Пт, 05.02.2016, 17:28 | Сообщение # 743
Гражданский
Пользователи
Сообщений: 15
Награды: 0
Репутация: [ 0 ]

создал скрипт для фонарика и пнв как детектор добавить не знаю может кто подскажет благодорю за помощь https://yadi.sk/d/vSt5ckpVoNxBA

Сообщение отредактировал avn1975 - Сб, 06.02.2016, 08:56
 
Игорь_ГоДата: Сб, 06.02.2016, 13:54 | Сообщение # 744
Отмычка
Пользователи
Сообщений: 26
Награды: 0
Репутация: [ 0 ]

Всем привет!
Сделал-переделал локации, теперь пытаюсь разобраться-повозиться со скриптами и прочей программной заумностью, посему возникли два вопроса:
1 напр., сделал дверку с костями, выбрал логику двери и... и что дальше происходит, выбирается определенный файл анимации? Тогда где находится дверная анимация ( в самой модели вроде бы нет), и возможно ли ее заменить своею?
2 есть ли в движке возможность включать лампочки по какому-нибудь событию, напр,, включением рубильника?
 
denis2000Дата: Сб, 06.02.2016, 18:07 | Сообщение # 745
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Игорь_Го,
1. Двери не имеют анимации (точнее объекты physic_door класса O_DSTR_S), у двери определенная конфигурация и настройки скелета в частности сустава door, который должен быть типа Joint и иметь настроенные углы поворота по оси Y.
Есть объекты с анимацией которые используются как двери, но по определению они physic_object класса O_PHYS_S, как например большие ворота в подземке или мост в Лиманск.
2. Есть метод для такого обекта obj:get_hanging_lamp():turn_on() - включить, obj:get_hanging_lamp():turn_off() - выключить. Использоваение смотри в xr_effects.script.


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

Добрый день. Возник такой вопрос.

1. Имеются два одинаковых бронекостюма. Один из костюмов надет на игрока. В тесте использовал Экзы Рассвета.

2. Один костюм нужно передать неписю в диалоге. Для передачи использую функцию remove_item.
xr_effects.remove_item(actor,npc,{"csky_exo_outfit"})

3. При этом удаляется костюм, надетый на игрока. Можно ли как то проверить костюм и удалить тот, который в рюкзаке?



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

sergej5500, Пробуйте так:
Цитата
function remove_item(actor, npc, p)
if (p and p[1]) == nil then abort("Wrong parameters in function 'remove_item'!!!") end
local item_section = p[1]

local obj = db.actor:object(item_section)

local function search_item(temp, item)
if (item:section() == item_section) and
((db.actor:item_in_slot(2) ~= obj) or (db.actor:item_in_slot(3) ~= obj) or (db.actor:item_in_slot(7) ~= obj) or (db.actor:item_in_slot(12) ~= obj)) then
obj = item
end
end
db.actor:iterate_inventory(search_item, db.actor)

if obj ~= nil then
alife():release(alife():object(obj:id()), true)
else
abort("Actor has no such item!")
end
news_manager.relocate_item(db.actor, "out", item)
end


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

Добрый день.

Делаю сложный квест. Игрок должен, надев любой костюм определённой группировки, передать неписю другой костюм этой же группировки. В квесте 4 костюма. Возможны любые комбинации этих костюмов. В т.ч. оба костюма могут быть одинаковы.

alfa_outfit
alfa_exo_outfit
reduce_alfa_outfit
reduce_alfa_exo_outfit

Прекондишион, открывающий ветку диалога передачи костюма. И связанные функции.

[cut=Функции]function zat_b38_plennic_has_alfa_outfit(actor,npc)
return (db.actor:object("alfa_outfit") and not get_actor_slot_item("alfa_outfit","outfit")) or sgm_functions.have_item_count("alfa_outfit",2)
end

-- 'Проверка по количеству предметов одного типа.
function have_item_count(need_item,num,st_find)
local item_section=need_item
local need_count=tonumber(num)
local has_count=0
local function calc(temp,item)
if (st_find==nil or st_find==false) and item:section()==item_section then
has_count=has_count+1
elseif st_find==true and find_in_string(item:section(),item_section) then
has_count=has_count+1
end
end
db.actor:iterate_inventory(calc,db.actor)
return has_count>=need_count
end

-- 'Проверка наличия определенного предмета в слоте.
function get_actor_slot_item(item_name,item_type)
local pistol_in_slot=db.actor:item_in_slot(2)
local rifle_in_slot=db.actor:item_in_slot(3)
local outfit_in_slot=db.actor:item_in_slot(7)
local helm_in_slot=db.actor:item_in_slot(12)
if item_name~=nil and item_type=="pistol" and pistol_in_slot~=nil and find_in_string(pistol_in_slot:section(),item_name) then
return true
elseif item_name~=nil and item_type=="rifle" and rifle_in_slot~=nil and find_in_string(rifle_in_slot:section(),item_name) then
return true
elseif item_name~=nil and item_type=="outfit" and outfit_in_slot~=nil and find_in_string(outfit_in_slot:section(),item_name) then
return true
elseif item_name~=nil and item_type=="helm" and helm_in_slot~=nil and find_in_string(helm_in_slot:section(),item_name) then
return true
else
return false
end
end
[/cut]
Ветка диалога должна быть активна, если у игрока есть нужный костюм и он не в слоте. Или нужных костюмов две штуки. Прекондишион работает нормально.

Передача костюма неписю.
function zat_b38_plennic_out_alfa_outfit(actor,npc)
xr_effects.remove_item(actor,npc,{"alfa_outfit"})
end

Если костюм на игроке и костюм, передаваемый неписю, одинаковы, то пропадает костюм, надетый на игрока. В этом случае пропадает маскировка игрока.

Правка функции remove_item по предложению denis2000 в посте выше, привела к вылету.

[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 : No such operator defined


stack trace:
[/cut]
 
denis2000Дата: Пн, 29.02.2016, 08:57 | Сообщение # 749
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата sergej5500 ()
Правка функции remove_item по предложению denis2000 в посте выше, привела к вылету.

Вместо
Код
news_manager.relocate_item(db.actor, "out", item)
надо
Код
news_manager.relocate_item(db.actor, "out", item_section)


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

Добрый вечер.

Хочу вернуться к вопросу о костюмах и слотах. После некоторых тестов пришёл к выводу, что лучше всего подходят для квеста такие функции.

[cut=Проверка наличия костюмов]function zat_b38_plennic_outfit_has_item(first_speaker, second_speaker)
local item_sections = {
[1] = "alfa_outfit",
[2] = "alfa_exo_outfit",
[3] = "reduce_alfa_outfit",
[4] = "reduce_alfa_exo_outfit"
}
local needed = 2
local count = 0
local item_section
local function calc(temp, item)
if item:section() == item_section then
count = count + 1
end
end
for k,v in pairs(item_sections) do
item_section = v
get_story_object("actor"):iterate_inventory(calc, actor)
end
return count >= needed
end[/cut]

[cut=Проверка отсутствия костюмов]function zat_b38_plennic_outfit_not_has_item(first_speaker, second_speaker)
local item_sections = {
[1] = "alfa_outfit",
[2] = "alfa_exo_outfit",
[3] = "reduce_alfa_outfit",
[4] = "reduce_alfa_exo_outfit"
}
local needed = 2
local count = 0
local item_section
local function calc(temp, item)
if item:section() == item_section then
count = count + 1
end
end
for k,v in pairs(item_sections) do
item_section = v
get_story_object("actor"):iterate_inventory(calc, actor)
end
return count < needed
end[/cut]

[cut=Передача костюма]function zat_b38_plennic_outfit_otdat(first_speaker, second_speaker)
local npc = dialogs.who_is_npc(first_speaker, second_speaker)
local actor = dialogs.who_is_actor(first_speaker, second_speaker)
local i = 1
local j = 0
local section
local item_sections = {
[1] = "alfa_outfit",
[2] = "alfa_exo_outfit",
[3] = "reduce_alfa_outfit",
[4] = "reduce_alfa_exo_outfit"
}
local function transfer_object_item(temp, item)
if (item:section() == section and i ~= 0) then
actor:transfer_item(item, npc)
i = i - 1
end
end
for k,v in pairs(item_sections) do
section = v
j = i
actor:iterate_inventory(transfer_object_item, nil)
if ((j - i) ~= 0) then
news_manager.relocate_item(actor, "out", section, j - i)
end
end
end[/cut]

Проверку проводил на одинаковых костюмах. Передал неписю в тесте 20 костюмов. 3 раза передался костюм из слота. 17 костюмов ушло из рюкзака.

Вопросы такие. Как доработать функцию передачи, чтобы проверить, не в слоте ли костюм? И передать тот, который в рюкзаке.

Если переданный костюм - экзоскелет: alfa_exo_outfit или reduce_alfa_exo_outfit, то нужно выдать инфопорцию. Она нужна для выбора визуала непися после "переодевания". Как отследить тип костюма и выдать инфопорцию?
 
Поиск: