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

alex_xp_77, Это делается не столько в 3D редакторе сколько в SDK.
1. Создается целый объект (meshes\objects\dynamics\box\box_wood_01.ogf)
2. Создается несколько объектов на которые развалиться основной (meshes\objects\dynamics\box\prt\box_wood_01_prt1.ogf...box_wood_01_prt7.ogf)
3. В кастом дате основного объекта прописывается конфигурация разрушения (config\models\objects\box_wood_01.ltx), в частности список объектов на которые развалиться, звук и партиклы разрушения, имунитеты, время автоудаления фрагментов и физические параметры разрушения.

Цитата NIV ()
однако скрипт не работает.

Как определили, что не работает? А в солянке работает?


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
NIVДата: Чт, 19.06.2014, 12:34 | Сообщение # 482
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Цитата denis2000 ()
Как определили, что не работает? А в солянке работает?

Да, в Солянке работает. А у меня не происходит никаких действий, как будто оружие без скрипта. Раскомментировал функцию, которая лог пишет - в консоли все равно ничего. Так что или скрипт не привязался, или обработка кнопок мыши не срабатывает.

Биндер объекту назначали? denis2000

А это - не оно?
script_binding = bind_ggun.init
Или где-то еще надо?

Да это оно. У меня прекрасно работает. После лечения вылетов с функциями которые более не поддерживаются движком. denis2000

Да, поменял Init на SetWndPos

Значит скрипт 100% работает, у вас может нечетко работать определение нажатия кнопок, у меня этого не наблюдается. Пилите метод update это там: нажатие левой кнопки определяется по расходу боеприпасов, а правой по прицеливанию. denis2000

Действительно, пришлось кое-что исправить. Определение левой кнопки работает не так, как задумано, но оно там и не нужно. Довёл грави-пушку до ума и решил поделиться ей со всеми желающими:
Смотреть здесь.


Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"

Сообщение отредактировал NIV - Пт, 20.06.2014, 10:51
 
avalonДата: Чт, 19.06.2014, 22:44 | Сообщение # 483
Гражданский
Пользователи
Сообщений: 7
Награды: 0
Репутация: [ 0 ]

Доброго времени суток всем! Играю сейчас в сборку от “danu” (SGM_2.2+Albor+Textures+AtmosFear_3), всё радует кроме пары нюансов:
1- в сборке Альбора при использование аптечки и бинта убирается оружие, впрочем как и в реальности, и мне это нравится (так как я ярый фанат реализма и хардкора, который всегда играет без прицела, без депозитов, мародерства и прочих упрощающих игру манипуляций), но увы в сборке от danu – использование аптечки и бинта возможно во время стрельбы без убирания оружия;
2- Приём медикаментов, энергетиков и водки больше не сопровождаются одурманиванием и шатанием, а также заражением или избавлением от токсинов, в отличии от оригинальной сборки Енота.
Естественно я писал в ЛС к автору сборки но, увы после многочисленных компиляций файлов своей сборки, он не может точно ответить как вернуть данные эффекты.
P.S. Поиском и гуглом я умею пользоваться, и вернуть худ Альбора в сборку от danu я сам смог, но могу только догадываться – какие файлы или конфиги нужно изменить, что бы исправить две свои выше написанные просьбы…
 
suhar_Дата: Сб, 21.06.2014, 21:32 | Сообщение # 484
Бывалый
Пользователи
Сообщений: 106
Награды: 0
Репутация: [ 0 ]

denis2000, к посту 479:
Правильно ли я понимаю, что для функции поломки шлемов всё будет выглядеть аналогично
local outfit_classes = {} перейдёт в local helmet_classes = {} и т.д.
За исключением блока
outfit_classes = {
[clsid.equ_exo] = true,
[clsid.equ_military] = true,
[clsid.equ_scientific] = true,
[clsid.equ_stalker_s] = true,
[clsid.helmet] = true}
Что должен содержать внутри новый блок helmet_classes = {...} ???

Шлемы уже и так входят в эту таблицу: [clsid.helmet] = true
denis2000
 
makdmДата: Сб, 21.06.2014, 22:51 | Сообщение # 485
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

suhar_, clsid шлемов уже включён в таблицу outfit_classes, поэтому для шлема достаточно вызвать функцию IsOutfit.
Если вы хотите разделить шлемы и бронекостюмы, тогда из таблицы outfit_classes нужно удалить [clsid.helmet] = true
А в таблицу helmet_classes добавить [clsid.helmet] = true
Также следует написать функцию IsHelmet


Терпение......
И все получится!
 
suhar_Дата: Вс, 22.06.2014, 09:32 | Сообщение # 486
Бывалый
Пользователи
Сообщений: 106
Награды: 0
Репутация: [ 0 ]

Цитата denis2000 ()
Шлемы уже и так входят в эту таблицу

То есть шлемы должны ломаться так же как и костюмы?
С костюмами всё работает исправно, а вот шлемы не портятся.


Цитата makdm ()
Если вы хотите разделить шлемы и бронекостюмы

Разделил, как вы сказали. Ситуация аналогичная: костюмы портятся, шлемы нет.
[cut]
Правки в файле _g.script:
...
local helmet_classes = {}
...
function isHelmet(object, class_id)
local id = class_id or get_clsid(object)
return helmet_classes[id] == true
end
...
helmet_classes = {
[clsid.helmet] = true}
...

В файле death_manager.script:
...
if isHelmet(item) then
set_helmet_drop_condition(item)
return
end
...
function set_helmet_drop_condition(item)
local condition = (math.random(80)+10)/100
item:set_condition(condition)
end
...

Все блоки находятся на своих местах, как указывал denis2000, в нужной последовательности. Конечно, если это имеет значение.
[/cut]
 
denis2000Дата: Вс, 22.06.2014, 10:33 | Сообщение # 487
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

suhar_, Пробуйте:
Код
helmet_classes = {
[clsid.helmet] = true,
[clsid.equ_helmet_s] = true}

Если не получается придется смотреть конкретный clsid объекта и вносить в таблицу его, например если clsid = 41:
Код
helmet_classes = {
[clsid.helmet] = true,
[clsid.equ_helmet_s] = true,
[41] = true}


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

Цитата denis2000 ()
[clsid.equ_helmet_s] = true

Этот блок решил проблему.
Спасибо, заработало:)
 
sergej5500Дата: Вс, 22.06.2014, 20:59 | Сообщение # 489
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер. Возник такой вопрос.

[cut=Логика проводника до Скадовска][logic]
active = move@vagrant_walking_one
on_death = death
on_hit = hit
post_combat_time = 5,10

[hit]
on_info = %+zat_accompany_stalker_hit%

[death]
on_info = {-zat_accompany_to_boat_start} %+zat_accompany_stalker_death%,{+zat_accompany_to_boat_start -zat_accompany_to_boat_daleko} %+zat_accompany_stalker_death +zat_accompany_to_boat_i_am_alone%

[move@vagrant_walking_one]
move_avail_speak = 15|wait|true|true
move_dest_number = 308681
move_state_when_center = guard
move_state_when_move = patrol
move_stop_on_talk = true
on_signal = on_center|move@vagrant_walking_two
on_info = {+zat_accompany_to_boat_start -zat_accompany_to_boat_complete} move@accompany_pursue
on_info2 = {+zat_accompany_to_boat_sam =dist_to_actor_ge(150)} nil %=release_npc%
meet = meet

[move@vagrant_walking_two]
move_avail_speak = 15|wait|true|true
move_dest_number = 320703
move_state_when_center = guard
move_state_when_move = patrol
move_stop_on_talk = true
on_signal = on_center|move@vagrant_walking_one
on_info = {+zat_accompany_to_boat_start -zat_accompany_to_boat_complete} move@accompany_pursue
on_info2 = {+zat_accompany_to_boat_sam =dist_to_actor_ge(150)} nil %=release_npc%
meet = meet

[move@accompany_pursue]
scheme_type = patrol
patrol_count_path = 15
patrol_path_1 = 393388
patrol_path_1_state = rush
patrol_path_2 = 517628
patrol_path_2_state = rush
patrol_path_3 = 597306
patrol_path_3_state = rush
patrol_path_4 = 690040
patrol_path_4_state = rush
patrol_path_5 = 786661
patrol_path_5_state = rush
patrol_path_6 = 859798
patrol_path_6_state = rush
patrol_path_7 = 918418
patrol_path_7_state = rush
patrol_path_8 = 980374
patrol_path_8_state = rush
patrol_path_9 = 1020355
patrol_path_9_state = rush
patrol_path_10 = 1107292
patrol_path_10_state = rush
patrol_path_11 = 1117039
patrol_path_11_state = rush
patrol_path_12 = 1133012
patrol_path_12_state = rush
patrol_path_13 = 1161336
patrol_path_13_state = rush
patrol_path_14 = 1169728
patrol_path_14_state = run
approach_state = hide_na|18|>
on_patrol_path = 14|move@vagrant_walking_two %=send_tip(zat_accompany_final_text:portrait_neutral_1:zat_accompany_stalker_title:5000)%
on_info = {+zat_accompany_to_boat_start -zat_accompany_to_boat_complete -zat_accompany_to_boat_daleko =dist_to_actor_ge(90)} nil %+zat_accompany_to_boat_daleko =release_npc%
on_info2 = {+zat_accompany_to_boat_complete} move@vagrant_walking_two
on_info3 = {=zat_accompany_stalker_ambush_cond -zat_accompany_to_boat_ambush} %+zat_accompany_to_boat_ambush =zat_accompany_stalker_ambush_action%

[on_corpse_use]
run_action = zat_accompany_to_boat

[meet]
abuse = true
use = {=dist_to_actor_le(3) -zat_accompany_to_boat_start -zat_accompany_to_boat_sam !actor_enemy !has_enemy} self, false
allow_break = false
meet_on_talking = false
trade_enable = false[/cut]
Переделал логику под эксклюзива на смарте.
[cut=Логика][on_corpse_use]
run_action = zat_accompany_to_boat

[walker@global_zat_accompany_stalker]
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false

[logic@zat_accompany_stalker]
active = walker@zat_accompany_stalker
suitable = {=check_npc_name(zat_accompany_stalker)} true
prior = 300
post_combat_time = 0,0

[walker@zat_accompany_stalker]:walker@global_zat_accompany_stalker
path_walk = zat_accompany_stalker_walk
avail_speak = 15|wait|true
meet = meet
on_info = {+zat_accompany_to_boat_start -zat_accompany_to_boat_complete} walker@zat_accompany_stalker_pursue

[walker@zat_accompany_stalker_pursue]
path_walk = zat_accompany_stalker_pursue_walk
def_state_standing = walk
def_state_moving = assault
on_signal = zat_accompany_to_boat_complete | walker@zat_accompany_stalker_final %=send_tip(zat_accompany_final_text:portrait_neutral_1:zat_accompany_stalker_title:5000) +zat_accompany_to_boat_complete%
on_info = {=zat_accompany_stalker_ambush_cond -zat_accompany_to_boat_ambush} %+zat_accompany_to_boat_ambush =zat_accompany_stalker_ambush_action%
on_info2 = {+zat_accompany_to_boat_complete} walker@zat_accompany_stalker_final
meet = no_meet

[walker@zat_accompany_stalker_final]:walker@global_zat_accompany_stalker
path_walk = zat_accompany_stalker_walk
avail_speak = 15|wait|true
meet = no_meet

[meet]
abuse = true
allow_break = true
use = {=dist_to_actor_le(3) -zat_accompany_to_boat_start -zat_accompany_to_boat_sam !actor_enemy !has_enemy} self, false
trade_enable = false
meet_on_talking = false
[/cut]
В обоих файлах есть секция on_corpse_use. При юзании трупа непися она вызывает ф-ию, записанную в xr_effects.

Применяемые функции:
[cut=xr_additional]function on_corpse_use(npc,char_ini,on_corpse_use)
local on_corpse_use = on_corpse_use or "on_corpse_use"
if char_ini~=nil and char_ini:section_exist(on_corpse_use) and not npc:alive() then
if char_ini:line_exist(on_corpse_use,"start_tutorial") then
game_hide_menu()
game.start_tutorial(char_ini:r_string(on_corpse_use,"start_tutorial"))
elseif char_ini:line_exist(on_corpse_use,"run_action") then
game_hide_menu()
xr_effects[char_ini:r_string(on_corpse_use,"run_action")](actor,npc)
game_hide_menu()
elseif char_ini:line_exist(on_corpse_use,"give_info") then
game_hide_menu()
give_info(char_ini:r_string(on_corpse_use,"give_info"))
end
end
end
[/cut]
[cut=xr_motivator]function motivator_binder:use_callback(obj, who)
if self.object~=nil then
if self.object:alive() then
inventory_upgrades.need_victim(obj)
xr_meet.notify_on_use(obj, who)
dialog_manager.disabled_phrases[obj:id()] = nil
if self.st.active_section then
xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "use_callback", obj, who)
end
else
if self.once_use_processed == false then
local st = db.storage[self.object:id()]
self.once_use_processed = true
local on_corpse_use = utils.cfg_get_string(self.object:spawn_ini(),st.section_logic,"on_corpse_use",self.object, false, "", nil)
sgm_callbacks.on_use_corpse(self.object)
xr_additional.on_corpse_use(self.object,self.object:spawn_ini(),known_info)
end
end
end
end
[/cut]
[cut=sgm_callbacks]function on_use_corpse(npc)
if has_alife_info("disk_breaking_installed") then
sgm_functions.extract_money_from_corpse(npc)
end
if npc:profile_name()=="val_b3_base_commander_3" and dont_has_alife_info("val_shade_of_time_renegade_help") then
give_info("val_shade_of_time_renegade_help")
end
end
[/cut]

Функция работает для НПС с кастом-датой и никак не хочет работать у эксклюзива на смарте. Что и в каких файлах надо поправить, чтобы секция логики читалась?
 
denis2000Дата: Пн, 23.06.2014, 08:59 | Сообщение # 490
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Не работает потому, что для НПС под эсклюзивом self.object:spawn_ini() не содержит логики НПС, поскольку она приписана к смарту, а не к спавнсекции НПС.
Быстрый совет: попробуйте в секции НПС прописать custom_data = scripts\....on_corpse_use_section.ltx
А в этом файле соответствено только секцию:
Код
[on_corpse_use]   
run_action = zat_accompany_to_boat


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

Добрый день. Возникла такая проблема.

1. Перевел под сквады СГМ-неписей (торговец, банкир, Меч и т.д.).
2. Вместе с оригинальными сквадами ЗП на Скадовске одновременно может находиться до 20 сквадов квестовых персонажей.
3. На Скадовск приходят "ночевать" сквады из симуляции. Ночью счетчик НПС на судне показал 53 штуки. Игра при этом превращается в слайд-шоу.

Вопрос. Можно ли как-то ограничить число симуляционных сквадов, приходящих "ночевать" на судно? Если число симуляционных сквадов ограничить 5, то неписей на судне будет примерно 30-35. Это еще терпимо.
 
denis2000Дата: Пн, 30.06.2014, 11:13 | Сообщение # 492
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Ограничьте лучше общее количество возможных сквадов на Скадовске или исключите его смарт из симуляции.

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

переносил ак12 из arsenal overhaul 2 в сгм 2.2 сборка енота, при взятии его в руки происходит вылет с таким логом:
[cut noguest=Лог]FATAL ERROR

[error]Expression : pm->m_animations.size()
[error]Function : player_hud_motion_container::load
[error]File : D:\prog_repository\sources\trunk\xrGame\player_hud.cpp
[error]Line : 92
[error]Description : motion not found [ak_no_reload]


stack trace:[/cut]
В чем причина?
 
FantomICWДата: Вт, 01.07.2014, 12:05 | Сообщение # 494
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

X-ray115, не найдена анимация ak_no_reload.


 
X-ray115Дата: Вт, 01.07.2014, 12:17 | Сообщение # 495
Гражданский
Пользователи
Сообщений: 7
Награды: 0
Репутация: [ 0 ]

Цитата FantomICW ()
X-ray115, не найдена анимация ak_no_reload.

в папке anims (arsenal overhaul 2) этой анимации нет, где она может быть?

Она содержиться в omf или ogf файле. И таких анимаций долждно быть две! Одна для рук, другая для оружия. denis2000
 
Поиск: