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


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


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

denis2000, Да но ковырятся в СГМ не имею возможности и посмотреть скрипт. Да и там автор хозяин.
Могли бы вы его скинуть ? Или написать что то подобное. Сам я не скриптер как уже говорил ранее.
Насчет большого количества. Врятли. Я полностью убрал схемы апгрейдов. И продумал новую. Апгрейдов на каждый ствол будет ну максимум 3 штуки. Плюс на возможность поставить прицел или глушитель.
 
denis2000Дата: Вт, 02.10.2012, 20:05 | Сообщение # 107
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Азазель, Привести все функции не представляется возможным, смотрите сами, да и автор там хозяин.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
Den5688Дата: Ср, 03.10.2012, 15:22 | Сообщение # 108
Удаленные



такая проблема - у меня стоит SGM 2.2 + сборка Albor + все фиксы.
у меня в игре есть любимый автомат но получаю я его где-то в середине игры а подствольник к нему я вообще не нашел.
поставил повелителя зоны + чит-мод от сюда - http://sigerous.ru/forum/15-221-740554-16-1336236511
но автомата и подствольника там нет и добавлять сам пытался ( в списке объектов их тоже нет)
можно ли как-то их добавить?

В каких либо 3D редакторах работаете? denis2000
 
Red-BullДата: Вс, 07.10.2012, 12:04 | Сообщение # 109
Командир агит отряда, Дипломат Вольных
Пользователи
Сообщений: 779
Награды: 4
Репутация: [ 60 ]

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

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

Red-Bull, Попробуй в файле xr_surge_hide.script в функции surge_can_be_started(level) закоментировать строки
кроме return nil. Вот так:
[cut]
Code
function surge_can_be_started(level)
   --[[if levels_surge_table[level] ~= nil then
    local condlist = xr_logic.parse_condlist(nil, "xr_surge_hide", "condlist", levels_surge_table[level].condlist)
    if db.actor then
     local cond = xr_logic.pick_section_from_condlist(db.actor, db.actor, condlist)
     if cond == "true" and not surge_activated then
      local surge = math.random(100)
      if surge <= cur_prop then
       cur_prop = base_prop
       return math.random(levels_surge_table[level].surge_time-10, levels_surge_table[level].surge_time+10)
      else
       cur_prop = cur_prop + add_prop
      end
     end
    end
   end]]
   return nil
end
[/cut]
Другой вариант в том же файле в таблице levels_surge_table закоментировать элементы, так как это сделано для элемента marsh - ведь на Болотах выброса нет, кроме сюжетных естественно. Вот так:
[cut]
Code
levels_surge_table = {
--                     marsh       = {condlist="{+mar_story_go_to_escape_done} true", surge_time=30},
--      escape      = {condlist="{+esc_bring_habar_complete} true", surge_time=40},
--      garbage     = {condlist="{+gar_story_got_info_from_digger -val_deliver_pda_done} true, {+agr_garbage_end} true", surge_time=45},
--      darkvalley  = {condlist="{+val_deliver_pda_done} true", surge_time=45},
--      agroprom    = {condlist="{+agru_go_out_end_task_complete} true", surge_time=30},
--      red_forest  = {condlist="{+red_strelok_task_end -red_bridge_scene_begin} true, {+red_bridge_finished} true, {+red_bridge_actor_fail} true", surge_time=30},
--      military    = {condlist="{+mil_actor_go_to_limansk} true", surge_time=30},
                    }
[/cut]


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
Red-BullДата: Вс, 07.10.2012, 12:37 | Сообщение # 111
Командир агит отряда, Дипломат Вольных
Пользователи
Сообщений: 779
Награды: 4
Репутация: [ 60 ]

denis2000, большое спасибо. Оба твоих варианта убирают выбросы навсегда и со всех локаций?

Да. denis2000


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

Всем Добрый День!
Возник вопрос, можно ли использовать функцию release_objects_by_section в SGM 2.2 для удаления сквадов?

Однозначно - нет! Для этого есть функция в xr_effects.script -> remove_squad(actor, obj, p)
denis2000
 
ted80Дата: Вт, 09.10.2012, 23:08 | Сообщение # 113
Гражданский
Пользователи
Сообщений: 15
Награды: 0
Репутация: [ 0 ]

Здравствуйте ! написал такой скриптик - спам - на выдачу сообщений о смерти семецкого )))

[cut noguest]--------------------------------------------------------------------------------------

-- Где умер Семецкий
local gde = {
"Кордон",
"Свалка",
"НИИ Агропром",
"Подземелье НИИ Агропром",
"Тёмная долина",
"Лаборатория X-18",
"Бар",
"Дикая территория",
"Арм.склады",
"Янтарь",
"Лаборатория X-16",
"Лаборатория X-10",
"Радар",
"Припять",
"ЧАЭС",
"Саркофаг"
}

-- как он умер
local kak = {
"Огнестрел",
"Ножевое ранение",
"Отравился консервами",
"Умер от кровопотери",
"Стая тушканов",
"Умер от голода",
"Умер от холода",
"Интоксикация алкоголем",
"Пси-излучение",
"Контроллер",
"Жарка",
"Кровосос",
"Псевдопес",
"Слепой пес",
"Бюрер",
"Излом",
"Трамплин",
"Карусель",
"Кисель",
"Воронка",
"Электра",
"Псевдогигант",
"Кабан",
"Полтергейст",
"СУИЦИД"
}

local ant_spam ={
"Погиб сталкер !!! \\nИмя: Юрий Семецкий \\nГруппировка: Легенда ЗОНЫ \\nЛокация: "..gde[math.random(#gde)].." \\nПричина: "..kak[math.random(#kak)]..""
}

time_news = 0

function time_update_spam()
local time = time_global()
if time_news < time then
time_news = time + 20000
spam.update_spam()
end
end

function update_spam()
news_manager.send_tip(db.actor, (ant_spam[math.random(#ant_spam)]), nil, nil, 15000)
end[/cut]

[cut noguest=Cкриншот][/cut]

------------------------------------------------------------------------------------------------------
сообшения должны быть рандомными
но меняются они только про старте игры
потом это сообшение зацикливается до бесконечности (((
в чем проблем ?




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

ted80, Проблема в том, что таблица ant_spam, состоит всего из одного элемента, который динамически формируется при инициализации скрипта, отсюда бесконечное количество одинаковых сообщений, а чтобы получить новое нужна новая игра (или загрузка сейва).

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

В одном из топиков возник вот такой вопрос (но кажется там это оффтоп):

Quote (harly9)
Но есть одно большое НО. Если автор приближает игру к реальности, то нужно это делать во всем. Оружие не может быть с одинаковой убойностью, это НЕ РЕАЛЬНО.

Это главная проблема этой (и не только) игры smile На самом деле человека можно надежно убить и из ПМ-а и из 12,7мм "Корда"...тут дело в другом....и я не знаю реализуемо ли это вообще blink
Предположим, что мы делим все патроны и оружие под них на 4 группы:
1. ДО 500Дж (пистолеты и ПП)
2. От 500Дж до 1500Дж (9х39; 5,45;5,56)
3. От 1500Дж до 2500Дж (все 7,62 и дробовики)
4. Overkill свыше 2500 Дж (.308LP; 12,7; 14,5...)
ПРИ ПРОБИТИИ БРОНЕЖИЛЕТА!!! назначаем каждому типу РАНДОМНЫЙ HIT
1. От 0,1 до 1,0
2. От 0,5 до 1,0
3. От 0,8 до 1,0
4. 1,0
Естетсвенно, при попадании в голову и пробитии шлЁма Hit всегда = 1,0 В идеале - величина изменяется с дистанцией....
Смысл надеюсь ясен, да?

Кажется -мне, по крайней мере -что это очень сложно в реализации...но тем не менее: как то я поправил степень изношенности брони снимаемой с трупов, что бы результат был интересней (от 0,1 до 0,99 рандомно, как я понимаю) И ОШИБСЯ: назначил меньшую величину больше большей... И начались вылеты при каждой перестрелке в пределах а_лайфа Т.е. программа каждый раз, при смерти любого НПС вычисляла какую броню может с трупа снять ГГ А ведь это и есть практически то, что надо...нет?

Добавлено (21.11.2012, 12:36)
---------------------------------------------
Можно ли поставить значение hit_power = math.random(0.5,1.0)? Или через переменную? Или как? Или получится, что hit_power будет определятся случайно в начале игры? wacko


Сообщение отредактировал Wyvern - Ср, 21.11.2012, 12:50
 
denis2000Дата: Чт, 22.11.2012, 00:27 | Сообщение # 116
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Wyvern,
Создатель игрового движка ограничен многими факторами: временем, бюджетом, технологиями, железом потребителей и т.п.
Модостроитель же ограничен возможностями движка.
В файлах *.ltx находятся константы обрабатываемые движком или скриптами. А константа в переводе с латыни - неизменное.


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

Quote (denis2000)
В файлах *.ltx находятся константы обрабатываемые движком или скриптами. А константа в переводе с латыни - неизменное.


Не поверите - я это знаю smile Просто я криво сформулировал:
Как и главное где объявить новую переменную, получаемую при помощи math.random(,), назовем ее Doom, для метода hit_callbeck для подстановки в формулу для расчета урону здоровью ....

Определите переменную в своем скрипте, в котором вы планируете делать расчет урона здоровью. denis2000

Ага, спасибо.
Еще вопрос: а стандартно этот скрипт существует? Если да - то где он?

Готового нет. denis2000
 
ConstantineAOДата: Пн, 03.12.2012, 02:34 | Сообщение # 118
Гражданский
Пользователи
Сообщений: 1
Награды: 0
Репутация: [ 0 ]

Здравствуйте! Меня интересует реально ли перенести из sigerous mod 2.2 CoP фишку с отображением надписи "Хедшот" в левом верхнем углу при выстреле врагам в голову на Сталкер ТЧ мод Нар. Солянка?
Совсем недавно начал изучать скриптинг, если вам не составит труда, объясните по доходчивей где находятся нужные мне функции.
Заранее благодарю.
 
denis2000Дата: Пн, 03.12.2012, 12:58 | Сообщение # 119
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

ConstantineAO, Только начали изучать и уже беретесь за довольно сложную задачу.
[cut]Смотрите как это сделано в SGM
На получение повреждения НПС выдается колбек
в скрипте xr_motivator.script
функция function motivator_binder:hit_callback(obj, amount, local_direction, who, bone_index)
из нее вызывается обработка повреждения НПС средствами SGM
sgm_callbacks.on_stalker_hit(obj,amount,local_direction,who,bone_index)
Аналогично для монстров
скрипт bind_monster.script
функция function generic_object_binder:hit_callback(obj, amount, local_direction, who, bone_index)
вызов sgm_callbacks.on_monster_hit(obj,amount,local_direction,who,bone_index)
В скрипте sgm_callbacks.script в функциях on_stalker_hit и on_monster_hit проверяется нанес ли повреждение ГГ в какую часть тела и т.п. Попутно решаються задачи ведения статистики и выдачи достижений, выдача же сообщения о хедшоте выдается вызовом функции congratulate_with_headshot_event("add",4500,1) из скрипта _g.script.
Функция congratulate_with_headshot_event выводит сообщение, проигрывает звук и запускает таймер по окончании работы которого сообщение убирается с экрана. И это самый минимум, только во верхам.
[/cut]


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

denis2000 я попробовал отредактировать в файле inventory_upgrades.script функцию function how_much_repair( item_name, item_condition )
сделал так[cut noguest]local function how_much_repair( item_name, item_condition )
local ltx = system_ini()
local cost = 0
local class = ltx:r_string(item_name, "class")
local cof = 0.8
if class == "E_STLK" then
cof = 0.5
else
cof = 0.8
end
return math.floor(cost*(1-item_condition)*cof)
end[/cut]
В игре механики стали брать 0 рублей за ремонт(но это не совсем то что я хотел), а как сделать привязку, чтобы когда гг вступает в группировку и механик данной группировки не брал денег за ремонт костюмов и оружия, а другой брал, по примеру проводников в guiders.script,
там есть такие строчки[cut noguest]if actor_in_faction() == npc:character_community() then
cost = 0[/cut]
Только сколько я не редактировал inventory_upgrades.script, получаю вылеты[cut noguest]Expression : ai().script_engine().functor( functor_str, m_desc.functr )
Function : inventory::upgrade::Property::construct
File : E:\priquel\sources\engine\xrGame\inventory_upgrade_property.cpp
Line : 47
Description : Failed to get upgrade property functor in section[prop_ammo_size], functor[inventory_upgrades.property_functor_a]

[/cut]
Надо как-то грамотно отредактировать этот скрипт, или может в другой какой скрипт надо использовать функцию function how_much_repair( item_name, item_condition )(я пробовал вставлять строкиif actor_in_faction() == npc:character_community() then
cost = 0
в inventory_upgrades.script только этот скрипт надо похоже по другому как-то редактировать ), только не понятно что и как там менять


Всё что мы есть - это результат наших мыслей

Сообщение отредактировал tromm - Пн, 31.12.2012, 03:17
 
Поиск: