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

Цитата asd123 ()
Как убрать удаление оружия после смерти НПС? На Кордоне лидеру блокпоста дал пулемёт, и после смерти он удаляется. Очень часто приводит к вылету.

Открыть файл gamedata\configs\misc\death_items_control.ltx и удалить все строки после [death_items_control]

Или в файле death_manager.script удалить в функции function keep_item(npc, item) строки

if not check_death_item(section) then
alife():release(alife():object(item:id()),true)
return
end


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


Сообщение отредактировал makdm - Вт, 30.12.2014, 23:37
 
asd123Дата: Ср, 31.12.2014, 05:39 | Сообщение # 947
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

makdm, Помогло, спасибо.

Добавлено (31.12.2014, 05:39)
---------------------------------------------
Подскажите, как у вертолета убрать из врагов ГГ ? А то мною созданный вертолет меня задолбал.. только появляется, и давай меня гасить.. Хотя во врагах у него прописаны мутанты и враждебные бандиты, которых он вообще игнорирует..


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




Сообщение отредактировал asd123 - Вс, 11.01.2015, 11:52
 
makdmДата: Ср, 31.12.2014, 10:06 | Сообщение # 948
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата asd123 ()
Хотя во врагах у него прописаны мутанты и враждебные бандиты, которых он вообще игнорирует..

Вертолёт в ЗП не был использован, поэтому скрипты, отвечающие за атаку, разрабами не правились и остались такими же, как в ЧН.
Вертушке можно задать в виде цели три параметра:
1. actor - атакует ГГ
2. all - атакует всех сталкеров и ГГ
3. story_id объекта - атакует объект с заданным story_id ( нужно поправить скрипты, так как в ЧН story_id - это числовая метка SID, а не строковая, как в ЗП )

Поэтому вертолёт не знает, что такое бандиты и что такое монстры.
Нужно переписывать скрипт heli_fire.script, я это делал во Времени Альянса. Там вертолёт атакует не только сталкеров и монстров , но и ведёт стрельбу по БТР и по другим вертолётам. Можете там посмотреть, как это сделать.

Если для вас это сделать сложно, то можно отключить стрельбу по ГГ, но оставить стрельбу по сталкерам.
Для этого в логике пропишите

enemy = all

В скрипте heli_fire.script в методе function heli_fire:update_enemy_arr() удалить следующие строки

if heli:isVisible( db.actor ) and random_choice( false, true) or db.heli_enemy_count==0 then
if distance_2d( self.obj:position(), db.actor:position() ) <= min_dist2D*2 then
self.enemy = db.actor
min_dist2D = distance_2d( self.obj:position(), db.actor:position() )
end
end

ВСЕХ С НАСТУПАЮЩИМ НОВЫМ ГОДОМ!!!


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


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

makdm, А реально ли вертолету назначить группировку? Был такой мод на ТЧ, в котором вертолеты летают парами, с логикой на атаку любой угрозы, и атакующие враждебные группировки.

А еще: Вариант ли сделать вертолет как транспорт для ГГ ? Пусть это будет сложно, но ведь вариант? Видел такую фишку в Simbion`е на ТЧ.


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




Сообщение отредактировал asd123 - Вс, 11.01.2015, 11:53
 
a4927860Дата: Ср, 31.12.2014, 13:40 | Сообщение # 950
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

Нож метательный вместо ножа обычного.

Заменить нож скриптом не предстовляет трудности (глубокий поклон SGM), метательный нож хорошо выполняет свои основные функции кидается, висит в 1м слоте и т.д. однако есть несколько проблем:
1) после загрузки сохранения он пропадает
2) при попытке заменить его на другой нож он остается на месте при этом новый нож спаунится в инвентарь как и активатор старого

На сколько я понял проблема в том что класс II_BOLT создается после удаления заного.
Посоветуйте пожалуйста как можно эту проблему обойти?

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

Noxer, В уроках есть файлы с выполненным заданием, они точно работают.


Цитата a4927860 ()
А реально ли вертолету назначить группировку?

Вертолет не НПС и назначить ему группировку по общей схеме не получиться, но в его скриптах принципиально возможно запретить ему атаковать объекты какой-то конкретной группировки.
Цитата asd123 ()
Был такой мод на ТЧ, в котором вертолеты летают парами, с логикой на атаку любой угрозы, и атакующие враждающие группировки.

Был такой мод для ТЧ и назывался AI вертолётов, чисто теоретически он модифицируем для ЗП.
Цитата asd123 ()
Вариант ли сделать вертолет как транспорт для ГГ ?

Без правок движка, красиво не получиться.


Цитата a4927860 ()
На сколько я понял проблема в том что класс II_BOLT создается после удаления заного.
Посоветуйте пожалуйста как можно эту проблему обойти?

Никак скриптами против движкового спавна вы не навоюете или править движек или придумать принципиально иную схему работы.


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

denis2000, объясните: При попадании в вертолет, последний не подает звуков ранения, хотя mute = false стоит.
Как описал makdm, разрабы не меняли ничего после ЧН, а значит звук должен быть.


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




Сообщение отредактировал asd123 - Ср, 31.12.2014, 19:43
 
roma_ufДата: Ср, 31.12.2014, 19:52 | Сообщение # 953
Гражданский
Пользователи
Сообщений: 17
Награды: 0
Репутация: [ -10 ]

Цитата sergej5500 ()
Открыть файл objekt в Актор Эдитор СДК 0.7. Настроить анимации

Я так и не понял, как добавить текстуру в формате object в СДК? Вопрос конечно же глупый, но уделите минуту на ответ на мой вопрос.
 
sergej5500Дата: Ср, 31.12.2014, 20:50 | Сообщение # 954
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

roma_uf,

С помощью СДК можно определить, как называются файлы текстур. Узнав, как называются текстуры, можно найти их в моде-исходнике.

На скрине, который я показал, видно, что к модели долговца приписаны две текстуры. act_face_mask_03 и act_stalker_dolg_7.
 
roma_ufДата: Чт, 01.01.2015, 00:37 | Сообщение # 955
Гражданский
Пользователи
Сообщений: 17
Награды: 0
Репутация: [ -10 ]

Цитата denis2000 ()
Урок 26a (Автор denis2000)
Задача: Снятия денег с трупов в ЗП по алгоритму SGM.
Файл с выполненным заданием

Попытался сделать также, как в примере. В итоге при обыске трупа вылет с таким логом:
[cut noguest]FATAL ERROR

[error]Expression : !m_error_code
[error]Function : raii_guard::~raii_guard
[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
[error]Line : 748
[error]Description : ...call of pripyat\gamedata\scripts\xr_motivator.script:355: attempt to index global 'use_corps' (a nil value)

stack trace:
[/cut]
Перепроверил, вроде все сделал правильно, но почему-то крашится. Правил на Steam лицензии.

Ошибка синтаксиса в скрипте use_corps.script, ищите и исправляйте. denis2000
 
asd123Дата: Чт, 01.01.2015, 01:49 | Сообщение # 956
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

Можно ли спавнить вертолёт несколько раз по его story_id ?

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


 
СахарДата: Чт, 01.01.2015, 05:40 | Сообщение # 957
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

asd123, Нет, у всех объектов должен быть разный story id.

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

Цитата asd123 ()
При попадании в вертолет, последний не подает звуков ранения, хотя mute = false стоит.
Как описал makdm, разрабы не меняли ничего после ЧН, а значит звук должен быть.

Чтобы он "дожен быть" в скрипте bind_heli.script в функции heli_binder:on_hit попробуйте расскоментировать строку:
Код
--xr_sound.set_sound_play(self.object:id(), self.snd_hit)


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
СахарДата: Чт, 01.01.2015, 15:20 | Сообщение # 959
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

Всем привет. Раз уж мы затронули тему вертолётов то у меня такой вопрос. Прописал вертушки врагом ГГ, а вертолёт всё равно летает по патрульным путям и стреляет в меня только если я нахожусь на пути его следования и то даже если я нахожусь в «мёртвой зоне». Это так задумано или я про какой-то параметр не знаю?

 
makdmДата: Чт, 01.01.2015, 15:41 | Сообщение # 960
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Сахар,вот почитайте урок по логике вертолёта. Я его писал для другого сайта. Может вам в чём-то и поможет.

[cut noguest=Урок по логике вертолёта]
Делаем квест с вертолётом. Задача: Сбить вертолёт выстрелом с гранатомёта.

Причём вертолёт после получения хита начинает гореть, затем пикировать, пилоты пытаются выравнить вертолёт, кричат в эфире, но вертушка не слушается, при

столкновении с землёй разваливается на части и происходит взрыв. На месте падения пожар и два тела пилотов.

Всё это делается в логике вертолёта.

Подготовим функцию, которая будет проверять насенение хита из РПГ и запишем её в файл xr_conditions.script.

function actor_active_rpg(actor, npc)
local rpg_section = "wpn_rpg7"
local actor_weapon = actor:active_item ()
return (actor_weapon ~= nil) and actor_weapon:section() == rpg_section
end

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

function heli_see_actor(actor, obj)
return actor ~= nil and obj:get_helicopter():isVisible( actor )
end

В файле xr_effects.script должны быть следующие функции.

Функция, поджигающая вертушку

function heli_start_flame(actor, npc)
bind_heli.heli_start_flame( npc )
end

Функция, разрушающая вертушку

function heli_die(actor, npc)
bind_heli.heli_die( npc )
end

Функция, отыгрывающая анимацию на месте падения ( взрыв и пожар )

function run_cam_effector(actor, npc, p)
if p[1] then
local loop, num = false, (1000 + math.random(100))
if p[2] and type(p[2]) == "number" and p[2] > 0 then
num = p[2]
end
if p[3] and p[3] == "true" then
loop = true
end
level.add_cam_effector("camera_effects\\" .. p[1] .. ".anm", num, loop, "")
end
end

Функция, спавна мёртвых пилотов

function spawn_corpse(actor, obj, p)
--' p[1] - секция кого спаунить
--' p[2] - имя патрульного пути где спаунить.
local spawn_sect = p[1]
local path_name = p[2]
local ptr = patrol(path_name)
local index = p[3] or 0
local se_obj = alife():create(spawn_sect, ptr:point(index),ptr:level_vertex_id(0),ptr:game_vertex_id(0))
se_obj:kill()
end

Теперь возьмём файл анимации взрыва, например файл из ЧН kat_heli_down.anm, и поместим его по адресу gamedata\anims\camera_effects

Дальше сделаем две секции спавна пилотов например [pilot_1] и [pilot_2]. Соответственно присвоим им класс и пропишем в character_desc_... Т.е. делаем всё,

как для спавна НПС через скрипт.

Установим звук, который будет слышен при падении вертушки. Например aes_choper_crush из ТЧ.
Соответственно звук должен быть прописан в конфигурационном файле script_sound.ltx, а в файле xr_effects.script должна быть функция для проигрывания звука.

Например для ЗП - это функция play_sound. Для ТЧ функция может быть другой.

Теперь all.spawn

Здесь нужно понимать, что вертушка не привязана к AI-сетке и как следствие "не видит" геометрию локации, пока не будет разрушена.

Прописываем начальную точку вертушки (можно прописать прямо под точкой атаки, опустив вертушку под локацию метров на 30).

Пусть это точка heli_wait_quest_move

Вписываем точку на которой будет висеть вертушка при её атаке. Лучше сделать повыше - метров 40, чтобы лучше пикировала. Назовём точку heli_attack_gg_move

Дальше выбираем точку падения вертушки ( лучше брать какой-нибудь косогор или здание, чтобы создать эффект столкновения ) и точку куда будет направлен нос

вертолёта при падении. Пусть это будут точки heli_crash_move и heli_crash_look. В точке heli_crash_move поставим сигнал p0:name = wp00|sig=crash

Рядом с точкой падения heli_crash_move ( метрах в трёх от неё ) сделаем две точки, на которых будут лежать тела пилотов. Например pilot_1_way и pilot_2_way.

Сигналом к началу квеста будет выдача инфопоршион start_quest.

С подготовкой закончили теперь сама логика вертушки.

[logic]
active = heli_move@idle
on_hit = hit

[hit]
on_info = {=actor_active_rpg()} %+black_hawk_down% ;если получен хит из РПГ - начинать гореть и падать

;
;Сидим тихо, никого не трогаем под локацией. Мы, как бы, ещё не прилетели.
;

[heli_move@idle]
path_move = heli_wait_quest_move ;отличается от heli_attack_gg_move по оси Y на 70 метров вниз
path_look = actor
max_velocity = 20
upd_vis = 3
engine_sound = false
immortal = true
invulnerable = true
enemy = nil
use_mgun = false
use_rocket = false
on_info = {+start_quest} heli_move@find_gg ;Квест начался, включаем звук моторов, взлетаем и занимаем исходную позицию.

;
;Режим ожидания.
;Если мы ГГ не видим - боезапас не расходуем. Ждём когда появится или вылезет из укрытия.
;
;
[heli_move@find_gg]
path_move = heli_attack_gg_move
path_look = actor
max_velocity = 20
upd_vis = 3
engine_sound = true
immortal = true
invulnerable = true
enemy = actor
use_mgun = false ;запрещаем использовать пулемёт
use_rocket = false ;Запрещаем использовать ракеты
;
on_info = {+black_hawk_down} heli_move@crash %=heli_start_flame% ;Получили хит из гранатомёта, начинаем падать и гореть.
on_info2 = {=heli_see_actor} heli_move@attack ;Увидели ГГ начинаем атаковать

;
;Атакуем ГГ. Если потеряли ГГ из виду, то снова переходим в режим ожидания
;

[heli_move@attack]
path_move = heli_attack_gg_move ;Путь на котором висит вертушка
path_look = actor ;Направление носа вертушки
max_velocity = 20 ;Скорость полёта
upd_vis = 3 ;Время повторного поиска цели при потере её видимости ( если не нашли через 3 секунды - ищем новую цель).
engine_sound = true ;Звук двигателя включён
immortal = true ;Отключаем разрушение вертолёта, даже если потеря "здоровья" вертушки равна 100%
invulnerable = true ;Включена неуязвимость вертолёта
enemy = actor ;Атаковать только Главного Героя
use_mgun = true ;Разрешаем использовать пулемёт
use_rocket = false ;Запрещаем использовать ракеты
;
on_info = {+black_hawk_down} heli_move@crash %=heli_start_flame% ;Получили хит из гранатомёта, начинаем падать и гореть.
on_info2 = {!heli_see_actor} heli_move@find_gg ;Потеряли ГГ из виду - переходим в режим ожидания

;
;Нас сбили начинаем падать
;

[heli_move@crash]
path_move = heli_crash_move ;точка падения
path_look = heli_crash_look ;направление носа при падении
max_velocity = 120 ;Увеличиваем скорость падения
upd_vis = 3
engine_sound = true
immortal = true
enemy = nil ;все враги отменяются - нам уже ни до них
use_mgun = false ;стрельба из пулемёта - отменяется
use_rocket = false ;стрельба ракетами - отменяется
on_game_timer = 40 | %=play_sound(aes_choper_crush)% ;Через пять секунд после начала падения проигрываем звук из кабины пилотов
;
;если вертушка в точке падения - разрушаем вертушку, производим взрыв и пожар, выбрасываем пилотов из кабины
;
on_signal = crash | nil %=heli_die =run_cam_effector(kat_heli_down) =spawn_corpse(pilot_1:pilot_1_way) =spawn_corpse(pilot_2:pilot_2_way)%

Удачного модинга!
makdm[/cut]


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


Сообщение отредактировал makdm - Чт, 01.01.2015, 15:46
 
Поиск: