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


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


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

banananua,
В профилях "Альфы" прописано characters_voice\human_01\military\.
Соответственно, у них озвучка военных. Чтобы прописать им озвучку наёмников нужно эту строку заменить на
characters_voice\human_03\killer\. Тогда они загворят по немецки. Файл character_desc_extended в папке gamedata\configs\gameplay.
 
Earth2SpaceДата: Сб, 09.03.2013, 09:51 | Сообщение # 152
Механик-водитель 6-го моторизованного квада
Долг
Сообщений: 344
Награды: 5
Репутация: [ 103 ]

Имеется ошибка в xr_wounded.script, скорее всего здесь:
Код
  local wounded_time = xr_logic.pstor_retrieve(self.npc, "wounded_time")
   if wounded_time ~= nil and wounded_time <= 200000 then
    xr_sound.set_sound_play(self.npc:id(),"help_thanks")
   end
    
   xr_logic.pstor_store(self.npc, "wounded_time", nil)
  end

, т.к. если вышеприведенный кусок заменить на
Код
  local begin_wounded = xr_logic.pstor_retrieve(self.npc, "begin_wounded")
   local current_time = time_global()
   if begin_wounded ~= nil and current_time - begin_wounded <= 60000 then
    xr_sound.set_sound_play(self.npc:id(), "help_thanks")
   end
    
   xr_logic.pstor_store(self.npc, "begin_wounded", nil)

, то игра загружается. Есть тут что?



Стол заказов | Правки движка | O.G.S.E. 0.6.9.3
 
ted80Дата: Сб, 09.03.2013, 10:05 | Сообщение # 153
Гражданский
Пользователи
Сообщений: 15
Награды: 0
Репутация: [ 0 ]

После вылета игры на раб.стол-открой блокнот и нажми Ctrl+V, или ПКМ->Вставить
Там будет конкретный лог с ошибкой - имя_скрипта+строка_с_ошибкой, тут и узнаеш где искать ))


 
Earth2SpaceДата: Сб, 09.03.2013, 10:34 | Сообщение # 154
Механик-водитель 6-го моторизованного квада
Долг
Сообщений: 344
Награды: 5
Репутация: [ 103 ]

Разобрался путем научного тыка: после xr_logic.pstor_store(self.npc, "wounded_time", nil) стоял end лишний.


Стол заказов | Правки движка | O.G.S.E. 0.6.9.3
 
Earth2SpaceДата: Сб, 09.03.2013, 13:26 | Сообщение # 155
Механик-водитель 6-го моторизованного квада
Долг
Сообщений: 344
Награды: 5
Репутация: [ 103 ]

Как заставить всех NPC говорить с ГГ? В ...\gamedata\scripts\gulag_general.script менял
Код
""use= {=is_wounded} false, {!is_squad_commander} false, {=actor_enemy} false, {=has_enemy} false, {=actor_has_weapon} false, {=dist_to_actor_le(3)} true, false\n"..
"snd_on_use = {=is_wounded} nil, {=actor_enemy} nil, {!is_squad_commander} meet_use_no_talk_leader, {=actor_has_weapon} meet_use_no_weapon, {=has_enemy} meet_use_no_fight, {=dist_to_actor_le(3)} meet_use_no_default, nil\n"..

на
Код
"use = {=is_wounded} false, {=actor_enemy} false, {=has_enemy} false, {=actor_has_weapon} false, {=dist_to_actor_le(3)} true, false\n"..
"snd_on_use = {=is_wounded} nil, {=actor_enemy} nil, {=actor_has_weapon} meet_use_no_weapon, {=has_enemy} meet_use_no_fight, {=dist_to_actor_le(3)} meet_use_no_default, nil\n"..
результата ноль.

По идее это заставит говорить НПС, но только тех которые на смарте и получили работу не эксклюзивную. denis2000



Стол заказов | Правки движка | O.G.S.E. 0.6.9.3
 
FantomICWДата: Сб, 09.03.2013, 15:32 | Сообщение # 156
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

Добрый день!
Интересуюсь достижением "Отмеченный Зоной" (marked_by_zone). Вернее, эффектом, который оно дает. Скажите, какая функция разрешает выживать ГГ во время выброса при наличие этого ачивмента?





Сообщение отредактировал FantomICW - Сб, 09.03.2013, 16:30
 
denis2000Дата: Вс, 10.03.2013, 01:02 | Сообщение # 157
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

FantomICW, Эффект выживания зависит от кондлиста survive в файле surge_manager.ltx секция [settings], сама функция CSurgeManager:update() в скрипте surge_manager.script конкреные строки:
Код
if(xr_logic.pick_section_from_condlist(get_story_object("actor"), nil, self.survive)=="true") then
      if(db.actor.health<=h.power) then
                h.power = db.actor.health - 0.05
       if(h.power<0) then
        h.power = 0
       end
      end
     end


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
FantomICWДата: Вс, 10.03.2013, 01:23 | Сообщение # 158
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

denis2000, а возможно ли через коллбек сделать так, чтобы при определенном одетом бронике выброс был не страшен?

Зачем через колбек? И колбэк чего? Эта задача решается в surge_manager.script. denis2000



 
stalker343Дата: Вт, 12.03.2013, 10:46 | Сообщение # 159
Гражданский
Пользователи
Сообщений: 7
Награды: 0
Репутация: [ 0 ]

Подскажите пожалуйста, как можно сделать рандомное воспроизведение звуковых файлов в скрипте (например как в НС, предупреждение при начале выброса). Извините, если это уже спрашивали.

Сообщение отредактировал stalker343 - Вт, 12.03.2013, 10:48
 
ted80Дата: Вт, 12.03.2013, 16:05 | Сообщение # 160
Гражданский
Пользователи
Сообщений: 15
Награды: 0
Репутация: [ 0 ]

Цитата (stalker343)
Подскажите пожалуйста, как можно сделать рандомное воспроизведение звуковых файлов в скрипте


Не проверял, но должно работать
прим. zvuk_1, zvuk_2, zvuk_3 путь до звука относительно папки sounds - без разширения файла
самая простая функция попробуй так :

Код
function new_sound()
local sound_1 = [[zvuk_1]]
local sound_2 = [[zvuk_2]]
local sound_3 = [[zvuk_3]]
local music = { sound_1,sound_2,sound_3 }
local rand_music = music[math.random(#music)]
local snd_obj
snd_obj = xr_sound.get_safe_sound_object(rand_music)
snd_obj:play_no_feedback(db.actor, sound_object.s2d, 1, vector(), 1.0)
end


как применить- где и когда - думай сам biggrin




Сообщение отредактировал ted80 - Вт, 12.03.2013, 16:18
 
avalonДата: Пн, 18.03.2013, 20:39 | Сообщение # 161
Гражданский
Пользователи
Сообщений: 7
Награды: 0
Репутация: [ 0 ]

Всем привет! Слезно прошу Вас всех, потому что уже устал от этого – как полностью отключить Dinamic News COP 1.02 в оружейной сборке от Енота? Дело в том, что я в конфигах и скриптах почти ни когда не ковырялся, поэтому если откликнитесь, напешите подробные пути к файлам и какие значение нужно менять. И еще одна огромная просьба – как увеличить порог износа оружия (не порог починки) в сборке от Енота, что бы стволы запредельно быстро не изнашивались, хотя бы на 20-25%.
За помощь каждого отблагодарю в ЛС!
 
FantomICWДата: Пн, 18.03.2013, 21:09 | Сообщение # 162
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

avalon, насколько я знаю, надо удалить или закоментировать строки динамических новостей в скриптах - папке scripts (закокоментировать символом --)
1) в _g.script строки из функции function start_game_callback()
Код
--VSm
--VScallback.init()
--VSm

2) в bind_monster.script
Цитата
--VSm
--VScallback.OnMutantSpawn(self.object)
--VSm

и
Код
--VSm
--VScallback.OnMutantDeth(victim, who)
--VSm

И таким-же образом надо сделать со всеми функциями, которые относятся к дин. новостям.
Кроме этих файлов затронуты bind_stalker.script, surge_manager.script, xr_motivator.script. В этих файлах ищи (Ctrl+F) по тэгу VS. Он приведет тебя к функциям мода. Повторюсь, строки в скриптах можно либо коментировать, либо просто удалять.





Сообщение отредактировал FantomICW - Пн, 18.03.2013, 21:10
 
lychagin0Дата: Вт, 02.04.2013, 12:37 | Сообщение # 163
Легенда Зоны
Вольные сталкеры
Сообщений: 1303
Награды: 9
Репутация: [ 278 ]

Добрый день. Подскажите:
-- получение всех боеспособных членов данного гулага
Код
function get_gulag_members(gname)
     local gulag_members = {}
     local gulag = xr_gulag.get_gulag_by_name(gname)
        if gulag == nil then
      gulag_members[1] = nil
      return gulag_members
     end
     for k,v in pairs(gulag.Object) do
      if (v == true or ( v:alive() and    --     
         not(xr_wounded.is_heavy_wounded_by_id(k) or
             xr_wounded.is_psy_wounded_by_id(k)))) and
       gulag.Object_begin_job[k] == true
      then
       if type(v) ~= "boolean" then
        table.insert(gulag_members,v:id())
       end
      end
     end
     return gulag_members
end


Получаю вылет:

[cut noguest=Лог]Expression : !m_error_code
Function : raii_guard::~raii_guard
File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
Line : 748
Description : ...r. - Зов Припяти\gamedata\scripts\heli_target.script:253: bad argument #1 to 'pairs' (table expected, got nil)
[/cut]

Не пойму, что не так.
Заранее спасибо.




Сообщение отредактировал lychagin0 - Вт, 02.04.2013, 12:41
 
mizabrikДата: Вт, 02.04.2013, 15:39 | Сообщение # 164
Почетный инженер «Свободы»
Свобода
Сообщений: 360
Награды: 10
Репутация: [ 216 ]

lychagin0, gulag.Object не определен. С гулагами в скриптах не знаком, но, видимо он пуст. Советую поправить проверку:
Код
if gulag == nil or gulag.Object == nil then  
     gulag_members[1] = nil  
     return gulag_members
end




Сообщение отредактировал VlAleVas - Вт, 02.04.2013, 15:49
 
lychagin0Дата: Вт, 02.04.2013, 17:53 | Сообщение # 165
Легенда Зоны
Вольные сталкеры
Сообщений: 1303
Награды: 9
Репутация: [ 278 ]

VlAleVas, Это я понимаю. По идее, надо бы чтобы в таблице gulag_members каждый член был в свою очередь таблицей, и вот в эту подтаблицу и заносить нужные id. Похоже, я накосячил в объявлении таблицы, но как это сделать правильно - даже вариантов нет.



 
Поиск: