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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
GeonezisДата: Сб, 04.08.2012, 16:29 | Сообщение # 91
Разработчик «Смерти вопреки»
Свобода
Сообщений: 2360
Награды: 30
Репутация: [ 71 ]

denis2000, как Вы и предполагали вызов snd:play_no_feedback(...) не подразумевает остановку. Использование snd:play(...) решило проблему. Большое спасибо. С вашей помощью почти закончил gui- рацию.

Смерти Вопреки
Spectrum Project
AP_Prodaction


Сообщение отредактировал GEONEZIS - Сб, 04.08.2012, 16:30
 
vladikzamДата: Ср, 15.08.2012, 12:56 | Сообщение # 92
Гражданский
Пользователи
Сообщений: 17
Награды: 0
Репутация: [ 0 ]

Нашёл скрипт , касающийся Давида
[cut]
Code

[logic]
active = move@waiting
on_death = death

[death]
on_info = %+zat_monsters_wave_defence_commander_killed =zat_monsters_wave_commander_death%

[move@waiting]
move_dest_number = 1219831
move_look_vertex = 1219848
move_state_when_center = guard
move_state_when_move = walk
meet = meet
invulnerable = {-zat_monsters_wave_fail -zat_monsters_wave_reward} true, false
combat_ignore_cond = {=check_enemy_name(zat_b18_dog_noah)} true
on_info = {=actor_neutral} %=actor_friend%, {=actor_enemy} %=actor_friend%
on_info2 = {+zat_monsters_wave_fail} nil, {+zat_monsters_wave_complete} nil
on_info3 = {+zat_monsters_wave_on_firepos} move@defence %=play_s2d_sound(characters_voice\human_01\stalker\alife\defence\actor_come_1_pda)%
[move@defence]
scheme_type = shooter
shooter_pos = 1219831
shooter_fire_look = enemy
shooter_idle_look = 1219848
shooter_clip = -1
shooter_reload = 1
shooter_type_wpn = rifle
shooter_ignore_actor = true
shooter_need_see = true
shooter_need_dist = 60
shooter_move_state = assault
shooter_idle_state = threat
shooter_fire_state = threat_fire
shooter_home_teleport = true
combat_ignore_cond = {=check_enemy_name(zat_b18_dog_noah)} true
invulnerable = {-zat_monsters_wave_appeared_1_controller} true, false
on_info = {=actor_neutral} %=actor_friend%, {=actor_enemy} %=actor_friend%
on_info2 = {+zat_monsters_wave_fail} nil, {+zat_monsters_wave_3_controller_destroyed} nil %=play_s2d_sound(characters_voice\human_01\stalker\alife\defence\end_defence_2_pda)%
[/cut]
Вопрос. Что нужно в нём изменить, чтобы Давид стал неуязвимым? Или не в нём? Просто не знаю где искать ещё.. Монстров очень много - валят его только так. Плевать, что чит - нервы дороже. Помогите. Заранее благодарен.

Добавлено (15.08.2012, 12:56)
---------------------------------------------
Ещё вопрос. В анонсе мода есть упоминание о спаунере. Насколько я понял это скриптовая тема. Как активировать спаунер? Дело в том, что прописывание в строке экзешного файла "Объект" -cheat_mode блокирует запуск игры. Лаунчер презренно игнорирует кликания . Что делать? Слышал, что в bin надо лезть и тоже самое делать с биновским лаунчером, но тоже чего то без эффекта. Может кто-нибудь совет даст как иначе эту проблему решить? Или может кто-нибудь выложит как правильно должна строка выглядеть? Заранее благодарен.


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

vladikzam
Пропишите во всех секциях значение:
invulnerable = true
Давид станет бессмертным. Файл нужно править до взятия квеста
 
denis2000Дата: Ср, 15.08.2012, 22:45 | Сообщение # 94
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

vladikzam, Какой спаунер и где вы его видели?

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

" Какой спаунер и где вы его видели?" В папке со скриптами есть файл UI_MAIN_MENU.SCRIPT . Если его внимательно изучить, то в нём есть команды для активации спаунера. Например
[cut]if dik==DIK_keys.DIK_Q then
--/self:OnMessageQuitWin()
elseif dik==DIK_keys.DIK_SUBTRACT then
self:screenshot_mode_on()
elseif dik==DIK_keys.DIK_ADD then
self:screenshot_mode_off()
elseif db.actor~=nil and dik==DIK_keys.DIK_F5 then
self:mod_options()
elseif db.actor~=nil and dik==DIK_keys.DIK_F6 then create("ID_PERSA",db.actor:position().x+10,db.actor:position().y,db.actor:position().z+1,db.actor:level_vertex_id() ,db.actor:game_vertex_id())

elseif db.actor~=nil and dik==DIK_keys.DIK_T then
self.OnButton_return_game()
run_choose_box("yes_or_no","remove_bad_outfit","Удалить текущий бронекостюм?")
elseif db.actor~=nil and dik==DIK_keys.DIK_6 then
self.OnButton_return_game()
level.show_weapon(true)
end
if find_in_string(command_line(),"-cheat_mode") and find_out_string(command_line(),"-test") then
if db.actor~=nil and dik==DIK_keys.DIK_0 then
self:set_0_factor()
elseif db.actor~=nil and dik==DIK_keys.DIK_1 then
self:set_1_factor()
elseif db.actor~=nil and dik==DIK_keys.DIK_2 then
self:set_2_factor()
elseif db.actor~=nil and dik==DIK_keys.DIK_3 then
self:set_3_factor()
elseif db.actor~=nil and dik==DIK_keys.DIK_4 then
self:set_4_factor()
elseif db.actor~=nil and dik==DIK_keys.DIK_5 then
self:set_5_factor()
elseif db.actor~=nil and dik==DIK_keys.DIK_F1 then
self:mod_modes()
elseif db.actor~=nil and dik==DIK_keys.DIK_F2 then
self.OnButton_return_game()
run_dynamic_element(ui_mod_spawner.spawn_item_dialog(),false,true)
elseif db.actor~=nil and dik==DIK_keys.DIK_F3 then
self:deliver_mp3_and_bonus()
elseif db.actor~=nil and dik==DIK_keys.DIK_F4 then
self:inc_actor_rank()
elseif db.actor~=nil and dik==DIK_keys.DIK_P then
self:set_rich_actor()
end[/cut]

А не работает. ))))

Добавлено (16.08.2012, 11:34)
---------------------------------------------
Quote (sergej5500)
Пропишите во всех секциях значение: invulnerable = true


А вот в строчках invulnerable = {-zat_monsters_wave_fail -zat_monsters_wave_reward} true, false слово false удалять или заменить на true ? Чтобы получилось invulnerable = {-zat_monsters_wave_fail -zat_monsters_wave_reward} true, true или надо чтобы было так invulnerable = {-zat_monsters_wave_fail -zat_monsters_wave_reward} true ?


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

vladikzam
Замените строки вида
invulnerable = {-zat_monsters_wave_fail -zat_monsters_wave_reward} true, false
на строку
invulnerable = true
 
denis2000Дата: Чт, 16.08.2012, 17:37 | Сообщение # 97
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

vladikzam,
1. Научись пользоваться спойлерами! В следующий раз будет предупреждение.
2. Чит-режим и спавнер две большие разницы!
3. Вот так:


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
lychagin0Дата: Чт, 16.08.2012, 21:39 | Сообщение # 98
Легенда Зоны
Вольные сталкеры
Сообщений: 1303
Награды: 9
Репутация: [ 278 ]

denis2000, добрый вечер,можно ли использовать функцию kill_npc для убийства монстра?

Да конечно. denis2000


 
CERBE[R]Дата: Пт, 17.08.2012, 01:02 | Сообщение # 99
Гражданский
Пользователи
Сообщений: 2
Награды: 0
Репутация: [ 0 ]

Всем привет ребят! Я тут новенький)) но в Sigerous Mod играю с версии 1.3. по моему мнению это лучший мод для ЗВ!
Моя проблема в том, что я хочу немного изменить один параметр, но не знаю где он =( Я хочу изменить число зомби с 400 до 1200))
P.S Это задание после сопроваждения военных и стрелка, во фриплеи, после большого выброса.
Пожалуйста помогите! Буду очень благодарен!
Заранее спасибо smile


[R|C.C.G]_CERBE[R]
 
ГлюкДата: Пт, 17.08.2012, 02:18 | Сообщение # 100
Почетный Вольный
Вольные сталкеры
Сообщений: 2606
Награды: 17
Репутация: [ 647 ]

Quote (CERBE|R|)
Я хочу изменить число зомби с 400 до 1200
Находишь в каталоге с игрой файл gamedata\scripts\sgm_tasks.script. В нем ищешь следующую строку sgm_functions.write_variable("zone_cleaning_value",400) для версии мода 2.1 или write_mod_param("zone_cleaning_value",400) для версии мода 2.2 и меняешь 400 на 1200.


Быть собой, верить в себя, не изменять себе...
 
АзазельДата: Пн, 03.09.2012, 05:07 | Сообщение # 101
Новичок
Пользователи
Сообщений: 77
Награды: 0
Репутация: [ 0 ]

Здраствуйте. Видел в одном моде на чн сделали в инвентаре аж 2 дополнительных слота под пистолеты.
Как такое реализовать в зп ? Хотя бы один слот....

Ну для начала: Что положено быку, то не положено Юпитеру! Название мода не подскажете? denis2000

Добавлено (30.08.2012, 00:27)
---------------------------------------------
denis2000, БЫЛА ССЫЛКА. Вот наконец нашел.
Resistance Mod ver. 0.2

И где там два слота под пистолеты? denis2000

Добавлено (03.09.2012, 05:07)
---------------------------------------------
denis2000, Там скрин есть. И не один.

1. Перечитайте правила выкладывания ссылок на сайт
2. На том ресурсе всего 2 скрина, которые не показывают 2 слота под пистолеты, в описании тоже 0
XOBAH
 
denis2000Дата: Пн, 03.09.2012, 21:45 | Сообщение # 102
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Азазель, То есть сам мод вы не запускали и только по скринам сделали далеко идущие выводы.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
АзазельДата: Сб, 22.09.2012, 19:02 | Сообщение # 103
Новичок
Пользователи
Сообщений: 77
Награды: 0
Репутация: [ 0 ]

Добрый день. Хотелось бы узнать как осуществить такое. Пример:
- Отдаем Кардану мп5
- Спустя пару часов готов апгрейд который заказывали.

Или тоже самое но через день.
В скриптах полный нуб поэтому просьба написать подробно (насколько это вопще возможно)

Это не возможно, поскольку нет функции передающей установленные апгрейды и нет функции скриптовой установки апгрейда. denis2000

Возможно я немного не так выразился.
Меня интересует лишь часть
"Спустя несколько часов" - тоесть чтобы оружие с апгрейдом отдавал потом а не сразу.
А насчет того что скриптовой установки апгрейда нет я знаю. Поэтому буду халтурить как и все. Выдавать готовое оружие отдельный ствол.

Тогда попытайтесь описать алгоритм при помощи которого вы собираетесь это сделать. denis2000

Добавлено (22.09.2012, 19:02)
---------------------------------------------
Да собственно без проблем.
1. Приходим к механику. Говорим какой надо апгрейд. Отдаем ствол и деньги.
2. Через некоторое время (через час или через день) приходим и забираем готовый ствол.

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

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

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

Quote (Азазель)
Да собственно без проблем.

Ах если бы, да кабы.
Quote (Азазель)
1. Приходим к механику. Говорим какой надо апгрейд. Отдаем ствол и деньги.

Приходим к механику - без коментариев biggrin
Говорим какой надо апгрейд - тоже возможно, но нет возможности убрать уже установленные апгрейды из списка поскольку нет функции передающей установленные апгрейды
Отдаем ствол и деньги - без проблем.
Quote (Азазель)
2. Через некоторое время (через час или через день) приходим и забираем готовый ствол.

Без проблем. Одно НО! Апгрейд не установлен! У вас в алгоритме нет установки апгрейда!

Quote (Азазель)
На самом деле в апгрейде никакой скриптовой части кроме диалога нет. Отдаем ствол получаем с апгрейдом. Просто в конфиге в конце файла будут на основе обычного прописаны нужные изменения в результате не один новый ствол. Которые и буду выдавать.

А вот в этих словах есть здравая идея - одно большущее НО! Количество вариантов стволов со всеми возможными комбинациями апгрейдов будет огромным.

Quote (Азазель)
Вот для части "подождать" пока механик якобы сделает апгрейд и нужен скрипт. Которые делает возможным продолжение диалога только спустя час или день.

А здесь то в чем проблема!? Эта функция очень часто используется в SGM 2.2.


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

Всем Добрый Вечер!
Как написать скрипт, удаляющий все объекты, в названии которых есть фрагмент "mar_mine_field_" одновременно со всей локации Болота вне зависимости от расстояния до Главного Героя. Нужно удалить с локации все оставшиеся мины, если ГГ получил инфопорцию "mar_army_cargo_talk_commander". Заранее благодарен за подсказки.

Если SGM v2.2, то там есть функция release_objects_by_section, которая сможет удалить предметы СО ВСЕХ локаций, которые содержат строчку переданную в качестве параметра. Для Вашего случая можно просто вызвать release_objects_by_section("mar_mine_field_").
Если не SGM v2.2, то вот необходимая функция:
[cut]function release_objects_by_section(find_string)
for a=1,65534 do
local obj = alife():object(a)
if obj then
if obj:section_name()~=nil and string.find(obj:section_name(),find_string) and obj.id~=nil then
local sect=obj:section_name()
alife():release(alife():object(obj.id),true)
end
end
end
end[/cut]XOBAH


Сообщение отредактировал sergej5500 - Вс, 30.09.2012, 19:13
 
Поиск: