Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Модостроение. Общие вопросы и ответы
denis2000Дата: Сб, 15.06.2013, 11:51 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Помощь тем кто хочет знать больше о игре и модах

Если у вас появились вопросы по модостроению в игре S.T.A.L.K.E.R. Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


Много интересного материала здесь (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)", ее и надо расскомментировать, должно получиться вот так:
Код
function abort(fmt, ...)
                     local reason = string.format(fmt, ...)
                     error_log(reason)
end

Вот для примера два одинаковых вылета, первый с функцией по умолчанию, второй - с поправленной функцией

Первый:
Код
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)

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


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


Посты, для которых есть свои категории, из этой темы будут удаляться или перемещаться в соответсвующую тему. Персональных извещений в ЛС о переносе\удалении поста не будет, ищите сами. Учитывайте, что в системах Ucoz тема не обновляется в статистике при переносе поста.
Посты, написанные здесь-же после переноса, будут расцениваться как кросспостинг, со всеми вытекающими


[cut noguest=Первый юбилей нашей темы]

Здравствуйте господа модостроители, и все так или иначе причастные к этому.
Нашей теме исполнился 1 год.
От души поздравляю Всех Вас дорогие друзья, творческих успехов.
Хочу так же выразить отдельную благодарность denis2000 и ХОВАН.

tracker 23.06.11



[/cut]
 
a4927860Дата: Ср, 23.07.2014, 09:40 | Сообщение # 556
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

denis2000, я вас понял
Тогда сделать ему 1000 хп и при хп меньше 900 давать ему неуязвимость - после чего сменять хп на 20 и посылать в состояние wounded
Или он опять падать не будет?

Добавлено (23.07.2014, 09:40)
---------------------------------------------
в дополнение - отключать ему бой и движение - будет стоять как стату даже если не будет падать.
в скрипте аптечек сответственно проверять кому мы её даем - если бодигварду - делать хп 1000

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

a4927860, Сделал вот так:
[cut]
В файле spawn_sections_extended_stalkers.ltx в самом начале добавил:
Код
[stalker_bodyguard_immunities]
burn_immunity     = 0.0            
strike_immunity    = 0.0        
shock_immunity     = 0.0        
wound_immunity    = 0.0        
radiation_immunity    = 0.0        
telepatic_immunity    = 0.0        
chemical_burn_immunity   = 0.0        
explosion_immunity    = 0.0        
fire_wound_immunity    = 0.0        
wound_2_immunity     = 0.0

[stalker_bodyguard_damage]:stalker_boss_damage
default     = 0.0,-1,1.0
bip01_neck      = 0.0,0,1.0
bip01_head      = 0.0,0,1.0,3
eyelid_1      = 0.0,0,1.0,3
eye_left      = 0,0,1.0,3
eye_right      = 0,0,1.0,3
jaw_1        = 0,0,1.0

в секцию [zat_stalker_bodyguard] добавил:
Код
immunities_sect   = stalker_bodyguard_immunities
damage     = stalker_bodyguard_damage

В файле zat_stalker_bodyguard.ltx в секции [logic] добавил:
Код
on_hit = hit

добавил секцию
Код
[hit]
on_info = %=set_health_0_5%

В секции [bodyguard@***]
добавил
Код
wounded = wounded@bodyguard
invulnerable = {=is_wounded} true, false

Добавил секцию
Код
[wounded@bodyguard]
hp_state = 60|wounded_heavy@help_heavy
hp_state_see = 60|wounded_heavy@help_heavy
hp_victim = 60|nil
hp_cover = 60|false
hp_fight = 60|false
autoheal = false
not_for_help = true
enable_talk = true

В файл xr_effects.script добавил функцию:
Код
function set_health_0_5(actor, npc, p)
local RND = 20
if RND < math.random(100) then
npc.health = (0.5 - npc.health)/4
end
end

[/cut]
В этом случае НПС бессмертен по причине нулевых имунитетов и дамаджей, но хиты корректно посылают колбеки, которые прехватываються в логике и с вероятностью RND = 20% приводят к урону, здоровье при этом не падает ниже 0,5, а порог перехода в состояние вондед равен 0,6.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
a4927860Дата: Чт, 24.07.2014, 02:09 | Сообщение # 558
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

denis2000, уууххх
Круто! Работает. Проверил на двух с разной дамагой от разных источников.

теперь правда стоят столбами - но это мой косяк с излечением.

Спасибо! я думаю это можно в минигайды засовывать - потому как штука полезная

Следующий вопрос - разбор оружия на детали, вернее инструмент для превращения активного оружия в детали.
Для чего - чтобы игрок не тоскал до Кардана тонну пистолетов и винтовок а принес 5кг гаек. В первых хомяки/задроты типа меня будут довольны - все пойдет в хозяйство.
Во вторых игрок сам быдет выбирать что ему важнее - деньги за оружие или скидка за детали.
Предмет "деталь" я уже добавил. Инструмент для разбора оружия тоже.

Вопросы:
1) как понять что именно на этот предмет я хочу применить разборку? (если можно выбирать а не делать на активный)
2) при разборе логично применять function calculate_bonus(victim) как его можно учитывать?
3) на сколько я понял свой предмет "деталь" для учета её в разборе нужно просто добавить в mechanic_box_processing после артов?

Добавлено (23.07.2014, 18:14)
---------------------------------------------
Сразу чтобы сущностей не плодить:
Скидка у механника за детали - где она прописна? Если конкретно - хочу убрать чит с 123 деталями (если принести механнику 123 детали стоимость ремонта будет = 0)

Добавлено (24.07.2014, 02:09)
---------------------------------------------
[cut=Пока сделал так]
добавил юзабельный предмет addon_box_disassemble
и не юзабельный de_details
в function actor_binder:use_inventory_item(obj) (в bind_stalker)

Код
if find_in_string(item_name,"addon_box_disassemble") then
  local item = db.actor:active_item()
   if item ~=nil then
   local cost = sgm_functions.ReadCost(item:section())
   local cond = item:condition()
   local count = 1+cost/200*cond
   local n = 0
    for n=1, count do
     alife():create("de_details", db.actor:position(), count, db.actor:game_vertex_id(), db.actor:id())
    end
   alife():release(alife():object(db.actor:active_item():id()),true)   
   end
     give_object_to_actor("addon_box_disassemble")
end


в код механникам:
Код
         elseif find_in_string(item:section(),"de_") then
             item_value=(1/math.random(10,30))


[/cut]

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

Цитата a4927860 ()
Скидка у механника за детали

Файл inventory_upgrades.script функция mech_discount(perc) параметр bonus_with_stripping


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
Ay49MihasДата: Вс, 27.07.2014, 11:27 | Сообщение # 560
Полевой исследователь
Ученые сталкеры
Сообщений: 218
Награды: 9
Репутация: [ 83 ]

Здравствуйте!
Делаю дополнение к SGM'у, не хочу, чтобы новая игра начиналась. Потому хочу сделать space_restrictor "на лету". Нашёл функцию create_restrictor(ltx_name, radius, x, y, z, lv, gv)
С другой стороны, не нашёл в SGM'е, чтобы она использовалась. Отсюда вопрос: функция рабочая? Можно ли её использовать?
Спасибо!
 
sergej5500Дата: Вс, 27.07.2014, 11:45 | Сообщение # 561
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Ay49Mihas,
Функция создания рестриктора рабочая. По крайней мере, в версии 2.1. Я делал рестриктор таким способом для теста. Изучал метод. Вызывал ф-ию по горячей клавише. Рестриктор спавнился и работал.

Но работал он нестабильно. В одном случае все было нормально. В другом случае игра вылетала по непонятным причинам.
С чем были связаны вылеты, не знаю. Возможно, поэтому в СГМ функция не используется.
 
denis2000Дата: Вс, 27.07.2014, 21:45 | Сообщение # 562
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Ay49Mihas, Пока есть скрипты, зачем спавнить рестриктор?

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
Ay49MihasДата: Пн, 28.07.2014, 04:27 | Сообщение # 563
Полевой исследователь
Ученые сталкеры
Сообщений: 218
Награды: 9
Репутация: [ 83 ]

Цитата denis2000 ()
Пока есть скрипты, зачем спавнить рестриктор?

Не совсем понял вопрос. Подозреваю, что при добавлении рестриктора в all.spawn, потребуется новая игра. Хочу обойтись без этого. Или есть другой путь создания рестрикоров, о котором я не знаю?
 
denis2000Дата: Пн, 28.07.2014, 08:24 | Сообщение # 564
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата Ay49Mihas ()
Подозреваю, что при добавлении рестриктора в all.spawn, потребуется новая игра.

Ваши подозрения оправданы. Все что добавляется в all.spawn требует новой игры.
Цитата Ay49Mihas ()
Хочу обойтись без этого.

В стаком случае обойдитесь без рестриктора, логика которого в итоге обрабатывается скриптами. В 95% случаев можно отказаться от посредника в лице движкового класса cse_alife_space_restrictor.
Цитата Ay49Mihas ()
Или есть другой путь создания рестрикоров, о котором я не знаю?

Смотри выше.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
Ay49MihasДата: Пн, 28.07.2014, 10:26 | Сообщение # 565
Полевой исследователь
Ученые сталкеры
Сообщений: 218
Награды: 9
Репутация: [ 83 ]

Цитата denis2000 ()
Ваши подозрения оправданы. Все что добавляется в all.spawn требует новой игры.

Вейпоинты, добавленные в all.spawn, не требуют новой игры. Но, боюсь, рестрикторы потребуют.

Цитата denis2000 ()
В стаком случае обойдитесь без рестриктора, логика которого в итоге обрабатывается скриптами. В 95% случаев можно отказаться от посредника в лице движкового класса cse_alife_space_restrictor.

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

Спасибо!


Сообщение отредактировал Ay49Mihas - Пн, 28.07.2014, 10:39
 
a4927860Дата: Пн, 28.07.2014, 11:27 | Сообщение # 566
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

Решил добавить еще две способности, подготовил все кроме собственно действия

Собственно нужны две команды для скрипта:
1) изменение течения времени
2) неуязвимость для гг - нашел команду god но она не работает (как собственно и бессмертие в самом SGM2.2 которое включается чит консолью)
 
denis2000Дата: Пн, 28.07.2014, 11:53 | Сообщение # 567
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата Ay49Mihas ()
Вейпоинты, добавленные в all.spawn, не требуют новой игры.

Далеко, далеко не все!
Цитата Ay49Mihas ()
Но, боюсь, рестрикторы потребуют.

Вот тут 100% потребуют.
Цитата Ay49Mihas ()
А вот тут не знаю, как по-другому (ну, кроме вечной проверки нахождения пользователя в координатах).

Да, точно то что делает on_actor_inside только ручками
[cut]
В файле bind_stalker.script в функции actor_binder:update(delta)
Код
TUS_control.TUS_update()

В файле например TUS_control.script
Код
function TUS_update()
local level_TUS = "zaton" --Уровень треша угара и т.п.
local point_TUS = vector():set (100,100,100) --Точка треша угара и т.п.
local radius_TUS = 10 --Радиус действия треша угара и т.п.

      if has_alife_info("TUS_enable") then --Инфопорция активируюшая точку треша угара и т.п.
       if level.name() == level_TUS then
        if point_TUS:distance_to_sqr(db.actor:position()) <= radius_TUS * radius_TUS then
         --(Включить треш угар и т.п.)
        else
         --(Отключить треш угар и т.п.)
        end
       end
      end
end
[/cut]
Вообще для реализации такого есть три варианта:
1. Рестриктор с логикой в all.spawn
2. Рестриктор с логикой спавн через скрипт
3. Ручной перехват ситуации скриптом
Выбор за вами.

---------------------------------------------

Цитата a4927860 ()
изменение течения времени

Команда такая:
Код
level.set_time_factor(50)
, где 50 - во сколько раз игровое время течет быстрее реального.
Цитата a4927860 ()
неуязвимость для гг

Собственно как и в чит консоли, бессмертие активируеться строкой db.actor.health = 1 в файле bind_stalker.script в функции actor_binder:update(delta)


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
a4927860Дата: Пн, 28.07.2014, 11:57 | Сообщение # 568
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

denis2000, спасибо
правильно ли я понял что level.set_time_factor(0,5) - замедление течения времени в 2 раза?

Да, но учитывайте что относительно реального времени! denis2000

Цитата denis2000 ()
Собственно как и в чит консоли

Цитата a4927860 ()
не работает (как собственно и бессмертие в самом SGM2.2 которое включается чит консолью)

собственно с чем и связан вопрос

Не работает чит консоль и не работает комманда разные вещи. denis2000
 
Ay49MihasДата: Пн, 28.07.2014, 12:01 | Сообщение # 569
Полевой исследователь
Ученые сталкеры
Сообщений: 218
Награды: 9
Репутация: [ 83 ]

Цитата denis2000 ()
Вообще для реализации такого есть три варианта:
1. Рестриктор с логикой в all.spawn
2. Рестриктор с логикой спавн через скрипт
3. Ручной перехват ситуации скриптом
Выбор за вами.

О, круто, спасибо!

По примеру выше, я правильно понял, что вызов этой функции надо вставить, например, в update_main() в sgm_update.script?

Да, если у вас SGM, то функцию можно вызывать и оттуда. denis2000
 
a4927860Дата: Вт, 29.07.2014, 09:56 | Сообщение # 570
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

denis2000, Понял - спасибо.
Тогда еще один вопрос:
на сколько я понял нельзя влиять скриптами на такие параметры героя как скорость, высота прыжка и т.д.
Но можно ли подбросить его в направлении точки прицела? (знаю что нпс подбрасывать нельзя но м.б. с гг другая ситуация?)

Ситуация та же, скриптово неполучается передать импульс НПС или ГГ, можно попытаться спавнить гравианомалию и после убирать ее или напрямую менять координаты ГГ. denis2000

Добавлено (29.07.2014, 00:40)
---------------------------------------------
Хэх, кажется я опять не правильно задал вопрос =)

мне не нужно течение времени в отрыве от действий нпс - я хочу чтобы замедлялся не таймер а нпс =)

Добавлено (29.07.2014, 00:41)
---------------------------------------------
Вернее даже не только нпс а все включая героя.

Bullet Time в Сталкере не возможен без редактирования движка или сторонних средств (как например setSpeed.exe в Shoker Weapon Mod). denis2000

Добавлено (29.07.2014, 09:56)
---------------------------------------------
Это очень очень плохо...
Но спасибо за то что объяснили.

Тогда - возможно ли создать оцепенение? если точнее - ввести нпс в состояние когда он не двигается и не атакует (но жив), скриптом естественно.

 
Поиск: