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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
gamerДата: Вс, 14.09.2014, 16:58 | Сообщение # 541
Новичок
Пользователи
Сообщений: 82
Награды: 0
Репутация: [ 0 ]

подскажите в каком скрипте в ЗП находится функции потребности еды,сна?

В ЗП этого нет! Так, что говорим правду и только правду об установленном моде. denis2000

Сна нет,но голод есть .....

Подскажите где искать

Голод в движке, и особенно не влияет на геймплей. Разве что при минимальной сытости ограничены сила ГГ, но это не смертельно. Поэтому если хочешь полноценный голод и сонливость сделай скриптами сам или возьми готовые из другого мода. denis2000


Сообщение отредактировал gamer - Пн, 15.09.2014, 13:40
 
sergej5500Дата: Пт, 19.09.2014, 09:59 | Сообщение # 542
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Всем добрый день.

На базе Рассвета в СГМ добавил торговца. По сюжету база должна погибнуть. Убиваю торговца командой kill_squad из рестриктора квестовой линии.

После смерти торговца вижу это.




То есть у торговца сохранился ассортимент после гибели. Какой функцией можно воспользоваться для очисти инвентаря непися?

Готовой функции нет ее надо писать. Если труп не сильно нужен, просто удали объект вместо убийства. denis2000
 
makdmДата: Пт, 19.09.2014, 10:58 | Сообщение # 543
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, в SGM моде предусмотрено удаление лута торговцев в случае их гибели.
Файл death_manager.script

Строки
if find_in_string(self.npc:section(),"_trader") then
self.npc:iterate_inventory(release_all_immediately,self.npc)
end

Здесь вызывается функция release_all_immediately, которая также есть в этом файле.
Как видно проверка идёт по секции торговца и в этом случае, чтобы скрипт сработал, необходимо, чтобы в секции торговца была запись _trader дописанная, как правило в конце.

Например: zat_b15_stalker_trader


Терпение......
И все получится!
 
sergej5500Дата: Пт, 19.09.2014, 11:39 | Сообщение # 544
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

makdm,

[cut=Секции торговца]
[mil_rasvet_base_trader]:quest_stalker_heavy
$spawn = "respawn\mil_rasvet_base_trader"
character_profile = mil_rasvet_base_trader
spec_rank = master
community = rasvet
story_id = mil_rasvet_base_trader

[mil_rasvet_base_trader_squad]:online_offline_group
faction = rasvet
npc = mil_rasvet_base_trader
target_smart = mil_smart_terrain_7
spawn_point = mil_rasvet_base_trader_spawn
story_id = mil_rasvet_base_trader_squad[/cut]

Кончаются словом _trader.

[cut=Логика][logic@mil_rasvet_base_trader]
active = walker@mil_rasvet_base_trader
suitable = {=check_npc_name(mil_rasvet_base_trader)} true
prior = 300
level_spot = trader
trade = misc\trade\order_traders\agr_rasvet_base_trader.ltx

[walker@mil_rasvet_base_trader]
path_walk = mil_rasvet_base_trader_walk
path_look = mil_rasvet_base_trader_look
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false
combat_ignore_cond = true
combat_ignore_keep_when_attacked = true
meet = meet
invulnerable = {+mil_defence_b7_start} false, {-mil_alt_storyline_commenced} true, false

[meet]
use = {!actor_enemy !actor_has_weapon !has_enemy} true, false
allow_break = false
trade_enable = true[/cut]

Функция очистки инвентаря должна работать. Может, она работает только если непись погиб от внешних причин и не срабатывает при команде kill_squad?
 
makdmДата: Пт, 19.09.2014, 13:50 | Сообщение # 545
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, от команды это не зависит. А вот зависит от того - находится объкет online или offline
Если вы убиваете сквад, который OFFline, то классу drop_manager из death_manager.script не передаётся управление.
Поэтому убивать сквад нужно, когда он online.
В логике работы сквада пишите:

on_info = {условие_убийства_ сквада =dist_to_actor_le(150)} %=kill_squad(story_id_сквада)%

где 150 - это switch_distance
В этом случае сразу после перехода сквада ONline произойдёт его убийство и чистка лута выполнится.


Терпение......
И все получится!
 
GhosT1803Дата: Пн, 29.09.2014, 07:59 | Сообщение # 546
Удаленные



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 : ... - Зов Припяти\gamedata\scripts\xr_conditions.script:131: attempt to index local 'npc_job' (a nil value)

Подскажите ламеру ребят, что делать?
 
makdmДата: Пн, 29.09.2014, 08:59 | Сообщение # 547
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата GhosT1803 ()
Подскажите ламеру ребят, что делать?

Прочитать шапку темы. Особенно то, что выделено жёлтым цветом. И попробовать снова задать вопрос.


Терпение......
И все получится!
 
sergej5500Дата: Вс, 12.10.2014, 14:52 | Сообщение # 548
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Всем добрый день. В ходе создания дополнения для СГМ 2.1 два раза встретился с такими логами.

[cut=Лог]FATAL ERROR

[error]Expression : error handler is invoked!
[error]Function : invalid_parameter_handler
[error]File : D:\prog_repository\sources\trunk\xrCore\xrDebugNew.cpp
[error]Line : 815
[error]Description :

stack trace:[/cut]

Оба раза вылеты были как-то связаны с применением дистанционной взрывчатки.

Первый случай на Армейских Складах. Там надо было подорвать нору мутантов. Тогда я не заметил связи вылета со взрывчаткой.

Сегодня тестировал квест на Кордоне. По сюжету игрок вместе со сталкерами должен будет зачистить отряд бандитов на ферме севернее моста. До первого выстрела по бандитам они нейтральны к игроку. До начала квеста заложил на ферме заряд и ушел к квестодателю в деревню, где бункер Сидоровича. Между фермой и деревней 300-400 метров. То есть заложенный заряд оказался в оффлайне. После начала квеста вернулся к мосту. Заряд вернулся в онлайн. Подорвал заряд штатно. Он взорвался и прибил немало бандитов. После срабатывания заряда через несколько десятков секунд игра вылетает. Объект, изображающий установленный заряд, лежит на земле. Хотя он должен исчезнуть после взрыва. Если заряд не использовать, то никаких вылетов нет.

Возможна ли связь заряда с вылетом?

Скрипты, связанные с зарядом

[cut=sgm_callbacks] elseif item_name=="remote_explosive_charge" then
if get_remote_charge_full_installed()==false then
run_dynamic_element(ui_mod_elements.remote_charge(),false)
else
game_hide_menu()
game.start_tutorial("about_remote_limit")
give_object_to_actor("remote_explosive_charge")
end
elseif item_name=="remote_charge_control" then
if get_remote_charge_installed() then
detonate_remote_charge(sgm_functions.read_variable("remote_charge_1_id"),1)
detonate_remote_charge(sgm_functions.read_variable("remote_charge_2_id"),2)
detonate_remote_charge(sgm_functions.read_variable("remote_charge_3_id"),3)
end[/cut]

[cut=_g]
-- 'Создание бомбы возле обьекта.
function activate_detonate_charge(target,timer,visible,x,y,z,lv,gv)
local obj
if timer==nil then time=2000 end
if visible=="visible_big" then
if x==nil then
obj=create("detonation_charge_visible_big",target:position().x,target:position().y,target:position().z,target:level_vertex_id(),target:game_ vertex_id())
else
obj=create("detonation_charge_visible_big",x,y,z,lv,gv)
end
elseif visible=="invisible_big" then
obj=create("detonation_charge_invisible_big",target:position().x,target:position().y,target:position().z,target:level_vertex_id(),target:gam e_vertex_id())
elseif visible=="visible_small" then
if x==nil then
obj=create("detonation_charge_visible_small",target:position().x,target:position().y,target:position().z,target:level_vertex_id(),target:gam e_vertex_id())
else
obj=create("detonation_charge_visible_small",x,y,z,lv,gv)
end
elseif visible=="invisible_small" then
obj=create("detonation_charge_invisible_small",target:position().x,target:position().y,target:position().z,target:level_vertex_id(),target:g ame_vertex_id())
end
sgm_flags.value_detonation_charge=obj.id
start_flague_timer("timer_detonation_charge",timer)
end
-- 'Проверка на установленную взрывчатку.
function get_remote_charge_installed()
return sgm_functions.read_variable("remote_charge_1_id")~=0 or sgm_functions.read_variable("remote_charge_2_id")~=0 or sgm_functions.read_variable("remote_charge_3_id")~=0
end
function get_remote_charge_full_installed()
return sgm_functions.read_variable("remote_charge_1_id")~=0 and sgm_functions.read_variable("remote_charge_2_id")~=0 and sgm_functions.read_variable("remote_charge_3_id")~=0
end
-- 'Детонация взрывоопасного объекта по ID.
function detonate_explosive_charge(charge_id,flags_charge)
if charge_id~=nil and level.object_by_id(charge_id)~=nil then
level.object_by_id(charge_id):explode(0)
if flags_charge==true then
sgm_flags.value_detonation_charge=0
end
end
end
function detonate_remote_charge(charge_id,charge_seq)
if sgm_functions.read_variable("remote_charge_"..charge_seq.."_timer")~=0 then
start_flague_timer("timer_remote_charge_"..charge_seq,sgm_functions.read_variable("remote_charge_"..charge_seq.."_timer"))
else
if charge_id~=0 then
detonate_explosive_charge(charge_id,false)
end
remove_spot_on_map(sgm_functions.read_variable("remote_charge_"..charge_seq.."_id"),sgm_flags.spot_remote_charge)
sgm_functions.write_variable("remote_charge_"..charge_seq.."_id",0)
end
end
-- 'Проверка взрывчатки РС-15.
function check_remote_charge(charge_num)
if check_flague_timer("timer_remote_charge_"..charge_num) then
abort_flague_timer("timer_remote_charge_"..charge_num)
sgm_functions.write_variable("remote_charge_"..charge_num.."_timer",0)
detonate_remote_charge(sgm_functions.read_variable("remote_charge_"..charge_num.."_id"),charge_num)
end
if sgm_functions.read_variable("remote_charge_"..charge_num.."_id")~=nil and sgm_functions.read_variable("remote_charge_"..charge_num.."_id")~=0 then
if not alife():object(sgm_functions.read_variable("remote_charge_"..charge_num.."_id")) then
remove_spot_on_map(sgm_functions.read_variable("remote_charge_"..charge_num.."_id"),sgm_flags.spot_remote_charge)
sgm_functions.write_variable("remote_charge_"..charge_num.."_id",0)
sgm_functions.write_variable("remote_charge_"..charge_num.."_timer",0)
abort_flague_timer("timer_remote_charge_"..charge_num)
end
end
end[/cut]

Возможно, скрипты, связанные с зарядами, есть и в других файлах.

Можно ли обеспечить нормальную работу заряда, если игрок после минирования уходил далеко от точки закладки зарядов?


Сообщение отредактировал sergej5500 - Вс, 12.10.2014, 16:50
 
denis2000Дата: Пн, 13.10.2014, 12:05 | Сообщение # 549
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Попробуй в функции activate_detonate_charge перед:
Код
sgm_flags.value_detonation_charge=obj.id
start_flague_timer("timer_detonation_charge",timer)

добавить:
Код
obj:can_switch_offline(false)


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

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

smart_terrain

Можно ли поправить файл, чтобы движок не ставил непися на работу, даже если эта работа ему подходит, если эта работа уже занята другим НПС? Иногда неписи становятся на одну работу по двое. Если файл можно поправить, то как это правильно сделать?
 
denis2000Дата: Сб, 01.11.2014, 21:11 | Сообщение # 551
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата sergej5500 ()
Если файл можно поправить, то как это правильно сделать?

Я например считаю, что правильнее сделать больше работ и назначать им различные приоритеты, тогда скрипт отрабатывает правильно. Дело в том что скрипт проверяет свободна ли работа:
Код
-- Если работа пустая или ее занимаем мы сами - выбираем ее.
      if v.npc_id == nil then

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


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

Подскажите скрипт для выпадения нескольких предметов при использовании одного(как например мед. сумка в sgm)

КМБ Урок 56 для кого? denis2000
 
СахарДата: Пн, 01.12.2014, 10:23 | Сообщение # 553
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

Всем доброго здравия.
Попробовал сегодня создать «СМС» с новой иконкой.
Код
function test_sms()
  news_manager.(actor, d3_czech_start_dialog, ui_inGame2_neutral_2_mask)
end

Так как я в скриптах полный 0, так что последовал вполне логичный вылет.
Код
Expression    : !m_error_code
Function      : raii_guard::~raii_guard
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
Line          : 748
Description   : ....e.r. - Çîâ Ïðèïÿòè\gamedata\scripts\xr_logic.script:648: attempt to index global 'xr_effects' (a nil value)

Может, кто объяснить, в чём ошибка?


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

Сахар,

Думаю, что проблема в кавычках. Их нет.

Я делаю СМС-ки так.

function esc_b2_bandit_enemy_task_sms(actor,npc)
news_manager.send_tip(db.actor,"esc_b2_bandit_enemy_task_sms_text",0,"portrait_Wolf",8000,nil,"esc_b2_stalker_wolf_title")
end

esc_b2_bandit_enemy_task_sms_text - ссылка на текст СМС. Файл в configs\text\rus.
esc_b2_stalker_wolf_title - ссылка на автора СМС. Файл в configs\text\rus.

portrait_Wolf - ссылка на news_manager.script. Там должна быть строка типа portrait_Wolf = "ui_inGame2_wolf",
ссылка на секцию в ui_actor_portrets

Добавлено (22.12.2014, 23:38)
---------------------------------------------
Добрый вечер.

Возникло два вопроса.

Несколько месяцев назад Дмитрий (makdm) для моей сборки предложил функцию принудительной уборки оружия в рюкзак из активного слота и блокировки пользования GPS-навигаторами.

[cut=Функция]function stop_weapon_and_guidebook(actor,npc)
if actor:item_in_slot(2) ~= nil then
local active_item = actor:item_in_slot(2)
local actor_weapon = alife():object(active_item:id())
local section_name = actor_weapon:section_name()
local rukzak_weapon = alife():create( section_name, actor:position(), actor:level_vertex_id(), actor:game_vertex_id(), actor:id() )
rukzak_weapon:clone_addons(actor_weapon)
local sobj = active_item and active_item:id() and alife():object(active_item:id())
alife():release( sobj, true )
end
if actor:item_in_slot(3) ~= nil then
local active_item = actor:item_in_slot(3)
local actor_weapon = alife():object(active_item:id())
local section_name = actor_weapon:section_name()
local rukzak_weapon = alife():create( section_name, actor:position(), actor:level_vertex_id(), actor:game_vertex_id(), actor:id() )
rukzak_weapon:clone_addons(actor_weapon)
local sobj = active_item and active_item:id() and alife():object(active_item:id())
alife():release( sobj, true )
end
local hud = get_hud()
hud:HideActorMenu()
end[/cut]

Сегодня тестеры обнаружили, что при перемещении ствола в рюкзак теряются обвесы (прицелы и т.п.). Для проверки заспавнил себе Абакан, навесил прицел. После срабатывания функции Абакан в рюкзаке. Прицел пропал с концами.
Можно ли это исправить?

И еще вопрос. Нормально эта функция вызывается рестриктором. Для теста попробовал вызвать её горячей клавишей.

elseif dik==DIK_keys.DIK_S then
xr_effects.stop_weapon_and_guidebook()

Немедленно поймал лог.

[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 : ...shing\Зов Припяти\gamedata\scripts\xr_effects.script:5244: attempt to index local 'actor' (a nil value)


stack trace:[/cut]

Строка 5244 if actor:item_in_slot(2) ~= nil then.

Вопрос. Почему функция нормально работает, если вызывается рестриктором и дает жука по горячей клавише?

 
makdmДата: Вт, 23.12.2014, 20:16 | Сообщение # 555
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
функцию принудительной уборки оружия в рюкзак из активного слота и блокировки пользования GPS-навигаторами.

sergej5500, попробуй другую функцию.
В xr_effects.script пишешь:

[cut noguest=функции]function disable_weapon_and_guidebook(actor,npc)
actor:hide_weapon()
get_hud():HideActorMenu()
end

function enable_weapon(actor,npc)
actor:restore_weapon()
end[/cut]

Соответственно в логике рестриктора

[sr_idle@_1]
on_info = %=disable_weapon_and_guidebook%
on_info2 = {Условие} sr_idle@_2 %=enable_weapon%

[sr_idle@_2]

Цитата sergej5500 ()
Почему функция нормально работает, если вызывается рестриктором и дает жука по
горячей клавише?

Потому что в функцию не передан аргумент actor
Вызов должен быть такой

xr_effects.stop_weapon_and_guidebook(db.actor)


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


Сообщение отредактировал makdm - Вт, 23.12.2014, 20:19
 
Поиск: