Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: 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]
 
makdmДата: Пт, 02.01.2015, 21:56 | Сообщение # 976
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата asd123 ()
Когда вертолет загорелся, звук возгорания не сработал

Цитата asd123 ()
Почему? Опять интервал?


Потому что ещё не доиграл предыдущий звук.
А проигрывать два звука одновременно от одного объекта скрипт xr_sound.script не умеет.

Исправить можно, если принудительно прерывать предыдущий звук и тут же загружать новый.


Терпение......
И все получится!


Сообщение отредактировал makdm - Пт, 02.01.2015, 22:10
 
asd123Дата: Пт, 02.01.2015, 22:25 | Сообщение # 977
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

Цитата makdm ()
принудительно прерывать предыдущий звук и тут же загружать новый.

Именно это я и хочу сделать. Такое ведь возможно?


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




Сообщение отредактировал asd123 - Вс, 11.01.2015, 11:45
 
mambaaaДата: Пт, 02.01.2015, 22:57 | Сообщение # 978
Гражданский
Пользователи
Сообщений: 4
Награды: 0
Репутация: [ 0 ]

asd123, спасибо, помог)
 
makdmДата: Пт, 02.01.2015, 23:02 | Сообщение # 979
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата asd123 ()
Такое ведь возможно?

Возможно.

Прерывание звука:

Код
if xr_sound.sound_table[self.object:id()] ~= nil then
xr_sound.stop_sounds_by_id( self.object:id() )
end


Терпение......
И все получится!
 
asd123Дата: Сб, 03.01.2015, 18:43 | Сообщение # 980
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

Цитата makdm ()
Прерывание звука

В каком файле должна быть эта функция?

Добавлено (03.01.2015, 18:31)
---------------------------------------------
Подскажите, в чем отличия on_game_timer от on_timer?


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




Сообщение отредактировал asd123 - Вс, 11.01.2015, 11:46
 
denis2000Дата: Сб, 03.01.2015, 22:23 | Сообщение # 981
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

asd123,
on_game_timer - интервал времени в секундах игрового времени * тайм фактор
on_timer - интервал времени в микросекундах реального времени


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

Доброй ночи!

Осталось мне совсем чуть чуть и я наконец то закончу свой мод...
Остался последний вопрос:
скрипт телепортации ГГ на другую локацию с привязанными координатами на другой локации (без правки all.spawn)

А еще точку спауна гг в начале игры =)
При запросах в темах КМБ Скрипты и т.д. - точка старта - выдает 404


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

Цитата a4927860 ()
скрипт телепортации ГГ на другую локацию с привязанными координатами на другой локации

Все просто: спавните левел ченджер и телепортируете в него ГГ, после перехода левел ченджер можно удалить.
[cut]
Код
function create_level_changer(
p_story_id, -- STORY_ID нового level_changer (понадобится нам позже)
p_position, -- вектор, координаты точки, в которой будет располагаться центр нового level_changer
p_lvertex_id, -- level_vertext_id  - идентифицируют уровень, на котором будет создан level_changer
p_gvertex_id, -- game_vertext_id    

p_dest_lv, -- level_vertex_id   - идентифицируют уровень, на который level_changer будет перебрасывать игрока
p_dest_gv, -- game_vertex_id
p_dest_pos, -- координаты точки, в которой на новом уровне окажется игрок
p_dest_dir, -- направрение взгляда игрока
p_dest_level, -- название уровня, например "L11_Pripyat"
p_silent -- следует задать 1, чтобы подавить вопрос о смене уровня (автоматический переход)
)
local obj = alife():create("level_changer", p_position, p_lvertex_id, p_gvertex_id)

level.map_add_object_spot(obj.id, "level_changer", "")

local packet = net_packet()
obj:STATE_Write(packet)

-- свойства cse_alife_object
local game_vertex_id     = packet:r_u16()
local cse_alife_object__unk1_f32 = packet:r_float()
local cse_alife_object__unk2_u32 = packet:r_u32()
local level_vertex_id     = packet:r_u32()
local object_flags     = packet:r_u32()
local custom_data     = packet:r_stringZ()
local story_id         = packet:r_u32()
local spawn_story_id    = packet:r_u32()

-- свойства cse_shape
local shape_count     = packet:r_u8()
for i=1,shape_count do
     local shape_type     = packet:r_u8()
     if shape_type == 0 then
     -- sphere
     local center     = packet:r_vec3()
     local radius     = packet:r_float()
     else
     -- box
     local axis_x_x = packet:r_float()
     local axis_x_y = packet:r_float()
     local axis_x_z = packet:r_float()
     local axis_y_x = packet:r_float()
     local axis_y_y = packet:r_float()
     local axis_y_z = packet:r_float()
     local axis_z_x = packet:r_float()
     local axis_z_y = packet:r_float()
     local axis_z_z = packet:r_float()
     local offset_x = packet:r_float()
     local offset_y = packet:r_float()
     local offset_z = packet:r_float()
     end
end

-- свойства cse_alife_space_restrictor
local restrictor_type     = packet:r_u8()

-- свойства cse_level_changer
local dest_game_vertex_id    = packet:r_u16()  
local dest_level_vertex_id     = packet:r_u32()  
local dest_position     = packet:r_vec3()
local dest_direction     = packet:r_vec3()
local dest_level_name     = packet:r_stringZ()
local dest_graph_point     = packet:r_stringZ()
local silent_mode     = packet:r_u8()

packet:w_begin(game_vertex_id)    -- game_vertex_id
packet:w_float(cse_alife_object__unk1_f32)
packet:w_u32(cse_alife_object__unk2_u32)
packet:w_u32(level_vertex_id)    -- level_vertex_id
packet:w_u32( bit_not(193) )    -- object_flags = -193 = 0xFFFFFF3E
packet:w_stringZ(custom_data)
packet:w_u32(p_story_id)    -- story_id
packet:w_u32(spawn_story_id)

packet:w_u8(1)    -- количество фигур
--    packet:w_u8(0)    -- тип фигуры: сфера
--    packet:w_vec3(vector():set(0, 0, 0))  -- sphere_center
--    packet:w_float(3.0)
packet:w_u8(1)    -- тип фигуры: box
packet:w_float(2)    -- axis_x_x
packet:w_float(0)    -- axis_x_y
packet:w_float(0)    -- axis_x_z
packet:w_float(0)    -- axis_y_x
packet:w_float(4)    -- axis_y_y
packet:w_float(0)    -- axis_y_z
packet:w_float(0)    -- axis_z_x
packet:w_float(0)    -- axis_z_y
packet:w_float(4)    -- axis_z_z
packet:w_float(0)    -- offset_x
packet:w_float(0)    -- offset_y
packet:w_float(0)          -- offset_z

packet:w_u8(3)    -- restrictor_type

packet:w_u16(p_dest_gv)    -- destination game_vertex_id
packet:w_u32(p_dest_lv)    -- destination level_vertex_id
packet:w_vec3(p_dest_pos)    -- destination position
packet:w_vec3(p_dest_dir)    -- destination direction (направление взгляда)
packet:w_stringZ(p_dest_level)    -- destination level name
packet:w_stringZ("start_actor_99") -- some string, always const
packet:w_u8(p_silent)    -- 1 for silent level changing

packet:r_seek(0)
obj:STATE_Read(packet, packet:w_tell())

-- news_manager.send_tip(db.actor, "LC creation finished", nil, nil, 30000)
end

     Для shape типа "box" загрузка координат методом packet:r_matrix() окончилась неудачей. Я подозреваю, что не был прочитан вектор "offset", но точной уверенности нет, поэтому пока остановился на покомпонентной выборке и сохранении координат.

Часть 2. Создание точек перехода

Теперь следует написать функции создания нужных точек перехода и подключить их к игре. Сами функции просты:

function exit_monolit()
if (not has_alife_info("freeplay_activated1")) then
     create_level_changer(11410, vector():set(-13.26, 47.71, 46.57), 200, 2417,
     162109,
                         2384,
     vector():set( 375.615, 0.224, 27.737 ),
     vector():set(     0.0, 0.0  ,  0.0 ),
     "L12_Stancia",
     1)

     db.actor:give_info_portion("freeplay_activated1")
end

-- создается переход из ЧАЭС в Припять
create_chaes2pripyat_exit()

-- актер перебрасывается в level_changer, возвращающий его на ЧАЭС, ко входу в бункер
db.actor:set_actor_position( vector():set(-13.26, 47.71, 46.57) )
end

function refuze_o_sozn()
if (not has_alife_info("freeplay_activated2")) then
     create_level_changer(21410, vector():set(946.872, 6.0, 167.66), 240852, 2637,
     472710,
     2280,
     vector():set( 1062.15, -0.0982, -3.512 ),
     vector():set(    0.0 ,  0.0   , -1.0 ),
     "L12_Stancia",
     1)

     db.actor:give_info_portion("freeplay_activated2")
end

-- создается переход из ЧАЭС в Припять
create_chaes2pripyat_exit()

-- актер перебрасывается в level_changer, возвращающий его к правым воротам ЧАЭС
db.actor:set_actor_position( vector():set(946.872, 6.0, 167.66) )
end

function create_chaes2pripyat_exit()
-- создается переход из ЧАЭС в Припять
if (not has_alife_info( "exit_chaes2pripyat_created" )) then
     create_level_changer(31410, vector():set( 917.35, 0.419, -316.35 ), 403866, 2401,
     73868,
     2117,
     vector():set( 31.3, 3.0, 240.0 ),
     vector():set(  0.0, 0.0,  -1.0 ),
     "L11_Pripyat",
     0)

     db.actor:give_info_portion("exit_chaes2pripyat_created")
end
end
[/cut]

Цитата a4927860 ()
А еще точку спауна гг в начале игры

Точка спавна ГГ в начале игры задается в all.spawn:
[cut]
Код
[982]
; cse_abstract properties
section_name = actor
name = zaton_actor
position = 256.240051269531,19.8124237060547,550.824279785156
direction = -0.0120869996026158,2.81339907646179,-0.0158249996602535
s_flags = 0x29

; cse_alife_object properties
game_vertex_id = 292
distance = 38.5
level_vertex_id = 1405060
object_flags = 0xffffffbf

; cse_visual properties
visual_name = actors\stalker_neutral\stalker_neutral_1

; cse_alife_creature_abstract properties
g_team = 0
g_squad = 0
g_group = 0
health = 1
dynamic_out_restrictions =     
dynamic_in_restrictions =     

upd:health = 1
upd:timestamp = 0xc2ba3333
upd:creature_flags = 0x99
upd:position = 256.240051269531,19.8124237060547,550.824279785156
upd:o_model = 0
upd:o_torso = 2.81339907646179,-0.0120869996026158,0
upd:g_team = 0
upd:g_squad = 0
upd:g_group = 0

; cse_alife_trader_abstract properties
money = 15000
trader_flags = 0
character_profile = actor
cse_alife_trader_abstract__unk1_u8 = 1

; cse_ph_skeleton properties

; cse_alife_creature_actor properties

upd:actor_state = 0
upd:actor_accel_header = 0
upd:actor_accel_data = 0
upd:actor_velocity_header = 0
upd:actor_velocity_data = 0
upd:actor_radiation = 0
upd:actor_weapon = 215
upd:num_items = 0

[/cut]


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

Цитата denis2000 ()
Точка спавна ГГ в начале игры задается в all.spawn


Как я и боялся. Спасибо!

Цитата denis2000 ()
Все просто: спавните левел ченджер и телепортируете в него ГГ, после перехода левел ченджер можно удалить.


а скриптом без телепортации в точку перехода это не сделать?
а то получится что герой будет проходить через места спауна мобов которые еще не должны спаунится...
 
asd123Дата: Вс, 04.01.2015, 04:09 | Сообщение # 985
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

[cut=Видео][/cut]
Как сделать такой же маршрут в ЗП для вертолета? То есть, чтобы он не останавливался, а летел и летел. И чтобы немного наклонялся в бок при повороте (24-26 секунды)


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




Сообщение отредактировал asd123 - Вс, 04.01.2015, 14:15
 
denis2000Дата: Вс, 04.01.2015, 14:54 | Сообщение # 986
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата a4927860 ()
а скриптом без телепортации в точку перехода это не сделать?

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

Цитата asd123 ()
Как сделать такой же маршрут в ЗП для вертолета?

Делайте замкнутый путь.


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

В all.spawn в way файлах нашел строку, но не знаю одного момента:
p5:links = p6(1) - что означает число в скобках?


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




Сообщение отредактировал asd123 - Вс, 04.01.2015, 21:14
 
mambaaaДата: Вс, 04.01.2015, 19:05 | Сообщение # 988
Гражданский
Пользователи
Сообщений: 4
Награды: 0
Репутация: [ 0 ]

добрый день, мододелы:)
[cut noguest]у меня к Вам вопрос)
считаю, что игра слишком лёгкая, когда в руки попадает гаус:)
убрал её из торговли и т.д.
вот сам вопрос)
как и в каких диалогах что править, что бы после того, как я подобрал гаус у бойца Монолита, с полковником сразу встал диалог о том, что это Гаус-пушка, что бы он не отсылал меня узнать про неё и т.д а просто отобрал и появился диалог, который идёт по сюжету"мол может это и есть причина падения, только мощи у неё недостаточно" что то наподобие, точно не помню)

заранее, премного благодарен:)
надеюсь, меня поняли :Р[/cut]
 
makdmДата: Вс, 04.01.2015, 20:11 | Сообщение # 989
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата mambaaa ()
надеюсь, меня поняли :Р

Абсолютно не поняли.
Если вы пишите про ваше прохождениеигры, то после того как Кардан вернет отремонтированный Гаусс, просто пихаем его в первый попавшийся труп и забываем о его существовании.
Если вы делаете дополнение к игре,то просто уберите диалог у Кардана про выдачу патронов для Гаусс пушки.


Терпение......
И все получится!


Сообщение отредактировал makdm - Вс, 04.01.2015, 20:21
 
asd123Дата: Вс, 04.01.2015, 20:57 | Сообщение # 990
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

Цитата mambaaa ()
добрый день, мододелы:) [ Читать далее ]

А-а-а laugh Диалоги хотите убрать. Так-с.. это вот сюда, теперь налево.. Кхм. Леший и его группа сводят с ума.. biggrin
Попробуйте мое предположение. Идём по пути: gamedata/configs/gameplay/dialogs_pripyat.xml и там находите вот такую часть диалога:
Код
    <dialog id="pri_a17_military_colonel_kovalski_a23_about_gauss_labx8">
                     <has_info>zat_a23_actor_has_gauss_rifle_documentation</has_info>
                     <dont_has_info>pri_a23_dialog_about_gauss_labx8_end</dont_has_info>

И в строку has_info добавляем вот такое взамен старого:
Код
<has_info>pri_a17_military_base_commander_task_dialog_end</has_info>

Должно сработать. Типо, вместо инфопоршня на то, что актёр имеет документы, вы имеете инфопорцию на то, что диалог о сообщении про найденное неизвестное оружие в ходе операции был закончен.
Не проверял, реакции не знаю. oops Тестируйте smile Если имеете сохранение перед диалогом с Ковальским о проведенной операции, то смело загружайте его и пробуйте сдать задание.

Добавлено (04.01.2015, 20:57)
---------------------------------------------
Протестировал, всё работает. Однако.. задание теперь будет засчитано сразу после отправления Ковальским к Тарасову..
Ну, думаю.. Вам это не составит больших проблем)


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




Сообщение отредактировал asd123 - Пн, 05.01.2015, 20:22
 
Поиск: