Модостроение. Общие вопросы и ответы
|
|
denis2000 | Дата: Сб, 15.06.2013, 11:51 | Сообщение # 1 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Помощь тем кто хочет знать больше о игре и модах Если у вас появились вопросы по модостроению в игре 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]
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
suhar_ | Дата: Ср, 26.11.2014, 21:01 | Сообщение # 766 |
Бывалый
Пользователи
Сообщений: 106
| Проблема в работе функции SetWidth и SetHeight в скрипте. [cut=Кусок скрипта] if custom_static_psy_back == nil then get_hud():AddCustomStatic("hud_psy_back", true) custom_static_psy_back = get_hud():GetCustomStatic("hud_psy_back") wnd = custom_static_psy_back:wnd() wnd:SetWndPos(vector2():set(posx, posy)) wnd:SetHeight(height) wnd:SetWidth(width) end[/cut] [cut=Лог вылета]Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ...games\stalker cop\gamedata\scripts\lex_psybar.script:110: attempt to call method 'SetWidth' (a nil value) Или в Description'е идёт ссылка на функцию SetHeight (если меняю местами порядок)[/cut] Видел, как аналогичная функция работает в моде на ЧН без всяких проблем. Что не так?
Сообщение отредактировал suhar_ - Ср, 26.11.2014, 21:02 |
|
|
Эти 0 пользователя(ей) поблагодарили suhar_ за это полезное сообщение: |
|
|
CBO6ODA | Дата: Ср, 26.11.2014, 21:58 | Сообщение # 767 |
Отмычка
Пользователи
Сообщений: 30
| sergej5500, Сделал как ты сказал. Теперь точно так-же, но появился лог: [cut noguest=Лог][error]Expression : false [error]Function : CXml::Load [error]File : D:\prog_repository\sources\trunk\xrXMLParser\xrXMLParser.cpp [error]Line : 87 [error]Description : XML file:text\rus\st_dialogs_zaton.xml value: errDescr:Error reading end tag.[/cut]Добавлено (26.11.2014, 21:58) --------------------------------------------- Проблему решил. Но теперь с моим НПС, нельзя поговорить...
SGM 2.2 CBO6ODA EDITION - 32% (24.04.2017)
|
|
|
Эти 0 пользователя(ей) поблагодарили CBO6ODA за это полезное сообщение: |
|
|
sergej5500 | Дата: Ср, 26.11.2014, 22:18 | Сообщение # 768 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| CBO6ODA,
Вы прописали неписю этот диалог?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Ср, 26.11.2014, 23:46 | Сообщение # 769 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| suhar_, Невозможно применить метод SetHeight к объекту get_hud():GetCustomStatic():wnd() за не имением у него такового. Пробуйте SetWndSize(vector2():set(width,height))
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
suhar_ | Дата: Чт, 27.11.2014, 05:57 | Сообщение # 770 |
Бывалый
Пользователи
Сообщений: 106
| denis2000, с функцией разобрался. Задача была следующая: вывести на худ индикатор пси-здоровья ГГ. Поскольку состояние пси-здоровья может быть разным, то и индикатор должен постоянно обновляться согласно этой разнице. Для этого в функцию bind_stalker.actor_binder:update ввожу строку таким образом: [cut=Тыц]function actor_binder:update(delta) object_binder.update(self, delta) lex.on_actor_update(self.object) ... end[/cut] Создаю отдельный файл lex.script [cut=Тыц]-- Колбэк на апдейт ГГ function on_actor_update(obj) -- Проверка уровня пси-здоровья if db.actor.psy_health == 0 then db.actor:kill(db.actor) end -- Обновление шкалы пси-здоровья lex_psybar.show_psybar() end[/cut] Затем создаю файл lex_psybar.script непосредственно с функцией show_psybar: [cut=Тыц]local posx = 758 local posy = 640 local width = 163 local height = 38 local p_dx = 36 local p_dy = 19 local p_width = 113 local p_height = 10
local w_posx = 802 local w_posy = 641 local w_width = 136 local w_height = 38 local w_p_dx = 29 local w_p_dy = 19 local w_p_width = 95 local w_p_height = 10
local new_width = 0 local n_width = 0 local saved_aspect = 0 local saved_width = -1
-- Вывод шкалы пси-здоровья function show_psybar() local act_it = db.actor:active_item() if db.actor:alive() then if act_it and act_it:section() == "wpn_binoc" then local zoom = 67.5/device().fov zoom = (zoom-1)*1.5 + 1 if zoom < 1.001 then zoom = 1.001 end if zoom > 1.3 then if get_hud():GetCustomStatic("hud_psy_back") then get_hud():RemoveCustomStatic("hud_psy_back") end if get_hud():GetCustomStatic("hud_psy_level") then get_hud():RemoveCustomStatic("hud_psy_level") end return else shkala() end else shkala() end else if get_hud():GetCustomStatic("hud_psy_back") then get_hud():RemoveCustomStatic("hud_psy_back") end if get_hud():GetCustomStatic("hud_psy_level") then get_hud():RemoveCustomStatic("hud_psy_level") end return end end function shkala() local wnd local custom_static_psy_back = get_hud():GetCustomStatic("hud_psy_back") local custom_static_psy = get_hud():GetCustomStatic("hud_psy_level") if device().aspect_ratio ~= saved_aspect then local asp = device().aspect_ratio if math.abs(asp - saved_aspect) > 0.01 then saved_aspect = device().aspect_ratio if custom_static_psy_back then get_hud():RemoveCustomStatic("hud_psy_back") end if custom_static_psy then get_hud():RemoveCustomStatic("hud_psy_level") end custom_static_psy_back = nil custom_static_psy = nil end end if custom_static_psy_back == nil or custom_static_psy == nil then if saved_aspect >= 0.75 then if custom_static_psy_back == nil then get_hud():AddCustomStatic("hud_psy_back", true) custom_static_psy_back = get_hud():GetCustomStatic("hud_psy_back") wnd = custom_static_psy_back:wnd() wnd:SetWndPos(vector2():set(posx, posy)) wnd:SetWndSize(vector2():set(width,height)) --[[wnd:SetHeight(height) wnd:SetWidth(width)]] end if custom_static_psy == nil then get_hud():AddCustomStatic("hud_psy_level", true) custom_static_psy = get_hud():GetCustomStatic("hud_psy_level") wnd = custom_static_psy:wnd() wnd:SetWndPos(vector2():set(posx+p_dx, posy+p_dy)) wnd:SetWndSize(vector2():set(p_width,p_height)) --[[wnd:SetHeight(p_height) wnd:SetWidth(p_width)]] end n_width = p_width else if custom_static_psy_back == nil then get_hud():AddCustomStatic("hud_psy_back", true) custom_static_psy_back = get_hud():GetCustomStatic("hud_psy_back") wnd = custom_static_psy_back:wnd() wnd:SetWndPos(vector2():set(w_posx, w_posy)) wnd:SetWndSize(vector2():set(w_width,w_height)) -[[wnd:SetHeight(w_height) wnd:SetWidth(w_width)]] end if custom_static_psy == nil then get_hud():AddCustomStatic("hud_psy_level", true) custom_static_psy = get_hud():GetCustomStatic("hud_psy_level") wnd = custom_static_psy:wnd() wnd:SetWndPos(vector2():set(w_posx+w_p_dx, w_posy+w_p_dy)) wnd:SetWndSize(vector2():set(w_p_width,w_p_height)) -[[wnd:SetHeight(w_p_height) wnd:SetWidth(w_p_width)]] end n_width = w_p_width end end
new_width = db.actor.psy_health * n_width
if saved_width ~= new_width then if new_width < 0.1 then new_width = 0.1 end --[[custom_static_psy:wnd():SetWidth(new_width)]] custom_static_psy:wnd(): SetWndSize(vector2():set(new_width,w_p_height)) end end[/cut] В файле configs\ui\ui_custom_msgs.xml создаю необходимую секцию [cut] <hud_psy_back x="0" y="0" width="1" height="1" stretch="1" complex_mode="1"> <texture>ui\ui_hud_psy_back</texture> </hud_psy_back> <hud_psy_level x="0" y="0" width="1" height="1" stretch="1" complex_mode="1"> <texture>ui\ui_hud_psy_progress</texture> </hud_psy_level>[/cut] Все необходимые текстуры по адресу имеются и прописаны в файл external.ltx В итоге имею вылет[cut=Лог]Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : d:\games\stalker cop\gamedata\scripts\lex.script:10: attempt to index global 'lex_psybar' (a nil value) [/cut]В чём суть??
Сообщение отредактировал suhar_ - Чт, 27.11.2014, 06:19 |
|
|
Эти 0 пользователя(ей) поблагодарили suhar_ за это полезное сообщение: |
|
|
makdm | Дата: Чт, 27.11.2014, 09:35 | Сообщение # 771 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата suhar_ ( ) В чём суть?? Синтаксическая ошибка. В файле lex_psybar.script
Вот здесь.
Цитата suhar_ ( ) -[[wnd:SetHeight(w_height) wnd:SetWidth(w_width)]]
И ниже по файлу ещё раз
Цитата suhar_ ( ) -[[wnd:SetHeight(w_height) wnd:SetWidth(w_width)]]
Правда не знаю зачем изобретать "велосипед"? С скриптах ЧН и ЗП есть готовый скрипт вывода полоски жизни вертолёта на худ. Взяли готовое, перетащили в отдельный файл, передали в функцию пси-здоровье ГГ и всё видно на худе. Не нравится верхний правый угол вывода - заменили координаты вывода на худ. Не нравится текстура - заменили текстуру. В скрипты лазить вообще не нужно.
Терпение...... И все получится!
Сообщение отредактировал makdm - Чт, 27.11.2014, 09:55 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
CBO6ODA | Дата: Чт, 27.11.2014, 15:41 | Сообщение # 772 |
Отмычка
Пользователи
Сообщений: 30
| sergej5500, да прописал Добавлено (27.11.2014, 15:41) --------------------------------------------- У моего персонажа даже не появляется кнопка говорить... И не смотря на то что он не командир он не говорит: "Иди с главным перетри"
SGM 2.2 CBO6ODA EDITION - 32% (24.04.2017)
|
|
|
Эти 0 пользователя(ей) поблагодарили CBO6ODA за это полезное сообщение: |
|
|
Сахар | Дата: Чт, 27.11.2014, 15:48 | Сообщение # 773 |
Гражданский
Пользователи
Сообщений: 2
| CBO6ODA, Ты через all.spawn НПС создал?
|
|
|
Эти 0 пользователя(ей) поблагодарили Сахар за это полезное сообщение: |
|
|
sergej5500 | Дата: Чт, 27.11.2014, 15:52 | Сообщение # 774 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| CBO6ODA,
Советую изучить спавн НПС. Чтобы непись говорил, у него в логике должна быть секция meet, а в ней параметр use = true.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
CBO6ODA | Дата: Чт, 27.11.2014, 18:00 | Сообщение # 775 |
Отмычка
Пользователи
Сообщений: 30
| Сахар, Верно.
sergej5500, Щас попробую
SGM 2.2 CBO6ODA EDITION - 32% (24.04.2017)
|
|
|
Эти 0 пользователя(ей) поблагодарили CBO6ODA за это полезное сообщение: |
|
|
asd123 | Дата: Чт, 27.11.2014, 18:06 | Сообщение # 776 |
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
| 1. Подскажите, как функцию spawn_object из on_info настроить на 1 раз. Вот логика моего сталкера и привязанный к нему спавн: [logic] active = move@wait_actor on_death = death danger = danger_ignore invulnerable = true
[death] on_info = %+agr_stalker_leader_dead%
[danger_ignore] ignore_distance = 5
[move@wait_actor] move_dest_number = 52298 move_look_vertex = 53681 move_state_when_center = ward_noweap move_state_when_move = run meet = meet invulnerable = true on_info = {+agr_b2_commander_death} move@go_to_batllepoint
[move@go_to_batllepoint] scheme_type = patrol patrol_count_path = 1 patrol_path_1 = 142976 patrol_path_1_state = rush on_patrol_path = 1|move@back_to_readypoint invulnerable = true meet = meet
[move@back_to_readypoint] move_dest_number = 142976 move_look_vertex = 145415 move_state_when_center = ward_noweap move_state_when_move = run invulnerable = true meet = meet on_info = {+agr_b2_commander_death} %=spawn_object(agr_stalker_trader:agr_smart_terrain_2_spawn_point)% on_info2 = {+agr_b2_commander_death} %=spawn_object(agr_stalker_tehnik:agr_smart_terrain_2_spawn_point)%
[meet] abuse = true use = true allow_break = true trade_enable = false meet_on_talking = false
2. Как сделать что-нибуть подобное: (Сообщение от сталкера с иконкой)
3. Думал поколдовать с вертолетами.. Суть вопроса: А будут ли работать на вертолете функции move_dest_number, move_look_vertex, move_state_when_center, move_state_when_move?
У мутантов тоже есть группировки. © Движок X-Ray
Сообщение отредактировал asd123 - Чт, 27.11.2014, 21:00 |
|
|
Эти 0 пользователя(ей) поблагодарили asd123 за это полезное сообщение: |
|
|
CBO6ODA | Дата: Чт, 27.11.2014, 18:24 | Сообщение # 777 |
Отмычка
Пользователи
Сообщений: 30
| Нет, не помогло. Добавлено (27.11.2014, 18:24) --------------------------------------------- А нет помогло, но терь такой вопрос, Разговор с НПС: 1.Чего тебе ? 2.Пока.
Всё, а как прописать ему диалог который я прописывал в файл с текстом ? (Там где все тексты)
SGM 2.2 CBO6ODA EDITION - 32% (24.04.2017)
|
|
|
Эти 0 пользователя(ей) поблагодарили CBO6ODA за это полезное сообщение: |
|
|
denis2000 | Дата: Чт, 27.11.2014, 21:22 | Сообщение # 778 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата asd123 ( ) Подскажите, какую функцию нужно вписать в on_info для спавна нпс по координатам? А то, в xr_logic/effects я нашел только спавн на имени смарта. Для начала такую функцию будет необходимо сделать, прежде чем использовать, например такую: Код function gar_a2_create_zas_killer(actor,npc) alife():create("gar_a2_sp_killer_1",vector():set(99.285308837891,3.0444786548615,-19.401781082153),252062,234) end
Цитата asd123 ( ) Хочу заспавнить на Агропроме, но там ведь нет имен у смартов. Если смарты есть то есть и имена. Иначе не бывает!
Цитата asd123 ( ) Сообщение от сталкера с иконкой Там в качестве аргумента в функцию news_manager.send_tip передается объект отправитель сообщения и его иконка берется в качестве иконки сообщения.
Цитата asd123 ( ) А будут ли работать на вертолете функции move_dest_number, move_look_vertex, move_state_when_center, move_state_when_move? Конечно нет. Не стоит путать схему поведения НПС и вертолетов.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
asd123 | Дата: Чт, 27.11.2014, 22:47 | Сообщение # 779 |
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
| так.. со спавном разобрался кое-как. Но есть одно маааленькое НО - это бесконечный спавн. Все сделал как в других файлах, но НПС спавнятся бесконечно. Вот логика на спавн: on_info = {+agr_b2_commander_death} %=spawn_object(agr_stalker_trader:agr_smart_terrain_2_spawn_point)% on_info2 = {+agr_b2_commander_death} %=spawn_object(agr_stalker_tehnik:agr_smart_terrain_2_spawn_point)%
Еще одна проблема: При спавне вертолета игра вылетает с таким логом:
FATAL ERROR
[error]Expression : motion_ID.valid() [error]Function : CKinematicsAnimated::ID_Cycle [error]File : D:\prog_repository\sources\trunk\Layers\xrRender\SkeletonAnimated.cpp [error]Line : 210 [error]Description : ! MODEL: can't find cycle: [error]Arguments : $editor
У мутантов тоже есть группировки. © Движок X-Ray
Сообщение отредактировал asd123 - Чт, 27.11.2014, 23:22 |
|
|
Эти 0 пользователя(ей) поблагодарили asd123 за это полезное сообщение: |
|
|
Сахар | Дата: Пт, 28.11.2014, 05:00 | Сообщение # 780 |
Гражданский
Пользователи
Сообщений: 2
| asd123, Добра. Цитата asd123 ( ) %=spawn_object Странная функция для спавна НПС вообще то используются такие : Код %=create_squad(название сквада:название смарта)% %=spawn_npc_in_zone(секция кого спаунить:имя зоны в которой спаунить)% Цитата asd123 ( ) это бесконечный спавн Да спавн будет бесконечный так что тебе нужно его отключить например так Код on_info = {+agr_b2_commander_death} % =create_squad(agr_stalker_trader:agr_smart_terrain_2_spawn_point) =create_squad(agr_stalker_tehnik:agr_smart_terrain_2_spawn_point) - agr_b2_commander_death % То есть мы спавним НПС и убираем инфопоршень и мы не можем повторно заспавнить НПС потому-что условие не выполняется и НПС-ы не будут больше спавнится. Цитата asd123 ( ) При спавне Так нельзя делать, потому что его нужно спавнить через all.spawn где-нибудь за локацией, а когда он будет нужен отправить в полёт.
Сообщение отредактировал Сахар - Пт, 28.11.2014, 05:02 |
|
|
Эти 0 пользователя(ей) поблагодарили Сахар за это полезное сообщение: |
|
|
|