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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
strelok200Дата: Чт, 20.03.2014, 19:33 | Сообщение # 466
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

alex_xp_77, Вроде бы в сети уже есть выдранный выброс из АМК, а локацию подключить несложно- просто прописываешь укрытия на ней по аналогии с другими
 
denis2000Дата: Чт, 20.03.2014, 22:20 | Сообщение # 467
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

alex_xp_77, strelok200, Может конечно и есть выброс от АМК отдельно, но я не видел такого. В любом случае понадобятся знания скриптов, без них затея с выбросом бессмысленна.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
strelok200Дата: Пт, 21.03.2014, 07:46 | Сообщение # 468
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Перепутал, есть выброс выдранный из OGSM
http://ogsmod.ru/blowout-mod-v1-0/
 
alex_xp_77Дата: Сб, 22.03.2014, 21:20 | Сообщение # 469
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

Добрый вечер дорогие форумчане, у меня вопрос касаем game_maps_single, есть такой текстовый документ в X-Ray SDK, да и в игре тоже, хотел поменять визуал ПДА, что бы видно было мои новые карты, но как снять метки, точнее, как снять правильно величины terraina, и прописать их в этом документе, и еще прописал название моих локаций вот в этой строке в
game_maps_single вот тут http://SSMaker.ru/9373b9f8/ и последовал вылет такой [cut noguest=http://SSMaker.ru/ce9f4399/][/cut] Кто владеет информацией как снять правильно величину локации, и можно ли это сделать в sdk, и как исправить лог, у меня слабая надежда все же на то, что ругается на то что нету моей локации в textures.ltx, текстуру террейна добавил в папку с игрой!!На что ругается мне не понятно!!


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

alex_xp_77, Вот инструкция для ЧН, но для ЗП или ТЧ отличия несущественные - принцип сохранился.

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

Добрый день. В СГМ есть ф-ия удаления лишних отрядов Альфы.

[cut=Функция]function submodule_alfa_control(squad)
if find_in_string(squad:name(),"alfa_squad") then
local squad_level=""
if find_in_string(squad:name(),"zat_") then squad_level="zaton"
elseif find_in_string(squad:name(),"jup_") then squad_level="jupiter"
elseif find_in_string(squad:name(),"pri_") then squad_level="pripyat"
end
if squad_level~="" and sgm_functions.read_variable("alfa_squad_"..string.sub(squad:name(),1,1).."_count")>
r_alfa_params("number","max_squads_count_on_"..squad_leve l,7) then
if squad.position:distance_to(db.actor:position())>100 then
squad:remove_squad()
sgm_functions.dec_counter("alfa_squad_"..string.sub(squad:name(),1,1).."_count")
end
end
end
end
[/cut]
403 строка:
Код
if squad_level~="" and sgm_functions.read_variable("alfa_squad_"..string.sub(squad:name(),1,1).."_count")>
r_alfa_params("number","max_squads_count_on_"..squad_leve   l,7) then


Иногда возникают вылеты из-за этой функции.

[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 : ...r. - Зов Припяти\gamedata\scripts\sgm_modules.script:403: attempt to compare number with nil

stack trace:
[/cut]

Онлайн-радиус в сборке увеличен до 200 метров. Других изменений для этой функции не делал. В чем причина вылетов и как их устранить?
 
denis2000Дата: Вт, 25.03.2014, 21:57 | Сообщение # 472
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Или функция sgm_functions.read_variable или функция r_alfa_params возвращает nil вместо числа - это следствие, ищите причину.

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

Цитата sergej5500 ()
В чем причина вылетов и как их устранить?

Причина в том, что переменная sgm_functions.read_variable("alfa_squad_"..string.sub(squad:name(),1,1).."_count") равна nil.
А вот почему - не понятно ( про этот вылет часто писали в теме ошибок SGM 2.2 ).

Вылет лечится так. Перед строчкой if squad_level~="" and пишите

if sgm_functions.read_variable("alfa_squad_"..string.sub(squad:name(),1,1).."_count") == nil then return end


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

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

В СГМ есть функция.

[cut=Функция]function release_npc(actor,npc)
if npc~=nil then
if npc~=nil and get_story_object(npc:profile_name())~=nil then
unregister_story_id(npc:profile_name())
end
if alife():object(npc:id()) then
alife():release(alife():object(npc:id()),true)
end
end
end[/cut]

Вызывается из кастом-даты НПС и удаляет его. Прошу прояснить два вопроса.

1. Обязательна ли для удаляемого НПС стори-ид?
2. Обязательно ли удаляемому НПС быть в онлайне?
 
makdmДата: Сб, 29.03.2014, 21:57 | Сообщение # 475
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500,
1. Не обязательно.
2. Да обязятельно. Если НПС оффлайн, то его логика не активна.


Терпение......
И все получится!
 
FantomICWДата: Пн, 07.04.2014, 20:52 | Сообщение # 476
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

некит025, по броникам система следующая:
1. Создаем желательно новый скрипт, и там пишем функцию:
Код
function dynamic_outfit_effector()
     if db.actor:item_in_slot(7) ~= nil then  
         if db.actor:item_in_slot(7):section() == "scientific_outfit" then
         ...
         elseif db.actor:item_in_slot(7):section() == "exo_outfit" then
      ...
      end
     end  
end

Вместо трех точек - действие любые. Вчера скидывал тебе функцию запуска эффекта. При желании, можно все это дело через таблицу сократить.
Я думаю, в этом случае можно повесить функцию в bind_stalker.script-->actor_binder:update(delta):
Код
твой_скрипт.dynamic_outfit_effector()



 
некит025Дата: Вт, 08.04.2014, 14:53 | Сообщение # 477
Гражданский
Пользователи
Сообщений: 20
Награды: 0
Репутация: [ 0 ]

FantomICW, гмм... достаточно просто, это как с арефактами получается, буду пробывать, спасибо! book

Добавлено (08.04.2014, 14:53)
---------------------------------------------
FantomICW, Еще раз здравствуйте, моглибы вы перечислить все эффекты которые есть в игре, тоесть начиная от пошатывания камеры, заканчивая воздействием контролёра, и визуальные, и... которые наносят ущерб, я имею ввиду чтоб был эффект как в радиацию заходишь, но облучения не получаешь, или заходишь в пси поле и опятьше никаких повреждений, если такое возможно конечно, в моём случае при одевании костюма, идёт несколько эффектов сразу, но они визуальные, от них нет повреждения, а во втором костюме наоборот, никаких эффектов, только повреждения от пси воздействие например, понимаю, что начинаю надоедать вопросами, но помогите пожалуйста. help



 
FantomICWДата: Вт, 08.04.2014, 15:57 | Сообщение # 478
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

некит025, думаю, на перечисление всех эффектов уйдет ну где-то так часа 2))
Глянь файлы effectors.ltx и postrocess.ltx в configs/misc. Сами файлы ppe и anm лежат в anims. Еще в СГМ есть классная вещь - Гуи-проигрыватель многих эффектов. В ui_main_menu.script есть строки вызова. Форма находится в ui_mod_elements.script.



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

Добрый день. Заинтересовал такой вопрос. Можно ли написать скрипт, отслеживающий наличие на активном стволе глушителя? Если на стволе глушитель есть, то износ ствола при стрельбе умножить на 100, например. То есть без глушителя condition_shot_dec = 0.0001, а с глушителем condition_shot_dec = 0.01.

Добавлено (15.04.2014, 10:32)
---------------------------------------------
Доброе утро. Требуется функция, измеряющая дистанцию от актора до сквадов с именами stalker_sim_squad_novice, stalker_sim_squad_advanced, stalker_sim_squad_veteran и т.д. В общем со сквадами, в имени которых есть *_sim_squad_*.
Дополнительное условие - проверяемый сквад не враждебен игроку.
Стори Ид у этих сквадов нет. Функция должна вызываться из логгики рестриктора и прописываться в xr_conditions.

Как можно составить данную функцию? Заранее благодарен за советы.

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

Цитата sergej5500 ()
Можно ли написать скрипт, отслеживающий наличие на активном стволе глушителя? Если на стволе глушитель есть, то износ ствола при стрельбе умножить на 100, например.

Вообще конечно глушитель в реальности на износ если и влияет, то крайне слабо, гораздо больше влияет тип боеприпаса и внешние условия среды (например температура и влажность воздуха)
Отследить то наличие глушителя можно бес проблем проанализировав нетпакет оружия (смотри в этой теме уже обсуждалось), как повлиять на параметр износа при этом? Два варианта: скриптовый апгрейд в котором изменен соответствующий параметр или прямое воздействие на ячейку памяти движка.

Цитата sergej5500 ()
функция, измеряющая дистанцию от актора до сквадов с именами

Пробуй так:[cut]
Код

function dist_to_simsquad_le(actor, obj, p)
       local dist = p[1]
       local board = sim_board.get_sim_board()
       for k,v in pairs(board.squads) do
   local squad = alife():object(v)
        if string.find(squad:section_name(), "_sim_squad_") then
         if squad:position():distance_to_sqr(actor:position()) <= dist * dist then
          return true
         end
        end
       end
       return false
end
[/cut]


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