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


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


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

XOBAH, нет

Добавлено (14.10.2011, 16:50)
---------------------------------------------
надо в определенном действие

 
SpiritWolfДата: Ср, 26.10.2011, 14:11 | Сообщение # 17
Отмычка
Пользователи
Сообщений: 30
Награды: 0
Репутация: [ 52 ]

Как сделать вывод динамических сообщений на экран?
PS: В ЗП




Сообщение отредактировал SpiritWolf - Ср, 26.10.2011, 16:01
 
denis2000Дата: Ср, 26.10.2011, 16:23 | Сообщение # 18
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

SpiritWolf, Простенький скрипт:
[cut]В файл xr_motivator.script в функцию motivator_binder:death_callback после строк:
Code
function motivator_binder:death_callback(victim, who)
добавить строки:
Code

--Передача СМС о смерти сталкеров
               
monster_classes = {
        [clsid.bloodsucker_s]    = "Кровосос",
        [clsid.boar_s]      = "Кабан",
        [clsid.dog_s]      = "Собака",
        [clsid.flesh_s]     = "Плоть",
        [clsid.pseudodog_s]    = "Псевдособака",
        [clsid.poltergeist_s]    = "Полтергейтс",
        [clsid.gigant_s]     = "ПсевдоГигант",
        [clsid.zombie_s]     = "Зомби",
        [clsid.snork_s]     = "Снорк",
        [clsid.psy_dog_s]     = "Пси собака",
        [clsid.psy_dog_phantom_s]   = "Призрак псевдособаки",
        [clsid.controller_s]    = "Контролёр",
        [clsid.tushkano_s]     = "Тушканчик",
}
               
               
               
               
         local m_game_vertex = who:game_vertex_id()
         local lvert = game_graph():vertex(m_game_vertex)
         local lid = lvert:level_id()
         local mlevel = alife():level_name(lid)
                       local m_s_level = mlevel
               
        local victim_name  = victim:character_name()
               
        local killer_name  = who:character_name()
               
local victim_comm = victim:character_community()
               
local killer_comm = who:character_community()
               
local post_message_prob = 0.8
               
if killer_comm=="monster" then
                local m_clsid = get_clsid(who)
          killer_name = monster_classes[m_clsid]
end
if killer_name==victim_name then
killer_name="Выброс"
killer_comm="Зона"
end
               
if killer_comm~=nil then
               local m_text_kill_string=killer_name.." ("..game.translate_string(killer_comm).."), Лищил жизни "..victim_name.."("..game.translate_string(victim_comm).."). Територия: "..game.translate_string(m_s_level)
        local news_text = "%c[255,160,160,160]".."Новости:".."\\n".."%c[default]"..m_text_kill_string
        local news_caption = game.translate_string("st_tip")
               local texture = "ui_iconsTotal_weapons"
               
               db.actor:give_game_news(news_caption, news_text, texture, 0, 15*1000)
         play_snd_at_actor([[device\pda\pda_news]])
end

Также в этот же файл или в скрипт _g.script нужно добавить функцию
Code
function play_snd_at_actor(sound,count1,count2)
         local snd_souce
         if count1==nil or count2==nil then
            snd_souce=sound_object(sound)
            snd_souce:play(db.actor,0,sound_object.s2d)
         elseif count1~=nil and count2~=nil then
            local rnd_snd=math.random(count1,count2)
            snd_souce=sound_object(sound..rnd_snd)
            snd_souce:play(db.actor,0,sound_object.s2d)
         end
end
[/cut]
Инструкцию обновил. Файл для примера.


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

Expression : !m_error_code
Function : raii_guard::~raii_guard
File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
Line : 748
Description : ....l.k.e.r. - cop\gamedata\scripts\bind_stalker.script:2: attempt to call field 'AddToMotivator' (a nil value)

Что-то сделал не так. У меня по инструкции все работает. denis2000


 
tema796Дата: Пн, 31.10.2011, 16:46 | Сообщение # 20
Гражданский
Пользователи
Сообщений: 20
Награды: 0
Репутация: [ -20 ]

привет ребят у меня вопрос как восстановить старые анимации? сами анимации есть а что в скриптах писать?это надо для зов припяти


1. Для начала научиться читать правила! Устное предупреждение П.4.1
2. Для начала посмотреть на Инсайде
XOBAH


Добавлено (31.10.2011, 16:33)
---------------------------------------------
забыл дописать анимации нпс

А ссылочку смотрели? Там как раз анимация НПС!!! XOBAH

Добавлено (31.10.2011, 16:46)
---------------------------------------------
там для тч

Они не сильно отличаются. Даже так: У них почти нет различий.
А переписывать весь урок ради Вас, чтобы исправить несколько отличий, которые легко самому определить, вряд ли кто будет, может быть позже. XOBAH


Сообщение отредактировал tema796 - Пн, 31.10.2011, 16:33
 
АазДата: Ср, 02.11.2011, 21:21 | Сообщение # 21
Хозяин Зоны
Зомби
Награды: 30
Репутация: [ 0 ]

Вопрос такой: возможно ли выполнить через скрипт удаления оружия, которое выпадает из рук НПС при смерти, если погибший находился в момент гибели в онлайне? Просто я решил выдать товарищам на локациях оружие немного более мощное, чем обычно. Так вот, чтобы ГГ не ходил уже на Кордоне со СПАСом, нужно, чтобы оружие при смерти НПС с вероятностью в 90-95% убиралось. Иначе неминуемо наступит нарушение баланса.

Это наверняка приведет к вылетам. Поэтому лучше увеличить износ выпавшего оружия и ввсти ограничение на уровень износа при котором можно ствол отремонтировать. denis2000


 
XecatorДата: Вс, 27.11.2011, 18:58 | Сообщение # 22
Отмычка
Пользователи
Сообщений: 31
Награды: 0
Репутация: [ 14 ]

Поставил Geonezis Addon, там встроенные динамические новости. Адаптировал AtmosFear 3, и теперь во время игры постоянно выскакивают сообщения: "неучтенная секция погоды". Как вообще убрать сообщения о погоде, в каком файле и какие строки?
 
denis2000Дата: Вс, 27.11.2011, 22:01 | Сообщение # 23
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Expl0id, Добавь неучтенную секцию погоды в скрипт динамических новостей по аналогии.

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

Да я вроде добавил, изменил названия секций погоды старые на атмосферовские, но при игре все равно вылазит "неучтенка". Наверное я не оттуда брал названия секций atmosfear. В каком точно они файле лежат?
 
denis2000Дата: Пн, 28.11.2011, 00:51 | Сообщение # 25
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Expl0id, Смотри какая именно секция не учтена и добавляй ее.

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

Да я говорю же, не знаю из какого файла эти секции брать, там их полно, в одном потенциальных секций 6, а в другом штук 20. Как файл называется, dynamic_weather_graphs.ltx или suns.ltx? Или вообще другое?
 
denis2000Дата: Пн, 28.11.2011, 15:44 | Сообщение # 27
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Expl0id, Вот поэтому я тебе и говорю выведи в сообщении имя неучтенной секции!
[cut]В файле news.script в функции weather_news(), вместо
Code
local news_text = "неучтенная секция погоды"
сделай
Code
local news_text = "неучтенная секция погоды="..weather_section
[/cut]
Читай сообщения в них будет имя неучтенных секций.


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

Спасибо за совет, все получилось. Указал мне секцию af3_slight_clear_0. Нашел ее папку, а там... Там всего 110 секций! Там идет так: ясная_0, ясная_1, ясная_2, также и с туманными и т.д.. Всего 110 секций. Я понимаю что надо для всех ясных в news.script прописать одни и те же сообщения, только как это будет в скрипте:
Code
if weather_section == "af3_slight_clear_0" or "af3_slight_clear_1" or "af3_slight_clear_2" or ... then

или как?
 
XOBAHДата: Пн, 28.11.2011, 18:24 | Сообщение # 29
Техник Вольных
Вольные сталкеры
Сообщений: 912
Награды: 21
Репутация: [ 991 ]

Expl0id, В SGM 2.0 (да и в SGM 1.7, но с разницей) есть глобальная функция find_in_string(where,what), которая ищет необходимый текст в строке, использовать так (с представленными Вами секциями):
if find_in_string(weather_section, "af3_slight_clear_" then -- Удовлетворит все Ваши секции smile


 
XecatorДата: Вт, 29.11.2011, 18:17 | Сообщение # 30
Отмычка
Пользователи
Сообщений: 31
Награды: 0
Репутация: [ 14 ]

Ничего себе, какая крутая функция... Да с ней получилось все 110 секций в 6 запихнуть! Спасибо за совет!

Добавлено (29.11.2011, 18:17)
---------------------------------------------
Да, и вот еще. Все секции запихнул в news.script, все работает, только есть один момент... В общем, на секцию погоды есть такие сообщения: "Солнышко", "солнечно" и типа того. Ночью, в 1 час на погодную секцию ...clear... приходит сообщение - "Солнышко...". Так вот, как в скрипт новостей в разделе погоды прописать, чтобы он проверял ночной интервал(по времени), и если это ночь выводил сообщения типа "Ночь","Темно"?

Вообщето разные секции погоды для разного времени суток. Ты рано радовался что все в одну проверку запихнул. Теперь придется обратно дробить условие. denis2000
 
Поиск: