Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: 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]
 
alex_xp_77Дата: Сб, 10.01.2015, 12:51 | Сообщение # 1006
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

Вобщем не стал делать волосы, слишком просто для сказочного персонажа, решил делать лианами ивы с головы, тут : http://SSMaker.ru/592f0b87/ , но кости привязываю только модификатором skin, т.к. было задумано разработчиками, physique делал, но расчеты модификатора только для статических обьектов, при динамике, чему принадлежат НПС, и монстры, только skin, дальнейшие работы если привязывать physique, очень усложняются, из за растяжек меша, можно пробовать в место bones, поставить biped, что в разы упрощает задачу, но sdk 04,05,07, с трудом опознает такую схему, может не настолько профи в этом, и как то можно упростить работу другими средствами, увы я с этим способом не знаком!!

 
a4927860Дата: Вс, 11.01.2015, 18:29 | Сообщение # 1007
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

Все равно получается слишком просто и не слишком реалестично...

В sgm есть много замечательных функций но я не нашел колбека на загрузку локации.
Подскажите пожалуйста как лучше сделать - при загрузке локации проверять все сундуки и личные тайники и если в них есть вещи игрока очищать их содержимое.
 
denis2000Дата: Вс, 11.01.2015, 20:54 | Сообщение # 1008
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

a4927860, В bind_stalker.script функция actor_binder:net_spawn(data) выполняется при начеле игры, при загрузке сейва или локации.

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

Жутко бесит что при поиске не дающем результат http://sigerous.ru/forum падает в 404...
на всем сайте 1но упоминание проверки заполнения box и то в читер клубе, про очистку оного вообще ни слова не где.

1) можно ли очистить весь Вох одной командой?
2) если нет - как лучше чистить?
при составлении скрипта вида: for удаляет 1й предмет а потом не откликается или сваливает в еррор без отображения причины...
3) как лучше сделать перебор рюкзаков гг? в случае с боксами я использую списки sgm_supply (благо они там статичны)

Честно-честно последняя серия вопросов. Уже хочется закончить, собрать репак и успокоиться...
 
asd123Дата: Вт, 13.01.2015, 02:51 | Сообщение # 1010
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

Как сделать группировку "Военные" (army) активной? То есть, чтобы она вернулась в войну группировок, путешествовала по смартам, и водила ГГ по смартам. Еще летом спрашивал, тогда Вы мне отвечали.. Переустановил gamedat`y, и теперь опять столкнулся с этой проблемой. Что-где править?

У мутантов тоже есть группировки. © Движок X-Ray




Сообщение отредактировал asd123 - Вт, 13.01.2015, 03:27
 
sergej5500Дата: Вт, 13.01.2015, 09:48 | Сообщение # 1011
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Цитата asd123 ()
водила ГГ по смартам


Нужно убрать у вояк запрет. Файл travel_manager.script. Функция uni_traveler_precond. Уберите вояк из этой функции.

Цитата asd123 ()
путешествовала по смартам


В файле sim_board.scripts надо добавить группировку вояк в функцию simulation_activities. Прописать её аналогично сталкерам или бандитам.
 
alex_xp_77Дата: Вт, 13.01.2015, 12:29 | Сообщение # 1012
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

Цитата sergej5500 ()
путешествовала по смартам

Мне достаточно было не подписывать смарты, Нпс стали гулять по смартам, возможно глюк, ничем пояснить, либо прикрепить не могу, проще [smart_terrain], и вот при 3 смартов и выше, НПС начинают сами гулять между смартами, даже какая то переодичность возникает, это про 04 тч!! ППробуйте , может и у вас появится некая подобная аномалия!!


 
asd123Дата: Вт, 13.01.2015, 15:17 | Сообщение # 1013
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

alex_xp_77, да не. Лучше воспользуюсь тем, что уже делал - sim_board и travel_manager. Просто, у меня военные держат Кордон а не сталкеры. И то, что они неактивная группировка меня очень сильно беспокоит..

Добавлено (13.01.2015, 15:17)
---------------------------------------------
sergej5500, хах.. убрал с военных запрет, заспавнил отряд на блокпосту Кордона, те пошли на точку, где в ЧН сидел агент Халецкого. Прилетел вертолет, и.. ну вы поняли)


У мутантов тоже есть группировки. © Движок X-Ray


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

Цитата a4927860 ()
можно ли очистить весь Вох одной командой?

Нет, по крайней мере ничего похожего в lua_help.script я не нахожу.
Цитата a4927860 ()
если нет - как лучше чистить?

Код

local function delete_item_in_box(box,item)
--Удаляете объект item      
end
conteiner:iterate_inventory_box(delete_item_in_box, conteiner)


Цитата a4927860 ()
как лучше сделать перебор рюкзаков гг?

1. Хранить в виде некой таблицы объекты рюкзаки созданные динамически, при этом сохранять ее в сейвах и восстанавливать в случае загрузки, тогда просто итерироваться по таблице и делать необходимое.
2. Перебирать абсолютно все объекты, читать их имена секций и по имени идентифицировать эти рюкзаки.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
asd123Дата: Чт, 15.01.2015, 16:49 | Сообщение # 1015
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

Какой скрипт нужно поправить и в какой строке, чтобы вертолет перестал стрелять во врага, если враг погибает(А то у меня вертолет буйный.. стрелял в бандита, проходили военные. Он в труп бандита еще стрелял, да еще и ракеты выпустил, убив вояк)

У мутантов тоже есть группировки. © Движок X-Ray


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

asd123, В файле heli_combat.script функция function heli_combat:update_forgetting()

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

Добрый вечер. можно ли сделать так, чтобы группировки воспринимали ГГ, который одет в их одежду нентралом или другом? Заранее благодарен.
 
ДизельДата: Пт, 16.01.2015, 20:30 | Сообщение # 1018
Сталкер
Разработчики
Сообщений: 260
Награды: 1
Репутация: [ 136 ]

Цитата roma_uf ()
Добрый вечер. можно ли сделать так, чтобы группировки воспринимали ГГ, который одет в их одежду нентралом или другом? Заранее благодарен.

Можно было бы, если в рюкзак помещался бы один какой то броник, а так сложно однако.

Тут Денис2000 наверное шарит, надо скрипты править под это однако. Вообще надо найти функцию, которая видит одетый броник и в ней поковыряться.
Меня тоже этот вопрос раньше интересовал, но я забыл про эту идею, а сейчас просто некогда этим заниматься.


andreyholkin
 
alex_xp_77Дата: Пт, 16.01.2015, 21:14 | Сообщение # 1019
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

Нуу..... про то что-какая одежда, такой (нации) будет гг, я извеняюсь за пафос, но в игре конечно есть пда, по которому видна история сталкеров, я не критик, но это не тот вопрос на который нужен ответ!! Хотя по существу, я бы прописал (если бы можно было) логику одежде, или бронику, очень грамотную логику, тогда думаю можно??

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

Цитата roma_uf ()
Добрый вечер. можно ли сделать так, чтобы группировки воспринимали ГГ, который одет в их одежду нентралом или другом?


Это уже сделано в учебнике Хована. Ссылка в шапке темы.

[cut=Код для костюмов]Если бы ГГ был прописан к действующим кланам, то как бы двигался сюжет? Пусть бы ГГ вступил в клан обычных бандитов, да любой сталкер почёл за удовольствие его грохнуть. Поэтому Николай ввёл группировку actor_bandits, к которой сталкеры нейтральны. А у нас идея нагло и цинично менять костюмы и имитировать членство в группировке.

Значит нам надо определить, что надето на ГГ.

Определяемся. Голый ГГ - сталкер, Если надет novice_outfit или stalker_outfit - тоже.

Если надет svoboda_light_outfit или svoboda_heavy_outfit - Свободовец.

Если надет dolg_outfit или dolg_heavy_outfit - Долговец



и так далее.



После того как мы определились какой броник соответствует какому клану можно писать свои функции. В папке скриптов создаём пустой файл perehod.script В нем создаём функцию analisis_outfit.



function analisis_outfit()

--Теперь надо узнать, что надето на ГГ

local outfit_now = db.actor:item_in_slot(7)

--Чего там на нём? Выясняем:

if (outfit_now ~= nil) then --если не голый

--если костюм новичка или комбез сталкера

if outfit_now:section() == "novice_outfit" or outfit_now:section() == "stalker_outfit" then

--изменяем клан для ГГ

actor_stalker() -- см ниже

elseif

outfit_now:section() == "svoboda_light_outfit" or outfit_now:section() == "svoboda_heavy_outfit" then actor_svoboda() -- см ниже

elseif

outfit_now:section() == "dolg_outfit" or outfit_now:section() == "dolg_heavy_outfit" then

actor_dolg() -- см ниже



--и так перебираем все костюмы кланов, вызывая функцию присвоения членства ГГ в соответствующем клане.



--в конце идёт "в противном случае" - если не один костюм из перебираемых не соответствует надетому. Пусть в этом случае clan - сталкер.

else

actor_stalker() -- см ниже

end

end

end



Дальше пошли функции принятия ГГ в кланы:



--Приём в сталкеры

function actor_stalker()

db.actor:set_character_community("stalker",0,0)

sgm_functions.write_variable("stat_community","stalker")

end



--Приём в Свободу

function actor_svoboda()

db.actor:set_character_community("svoboda",0,0)

sgm_functions.write_variable("stat_community","svoboda")

end



--Приём в Долг

function actor_dolg()

db.actor:set_character_community("dolg",0,0)

sgm_functions.write_variable("stat_community","dolg")

end



--И далее, сколько кланов анализируется. Откуда берётся перечень броников? Из \configs\misc\outfit.ltx. А названия группировок? Из \configs\creatures\game_relations.ltx.



Итак. Мы сделали функцию анализа броника и несколько функций перевода ГГ в клан, соответствующий бронику. А как их запускать? Все функции "быстрого реагирования" запускаются из различных апдейтов. Апдейты несколько десятков раз в минуту обновляют ситуацию в игре.

Мы прицепимся к биндеру актёра. Открываем scripts\bind_stalker.script

Ищем функцию function actor_binder:update(delta) и в самый конец функции перед последним end

вводим вызов соей функции анализа. Здесь надо учесть, что вызов функции из другого файла предваряется именем файла, где содержится функция. Разделяется имя файла и имя функции точкой. Значит наш вызов будет выглядеть в теле апдейта так:



-- загрузка мода(постоянное обновление)

if mod_update() then

sgm_loader.sigerous_mod_main()

end

perehod. analisis_outfit()

end



Всё, тестируем, что получилось

Маленькие хитрости:

Если мы хотим, чтобы у сталкеров проверялся ешё и экзоскелет, то мы должны изменить строчку анализа:

if outfit_now:section() == "novice_outfit" or outfit_now:section() == "stalker_outfit" or outfit_now:section() == "exo_outfit" then



Однако есть ведь и проапгрейженные броники, и чего , все их вставлять в анализ?

Есть чудесная функция find_in_string(строка,фрагмент) она позволяет найти в строке фрагмент, если он есть и возвращает true, если нашла фрагмент и false, если нет.

Попробуем её использовать в анализе.

Смотрим на костюмы Долга. И в тот и в другой входит фрагмент "dolg" Значит, если в названии костюма мы найдём строчку "dolg" мы однозначно попадём на долговские костюмы. Значит строчку

outfit_now:section() == "dolg_outfit" or outfit_now:section() == "dolg_heavy_outfit" then

можно заменить так:

find_in_string(outfit_now:section(), "dolg") then
[/cut]
 
Поиск: