Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: 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Дата: Вт, 29.11.2011, 18:49 | Сообщение # 31
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Expl0id, В скрипте xr_conditions.script есть функция is_day. Возвращает истину если время от 6 до 21 часа. Аналогично в скрипте utils.script тоже есть функция is_day Она возвращает истину если время то 5 до 22.

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

Quote (Expl0id)
Вообщето разные секции погоды для разного времени суток

Я так сначала и подумал, поискал там ночные... В итоге я вывел в сообщении название секции: час ночи, секция af3_slight_foggy. slight - это дневная секция. В общем там надо прописать так, чтобы перед тем как искать название секции он проверил ночной интервал, если ночь, то выводит соответствующее сообщения, если нет то пошел дальше. Как это сделать именно в news.script?
 
denis2000Дата: Вт, 29.11.2011, 20:55 | Сообщение # 33
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Expl0id, Проверять можно так:
Code
if utils.is_day then <Дневные сообщения> else <Ночные сообщения>


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

Подскажите как сделать что-бы при использовании аптечек, антирад. и т. д. убирался худ рук?

Сделать колбек на использование этих предметов (посмотри как реализовано в SGM) и в обработчике убрать руки коммандой db.actor:hide_weapon() и запустить таймер до возврата, в обработчике таймера вернуть коммандой db.actor:restore_weapon(). denis2000

denis2000 не подскажешь в каких файлах это всё находится?

В тех в которых ты эти скрипты сам разместишь, пример на SGM посмотри или в Сборник модостроения ЗП v10.10.11 (автор: XOBAH) Раздел скрипты пункт 43. denis2000

А как таймер ставится?


Сообщение отредактировал stalex - Вт, 17.01.2012, 19:35
 
12Legion21Дата: Вт, 29.11.2011, 20:55 | Сообщение # 35
Гражданский
Пользователи
Сообщений: 2
Награды: 0
Репутация: [ 0 ]

У меня вопрос: как можно изменить количество устанавливаемого динамита на один детонатор, в каких конфигах что нужно менять, подскажите пожалуйста SGM 2.0

Сообщение отредактировал 12Legion21 - Пн, 16.01.2012, 17:51
 
denis2000Дата: Пн, 16.01.2012, 21:06 | Сообщение # 36
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

12Legion21, Сам не пробовал, дерзай:
[cut]В файле sgm_callbacks.script после
Code
detonate_remote_charge(sgm_functions.read_variable("remote_charge_3_id"),3)

добавь дотонации до нужного количества
Code
detonate_remote_charge(sgm_functions.read_variable("remote_charge_4_id"),4)
detonate_remote_charge(sgm_functions.read_variable("remote_charge_5_id"),5)

В файле _g.script измени условия в функциях get_remote_charge_installed() и get_remote_charge_full_installed()
Например вот так:
Code
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 or sgm_functions.read_variable("remote_charge_4_id")~=0 or sgm_functions.read_variable("remote_charge_5_id")~=0

Code
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 and sgm_functions.read_variable("remote_charge_4_id")~=0 and sgm_functions.read_variable("remote_charge_5_id")~=0

В файле sgm_variables.script добавь после
Code
sgm_functions.set_safe_variable("remote_charge_3_id")
      sgm_functions.set_safe_variable("remote_charge_3_timer")
строки
Code
sgm_functions.set_safe_variable("remote_charge_4_id")
      sgm_functions.set_safe_variable("remote_charge_4_timer")
sgm_functions.set_safe_variable("remote_charge_5_id")
      sgm_functions.set_safe_variable("remote_charge_5_timer")

В файле sgm_modules.script после
Code
elseif sgm_functions.read_variable("remote_charge_3_id")==0 then
           sgm_functions.write_variable("remote_charge_3_id",id)
           if ui_mod_elements.cfg_remote_charge_delay~=0 then
              sgm_functions.write_variable("remote_charge_3_timer",ui_mod_elements.cfg_remote_charge_delay)
           end
добавь строки
Code
elseif sgm_functions.read_variable("remote_charge_4_id")==0 then
           sgm_functions.write_variable("remote_charge_4_id",id)
           if ui_mod_elements.cfg_remote_charge_delay~=0 then
              sgm_functions.write_variable("remote_charge_4_timer",ui_mod_elements.cfg_remote_charge_delay)
           end
elseif sgm_functions.read_variable("remote_charge_5_id")==0 then
           sgm_functions.write_variable("remote_charge_5_id",id)
           if ui_mod_elements.cfg_remote_charge_delay~=0 then
              sgm_functions.write_variable("remote_charge_5_timer",ui_mod_elements.cfg_remote_charge_delay)
           end

Что-то вроде этого. Еще раз говорю инструкцию не опробовал - дерзай сам.
[/cut]


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

Подскажите сайт в котором можно изучить язык lua!

Добавлено (17.01.2012, 09:37)
---------------------------------------------
Я обнаружил у себя хорошие способности в turbo paskal(турбо паскаль)! Вопрос: похожи ли турбо паскаль и lua?

Сайт. Не, не похожи, разве что только самые что ни на есть базовые понятия алгоритмов и т.д.... XOBAH

Знания языков высокого уровня (Pascal, Cи) приветствуется, особенно объектно ориентированные. denis2000


Моддинг это Жизнь!
Нужен человек разбирающийся в скриптах и в создании моделей в команду мода lost soul для ЗП!
Пишите в личку!
 
AnarxisTДата: Вт, 17.01.2012, 14:30 | Сообщение # 38
Тень «Свободы»
Свобода
Сообщений: 7317
Награды: 34
Репутация: [ 1324 ]

Приветствую!
Хочу вот добавить оружия, а до конца не так и не разобрался из Урока какие именно скрипты нужно затрагивать при этом. Не подскажите? Заранее благодарен.

Никакие. Перенос оружия не связан со скриптами. denis2000


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

stalex, Например простенкий таймер:
[cut]
В файле bind_stalker.script в функции actor_binder:use_inventory_item прописать вызов колбека:
Code
---Вызов колбеков использования предметов инвентаря
    if obj~=nil then
          mod_use_callback.use_inventory_item(obj,self)
    end

в функции actor_binder:update прописать вызов функции обработки таймера:
Code
--Отработка таймеров использования предметов
   mod_use_callback.timer_use_item(self)

В созданном скрипте mod_use_callback.script сделать функции:
Code
function use_inventory_item(section,self)
   local item_name=section:section()
   if item_name == "bread" and db.actor:has_info("actor_use_item") == false then
    start_time_use_item = game.get_game_time()
    db.actor:hide_weapon()
    db.actor:give_info_portion("actor_use_item")
   end
end

function timer_use_item(self)
   local time_to_use = 60 --Игровые секунды, время использования предмета
   if db.actor:has_info("actor_use_item") then   
    if  (start_time_use_item == nil or game.get_game_time():diffSec(start_time_use_item) >= time_to_use) then
     db.actor:restore_weapon()
     db.actor:disable_info_portion("actor_use_item")
    end
   end
end

[/cut]


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

denis2000 а как эти функции сделать для нескольких предметов?

С первой я разобрался
Code
function use_inventory_item(section,self)   
     local item_name=section:section()   
     if item_name == "medkit" and db.actor:has_info("actor_use_item") == false then   
      start_time_use_item = game.get_game_time()   
      db.actor:hide_weapon()   
      db.actor:give_info_portion("actor_use_item")   
elseif item_name == "bandage" and db.actor:has_info("actor_use_item") == false then   
      start_time_use_item = game.get_game_time()   
      db.actor:hide_weapon()   
      db.actor:give_info_portion("actor_use_item")
     end   
   end
[/cut]
А с таймером не могу разобраться. Время на все предметы одинаковое.


Сообщение отредактировал stalex - Ср, 18.01.2012, 14:00
 
denis2000Дата: Ср, 18.01.2012, 14:31 | Сообщение # 41
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

stalex,
Code
function use_inventory_item(section,self)    
      local item_name=section:section()    
      if item_name == "bread" and db.actor:has_info("actor_use_item") == false then    
       start_time_use_item = game.get_game_time()    
       db.actor:hide_weapon()    
       db.actor:give_info_portion("actor_use_item")
       db.actor:give_info_portion("actor_use_bread")
      elseif item_name == "bandage" and db.actor:has_info("actor_use_item") == false then    
       start_time_use_item = game.get_game_time()    
       db.actor:hide_weapon()    
       db.actor:give_info_portion("actor_use_item")
       db.actor:give_info_portion("actor_use_bandage")
      end
     end    

    function timer_use_item(self)    
      local time_to_use_bread = 60 --Игровые секунды, время использования предмета хлеб
      local time_to_use_bandage = 60 --Игровые секунды, время использования предмета бинт
      if db.actor:has_info("actor_use_item") then      
       if  db.actor:has_info("actor_use_bread") and (start_time_use_item == nil or game.get_game_time():diffSec(start_time_use_item) >= time_to_use_bread) then    
        db.actor:restore_weapon()    
        db.actor:disable_info_portion("actor_use_item")
        db.actor:disable_info_portion("actor_use_bread")     
       end
       if  db.actor:has_info("actor_use_bandage") and (start_time_use_item == nil or game.get_game_time():diffSec(start_time_use_item) >= time_to_use_bandage) then    
        db.actor:restore_weapon()    
        db.actor:disable_info_portion("actor_use_item")
        db.actor:disable_info_portion("actor_use_bandage")     
       end     
      end    
    end


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

Скажите, возможно ли сделать ограничение рюкзака не только по весу, но и по количеству? Например, ограничение на аптечки, не по 40 штук таскать, а например по 10.

Обрабатывать событие "получение предмета ГГ" (колбек actor_binder:on_item_take). Проверять, что количество предметов, одинакового типа с только что полученным, не вышло за границы, а если вышло лишние предметы удалять из инвентаря и спавнить аналоги под ноги ГГ. denis2000

Функцию спавна возле ГГ не подскажите? Никак не могу сообразить blink


Сообщение отредактировал stalex - Пт, 27.01.2012, 04:57
 
denis2000Дата: Пт, 27.01.2012, 16:40 | Сообщение # 43
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

stalex,
Code
local p=vector(),lv,gv
   p.x=db.actor:position().x+0,1
   p.y=db.actor:position().y
   p.z=db.actor:position().z
   lv=db.actor:level_vertex_id()
   gv=db.actor:game_vertex_id()
   alife():create(<переменная-имя секции предмета>,p,lv,gv)


или еще лучше:
Code
db.actor:drop_item(<Объкт-предмет>)


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

Как поставить метку на карте на предмет? Скриптовым путём.
Вот функция ставить метку, не могу в ней разобраться. Помогите! И вообще та ли эта функция?

Code
function set_spot_choose(obj_id,location_name,type,descr)
    if type=="hide" and obj_id~=nil then
       remove_spot_on_map(obj_id,location_name)
    elseif type=="show" and obj_id~=nil then
       add_spot_on_map(obj_id,location_name,descr)
    end
end
 
denis2000Дата: Вт, 31.01.2012, 15:46 | Сообщение # 45
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

stalex, Можешь использовать:
1) set_spot_choose(obj_id,location_name,type,descr)
2) add_spot_on_map(obj_id,location_name,descr)
3) xr_effects.add_map_spot(actor, npc, p), где p[1]=obj_id p[2]=location_name p[3]=descr
4) level.map_add_object_spot_ser(obj_id,location_name,descr)
Разница в том, что четвертая - движковая функция, а первые три скриптовые которые так или иначе в итоге вызывают последнюю.
Параметры функций:
obj_id - (целое положительное число) уникальный идентификатор объекта на уровне
location_name - (строка) имя графического образа метки (тег из файла map_spots.xml или map_spots_16.xml)
descr - (строка) описание
type - (строка) тип действия, принимает значения "show" - показать метку, "hide" - убрать метку


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