Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Форум » Моды для игр » Модостроение » Модостроение. Спавн и логика
Модостроение. Спавн и логика
denis2000Дата: Пн, 10.10.2011, 21:20 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Спавн и логика

Создание объектов на локации и логика поведения этих объектов

Если у вас появились вопросы по созданию динамических объектов в игре (НПС, монстры, аномалии, и т.п.) и настройке их "поведения". Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


Много интересного материала здесь (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)", ее и надо расскомментировать, должно получиться вот так:
Code
function abort(fmt, ...)
                    local reason = string.format(fmt, ...)
                    error_log(reason)
end

Вот для примера два одинаковых вылета, первый с функцией по умолчанию, второй - с поправленной функцией

Первый:
Code
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)

Второй:
Code
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 по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки.
Помните чем подробнее вопрос, тем точнее ответ.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Ср, 06.01.2016, 00:31 | Сообщение # 1246
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Цитата Shyr ()
но такого файла в игре нет, я специально даже переустановил игру (работает)


Игра считывает названия файлов из строки

specific_characters_files = character_desc_general, character_desc_zaton, character_desc_pripyat, character_desc_jupiter, character_desc_underpass, ...

в файле gamedata\configs\system

Если файл с вашим неписем называется igor, то и писать надо правильно. Как то так

specific_characters_files = character_desc_general, character_desc_zaton, character_desc_pripyat, character_desc_jupiter, character_desc_underpass, igor

Кстати, файл с профилем непися igor_profile тоже регистрируется в файле system.

Секция

[profiles]
;список xml файлов, содержаих профили сталкеров и торговцев
files = npc_profile, ...
 
ShyrДата: Пт, 08.01.2016, 12:30 | Сообщение # 1247
Отмычка
Пользователи
Сообщений: 38
Награды: 4
Репутация: [ 20 ]

sergej5500, все это проверил, везде все подключено, все равно выдает ту же ошибку.
 
denis2000Дата: Пт, 08.01.2016, 18:22 | Сообщение # 1248
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Shyr, Проблема не в том, что все везде подключено, а в том что подключено не существующее!

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

Добрый день!
В Зове Припяти есть ряд отрядов, прописанных не месте с их лидером. Например, на КПП и складе контейнеров (Юпитер). Где можно их найти и заменить на другие(скажем, сменить группировку)?


Проект в разработке – "Болотные легенды"

Сообщение отредактировал prohodchik - Сб, 16.01.2016, 20:57
 
denis2000Дата: Вс, 17.01.2016, 11:58 | Сообщение # 1250
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата prohodchik ()
Где можно их найти и заменить на другие(скажем, сменить группировку)?

Посмотрите, например в SDK имена смарт-терейнов в этих местах и отредактирует кто будет спавниться там в начале игры в simulation.ltx


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
gamerДата: Вс, 28.02.2016, 19:05 | Сообщение # 1251
Новичок
Пользователи
Сообщений: 82
Награды: 0
Репутация: [ 0 ]

Подскажите сюда можно поставить любые вертексы локации ,?
[cut noguest]--[[ -----------------------------------------------------------------------------------------------
File : slx_horror.script
Build : ver. 0.1
Description : Часик Ужаса
Copyright : 2009 ©Меченый(Стрелок) aka Golubev Anton
Author : Меченый(Стрелок)
--]] -----------------------------------------------------------------------------------------------

mutants = {
"bloodsucker_hell",
"boar_hell",
"burer_hell",
"snork_hell",
"rat_hell",
"tushkano_hell",
"zanoza_hell",
"zombie_hell",
"zombie_ghost_hell",
"gigant_hell",
"psy_dog_hell",
"pseudodog_hell",
"poltergeist_hell",
"pogrom_hell",
"lurker_hell",
"fracture_hell",
"zombie_kamikaze_hell",
"flesh_hell",
"dog_hell",
"controller_hell",
"chimera_hell",
"cat_hell",
"ghoul_hell",
"poltergeist_fire_hell"
}

remove_hell = true

function start_prehell()
if level.name() == "military" then
if ars_mod.is_sleep_active() then
ars_mod.stopper()
end
--\\*Блик
level.add_pp_effector("teleport.ppe", 2006, false)
--\\*Сирена
local sound = sound_object([[meceniy\hell\hellsilent_hill_alarm]])
local snd_obj = sound_object([[meceniy\hell\hellsilent_hill_alarm]])
--\\*Звук толчка
xr_sound.set_sound_play(db.actor:id(), "blowout_begin")
--\\*Проигрываем Сирену
sound:play_at_pos(db.actor, db.actor:position(), 0)
snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 2.5)
--\\*Толчек
level.add_cam_effector("camera_effects\\earthquake.anm", 1974, true, "")
--\\*Выдаём рандомное сообщение
start_hell_news()
--\\*Задаём погоду
level.set_weather("default_cloudy",true)
--\\*Проигрываем эффекты выброса
level.set_weather_fx("marsh_fx_surge_day_1")
--\\*Запускаем таймер до старта основной функции
ars_cop.g_start_timer("hell_time",0,0,math.random(4,10))
else
news_manager.send_tip(db.actor, "%c[255,160,160,160]".."Общий канал:".."\\n".."%c[255,255,128,128]Внимание! С минуты на минуту наступит Час Ужаса! Если вы забрели на Милитари, ищите укрытие понадёжнее!".."".."\n", nil, nil, 30000)
if not ars_cop.is_g_timer_exists("pre_hell_time") then
ars_cop.g_start_timer("pre_hell_time",0, 48 + math.random(-4,4), 0)
end
end
end
function start_hell()
if level.name() == "zaton" then
level.add_pp_effector("teleport.ppe", 2006, false)
local section = mutants[math.random(table.getn(mutants))]
xr_sound.set_sound_play(db.actor:id(), "blowout_begin")
level.set_weather_fx("marsh_fx_surge_day_1")
level.add_pp_effector("snd_shock.ppe", 20080401, false)
level.add_pp_effector("psychic.ppe", 20081017, false)
level.add_pp_effector("psy_antenna.ppe", 20081018, false)
level.add_pp_effector("psi.ppe", 20081019, false)
level.add_pp_effector("alcohol.ppe", 20081020, false)
level.add_cam_effector("camera_effects\\shell_shock.anm", 20080501, false, "")
level.add_pp_effector("snd_shock.ppe", 20080401, false)
level.set_pp_effector_factor(20080401, 0, 1)
hell_memoryhit()
horrorspawner(math.random(4,8))
horror_nearest_spawn(section,math.random(4,8))
hell_news()
hell_spawn_phantom()
ars_cop.g_start_timer("hell_time_end",0,0,math.random(10,15))
end
end
function stop_hell()
level.add_pp_effector("teleport.ppe", 2006, false)
level.remove_pp_effector(20080401)
level.remove_pp_effector(20081017)
level.remove_pp_effector(20081018)
level.remove_pp_effector(20081019)
level.remove_pp_effector(20081020)
level.remove_cam_effector(1974)
level.remove_cam_effector(20080501)
level.set_weather("default_cloudy",true)
xr_sound.set_sound_play(db.actor:id(), "blowout_begin")
level.set_weather_fx("marsh_fx_surge_day_1")
remove_hell_mutant()
if not ars_cop.is_g_timer_exists("pre_hell_time") then
ars_cop.g_start_timer("pre_hell_time",0, 36 + math.random(-4,4), 0)
end
end

function remove_hell_mutant()
if remove_hell then
for i=1,63535 do
local hell_m = level.object_by_id(i)
if hell_m~=nil then
if IsMonster(hell_m) then
if string.find(hell_m:section(),"_hell") then
alife():release(alife():object(hell_m:id()), true)
end
end
end
end
end
end

function horror_nearest_spawn(section,count)
local noobposition = db.actor:position()
local xnoob = math.random(1,90)
local znoob = math.random(1,90)
local nmpos = vector():set( noobposition.x + xnoob, noobposition.y + 4, noobposition.z + znoob )
for i=1,count do
alife():create(section, nmpos, db.actor:level_vertex_id(), db.actor:game_vertex_id())
end
end

function horrorspawner(count)
local section = mutants[math.random(table.getn(mutants))]
local gv = vertexess[level.name()]["gvid"]
local lv = math.random(vertexess[level.name()]["lvid"])
for ind = 1, count do
alife():create(section, level.vertex_position(lv), lv, gv)
end
end
function start_hell_news()
local horrornew = math.random(1,8)
if horrornew == 1 then new1() end
if horrornew == 2 then new2() end
if horrornew == 3 then new3() end
if horrornew == 4 then new4() end
end
function new1()
news_manager.send_tip(db.actor, "%c[255,160,160,160]".."Общий канал:".."\\n".."%c[255,255,128,128]Доктор, пора... Включайте...".."".."\n", nil, nil, 30000)
end
function new2()
news_manager.send_tip(db.actor, "%c[255,160,160,160]".."Общий канал:".."\\n".."%c[255,255,128,128]Лейтенант, уводите людей, если хотите остаться при всех солдатах.. Сейчас её включат...".."".."\n", nil, nil, 30000)
end
function new3()
news_manager.send_tip(db.actor, "%c[255,160,160,160]".."Общий канал:".."\\n".."%c[255,255,128,128]Господи... Мы не успеваем... Напишите за меня жене.".."".."\n", nil, nil, 30000)
end
function new4()
news_manager.send_tip(db.actor, "%c[255,160,160,160]".."Общий канал:".."\\n".."%c[255,255,128,128]Хех... Сегодня этих ворюг станет куда меньше... Доктор... Мы готовы.".."".."\n", nil, nil, 30000)
end
function hell_memoryhit()
local hit = hit()
hit.power = 0.3
hit.direction=vector():set(0,0,0)
hit.impulse = 0.3
hit.draftsman = db.actor
hit.type = hit.telepatic
db.actor:hit(hit)
end

--\\*Выбираем Рандомное Сообщение
function hell_news()
local horrornews = math.random(1,7)
if horrornews == 1 then news1() end
if horrornews == 2 then news2() end
if horrornews == 3 then news3() end
if horrornews == 4 then news4() end
if horrornews == 5 then news5() end
if horrornews == 6 then news6() end
if horrornews == 7 then news7() end
end
function news1()
news_manager.send_tip(db.actor, "%c[255,160,160,160]".."Общий канал:".."\\n".."%c[255,255,128,128]Все в укрытие!!! Началось!!!".."".."\n", nil, nil, 30000)
end
function news2()
news_manager.send_tip(db.actor, "%c[255,160,160,160]".."Общий канал:".."\\n".."%c[255,255,128,128]Мутанты!!! Они повсюду!!! Круши их!!!".."".."\n", nil, nil, 30000)
end
function news3()
news_manager.send_tip(db.actor, "%c[255,160,160,160]".."Общий канал:".."\\n".."%c[255,255,128,128] Брат!!! ПОМОГАЙ!!!".."".."\n", nil, nil, 30000)
end
function news4()
news_manager.send_tip(db.actor, "%c[255,160,160,160]".."Общий канал:".."\\n".."%c[255,255,128,128]НАРОД!!! ЗОМБИ ОТОВСЮДУ ЛЕЗУТ!!! ВЫРУЧАЙТЕ БРАТЦЫ!!!".."".."\n", nil, nil, 30000)
end
function news5()
news_manager.send_tip(db.actor, "%c[255,160,160,160]".."Общий канал:".."\\n".."%c[255,255,128,128]Зомби окружили бункер... Круглов, если слышишь, то не иди через болота, сам знаешь почему...".."".."\n", nil, nil, 30000)
end
function news6()
news_manager.send_tip(db.actor, "%c[255,160,160,160]".."Общий канал:".."\\n".."%c[255,255,128,128]Бойцы, это очередной шанс доказать, что мы ЛУЧШИЕ!.. КРУШИ НЕЧИСТЬ!!!".."".."\n", nil, nil, 30000)
end
function news7()
news_manager.send_tip(db.actor, "%c[255,160,160,160]".."Общий Канал:".."\\n".."%c[255,255,128,128]Братья... Кроши уродов...".."".."\n", nil, nil, 30000)
end
function hell_spawn_phantom()
local i
local q = math.random(5,15)
local yaw = math.pi*2.0*math.random()
local radius = 30*(math.random()/2.0+0.5)
local height = 2.5*math.random()
local a_pos = db.actor:position()
local pos = vector():set(math.sin(yaw)*radius+a_pos.x,a_pos.y+height,math.cos(yaw)*radius+a_pos.z)
for i = 1, q do
phantom_manager.spawn_phantom(pos)
end
end

vertexess={

marsh={lvid =528961,gvid=244},
garbage={lvid=358066,gvid=471},
escape={lvid=624951,gvid=742},
darkvalley={lvid=360974,gvid=960},
red_forest={lvid=164829,gvid=1056},
agroprom={lvid=375233,gvid=1211},
yantar={lvid=147712,gvid=1312},
military={lvid=385322,gvid=1510},
agroprom_underground={lvid=5348,gvid=1523},
limansk={lvid=61524,gvid=1564},
stancia_2={lvid=203361,gvid=1572},
hospital={lvid=7865,gvid=1619}

}[/cut]


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

gamer, Любые существующие в вашем варианте геймграфа.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
prohodchikДата: Вс, 10.04.2016, 20:19 | Сообщение # 1253
Новичок
Пользователи
Сообщений: 50
Награды: 0
Репутация: [ 0 ]

Приветствую всех!
Как заставить сталкеров не сталкиваться, взаимодействовать с объектами (подбирать артефакты и т.д.)? "Обычных" НПС, не "квестовых".


Проект в разработке – "Болотные легенды"
 
denis2000Дата: Пн, 11.04.2016, 08:28 | Сообщение # 1254
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата prohodchik ()
Как заставить сталкеров не сталкиваться

Или переработать в движке функции движения НПС по сетке или придумать скриптовую схему поведения (на счет второго варианта не уверен).
Цитата prohodchik ()
взаимодействовать с объектами (подбирать артефакты и т.д.)?

Сделать соответствующие схемы поведения НПС на подобии например обыска трупов: xr_corpse_detection.script


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
men_stalkerДата: Чт, 14.04.2016, 17:05 | Сообщение # 1255
Инженер «Свободы»
Свобода
Сообщений: 184
Награды: 5
Репутация: [ 40 ]

Доброго времени суток,возникла проблема со спавном нпс. Много раз видел похожие проблемы но решения так и не не нашёл.
[cut=Файл сквада:][smart_terrain];esc_c1
squad_id = 1
max_population = 1[/cut]
[cut=simulation_objects_props][esc_c1_militari_squad]:default_squad
sim_avail = true[/cut]

[cut=simulation:]
[start_position_escape]
esc_c1__militari_squad = esc_c1[/cut]

[cut=squad_descr_escape:][esc_c1_militari_squad]:online_offline_group
faction = stalker
npc = sim_default_bandit_1
spawn_point = esc_c1_spawn
target_smart = esc_c1
story_id = esc_c1_militari_squad[/cut]

[cut=лог:]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 : ... - Зов Припяти\gamedata\scripts\smart_terrain.script:1139: attempt to perform arithmetic on field 'arrive_dist' (a nil value)

stack trace:[/cut]

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


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

men_stalker, Явно пропишите:
Код
[smart_terrain];esc_c1
squad_id = 1
max_population = 1
arrive_dist = 30


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
men_stalkerДата: Пт, 15.04.2016, 10:28 | Сообщение # 1257
Инженер «Свободы»
Свобода
Сообщений: 184
Награды: 5
Репутация: [ 40 ]

Код
[smart_terrain];esc_c1
squad_id = 1
max_population = 1
arrive_dist = 30

Не помогло более того я окончательно запутался. При изменении _g.script как рекомендует Хован в логе написано что отсутсвует конфигурация смарта, причём в любом случае: будь то нпс или мутант

[cut=лог]FATAL ERROR

[error]Expression : 0
[error]Function : ErrorLog
[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_engine_script.cpp
[error]Line : 49
[error]Description : [smart_terrain esc_c1] no configuration!


stack trace:[/cut]


Сообщение отредактировал men_stalker - Пт, 15.04.2016, 13:48
 
denis2000Дата: Пт, 15.04.2016, 14:38 | Сообщение # 1258
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

men_stalker, Странное поведение, могу только предположить кривизну сборки игры.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
men_stalkerДата: Пн, 02.05.2016, 15:21 | Сообщение # 1259
Инженер «Свободы»
Свобода
Сообщений: 184
Награды: 5
Репутация: [ 40 ]

Спасибо за помощь. Начал всё с нуля: создал новый смарт всё работает. Путём эксперементов понял, что система не видела конфигурацию смарта. Только одно не понятно почему в первом случае с монстрами прокатывало)

Добавлено (02.05.2016, 15:21)
---------------------------------------------
Здравствуйте, такой вот вопрос. Можно ли эксклюзивного нпс сделать без звёздочки, чтобы не откликался на актора (типо говорил чтоб отстал)
А и есть ли инфоршень выброса (чтоб когда начинался выброс он убегал в укрытие)

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

men_stalker,
Цитата men_stalker ()
А и есть ли инфоршень выброса (чтоб когда начинался выброс он убегал в укрытие)

В логику НПС прописываешь переход на другой тип логики:
Код
on_info = {=surge_started} дргуй блок логики

А чтобы НПС вернулся обратно после того как выброс закончится нужно прописать условие
Код
on_info = {=surge_complete} дргуй блок логики


 
Форум » Моды для игр » Модостроение » Модостроение. Спавн и логика
Поиск: