Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: 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]
 
suhar_Дата: Ср, 26.11.2014, 21:01 | Сообщение # 766
Бывалый
Пользователи
Сообщений: 106
Награды: 0
Репутация: [ 0 ]

Проблема в работе функции 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
 
CBO6ODAДата: Ср, 26.11.2014, 21:58 | Сообщение # 767
Отмычка
Пользователи
Сообщений: 30
Награды: 6
Репутация: [ 65 ]

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)
 
sergej5500Дата: Ср, 26.11.2014, 22:18 | Сообщение # 768
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

CBO6ODA,

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

suhar_, Невозможно применить метод SetHeight к объекту get_hud():GetCustomStatic():wnd() за не имением у него такового. Пробуйте SetWndSize(vector2():set(width,height))

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

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
 
makdmДата: Чт, 27.11.2014, 09:35 | Сообщение # 771
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата 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
 
CBO6ODAДата: Чт, 27.11.2014, 15:41 | Сообщение # 772
Отмычка
Пользователи
Сообщений: 30
Награды: 6
Репутация: [ 65 ]

sergej5500, да прописал

Добавлено (27.11.2014, 15:41)
---------------------------------------------
У моего персонажа даже не появляется кнопка говорить...
И не смотря на то что он не командир он не говорит: "Иди с главным перетри"



SGM 2.2 CBO6ODA EDITION - 32% (24.04.2017)
 
СахарДата: Чт, 27.11.2014, 15:48 | Сообщение # 773
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

CBO6ODA, Ты через all.spawn НПС создал?

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

CBO6ODA,

Советую изучить спавн НПС. Чтобы непись говорил, у него в логике должна быть секция meet, а в ней параметр use = true.
 
CBO6ODAДата: Чт, 27.11.2014, 18:00 | Сообщение # 775
Отмычка
Пользователи
Сообщений: 30
Награды: 6
Репутация: [ 65 ]

Сахар, Верно.

sergej5500, Щас попробую



SGM 2.2 CBO6ODA EDITION - 32% (24.04.2017)
 
asd123Дата: Чт, 27.11.2014, 18:06 | Сообщение # 776
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

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
 
CBO6ODAДата: Чт, 27.11.2014, 18:24 | Сообщение # 777
Отмычка
Пользователи
Сообщений: 30
Награды: 6
Репутация: [ 65 ]

Нет, не помогло.

Добавлено (27.11.2014, 18:24)
---------------------------------------------
А нет помогло, но терь такой вопрос,
Разговор с НПС:
1.Чего тебе ?
2.Пока.

Всё, а как прописать ему диалог который я прописывал в файл с текстом ? (Там где все тексты)



SGM 2.2 CBO6ODA EDITION - 32% (24.04.2017)
 
denis2000Дата: Чт, 27.11.2014, 21:22 | Сообщение # 778
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата 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?

Конечно нет. Не стоит путать схему поведения НПС и вертолетов.


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

так.. со спавном разобрался кое-как. Но есть одно маааленькое НО - это бесконечный спавн. Все сделал как в других файлах, но НПС спавнятся бесконечно. Вот логика на спавн:
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
 
СахарДата: Пт, 28.11.2014, 05:00 | Сообщение # 780
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

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
 
Поиск: