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

Цитата asd123 ()
и это теперь тоже работает

asd123, всё что вы хотите сделать, ещё в 2013 году реализовано в моде Время Альянса. Там ГГ летает на вертушке и атакует монстров, гуманоидов и даже БТР.
Вертушка "видит" всех, наводит на цель орудия. Информация о захвате цели выводится на экран шлема. ГГ давит на гашетку, запуская по врагам ракеты и стреляя из пулемёта.
В моде Припять.Точка Отсчёта переписана схема heli_combat. Схема сделана отдельной( такой же как heli_move) и вертолёт атакует цели пролётами. Скрыться очень сложно и вертолёт преследует и атакует игрока по всей локации.

Конечно похвально, что вы сами пытаетесь изобрести велосипед!!!
Но не проще ли взять готовый "байк" и покататься от души???


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

makdm, эх.. Я попробую перенести что-то от туда. Мне просто интересно научиться понимать всё это, а не просто переносить. happy

Вот этим вы меня заинтересовали.. Попробую перенести эту функцию. biggrin
Цитата makdm ()
ГГ давит на гашетку, запуская по врагам ракеты и стреляя из пулемёта.

Да, хотел спросить. Как бы мне настроить полёт на вертолёте? У меня по этому поводу 2 вопроса:

1. Как предотвратить выпадение ГГ ? Он у меня падает на землю и разбивается на смерть. Телепортация оформлена на pilot1(типа пилот, который ближе к пулемёту). Ми-24
2. Как настроить управление, чтобы вертолёт смотрел и летел туда, куда посмотрит ГГ ?


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




Сообщение отредактировал asd123 - Сб, 16.07.2016, 00:15
 
makdmДата: Сб, 16.07.2016, 00:32 | Сообщение # 2013
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата asd123 ()
Как предотвратить выпадение ГГ ?

В схеме heli_move прописать весь путь вертушки по локации без переключения со схемы на схему. При переключении схем вертушка иногда ( почему? сам не разбирался досконально ) "уходит" из под скриптов. Тогда и происходит сброс игрока на землю.
Цитата asd123 ()
Как настроить управление, чтобы вертолёт смотрел и летел туда, куда посмотрит ГГ ?

В схеме heli_move - никак. Эта схема заточена под вейпоинты.
Три года назад я пытался это сделать - у меня не получилось. Сейчас, имея опыт, возможно и смог бы, но нет желания и необходимости.
Нужно с нуля писАть свою схему. Но я не уверен, что она будет работать правильно, так как движок под это не "заточен".


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


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

makdm, понятно.. Ну чтож, спасибо за информацию smile Кстати, скачал Симбион на ТЧ чтобы посмотреть как устроено там управление вертолётом. Вообщем, вот что написано в логике вертолёта с Кордона:
[cut=esc_heli_fly.ltx]
[logic]
active = heli_move@flypoint1
on_death = heli_move@death

[heli_move@flypoint1] ;-- летим в точку посадки ГГ
path_move = heli_fly
engine_sound = true
invulnerable = true
on_timer = 1 | %=m_veh_esc.esc_heli_fly_to_point1%
on_info = {+esc_heli_fly_p1} heli_move@landpoint1

[heli_move@landpoint1] ;-- приземляемся
path_move = heli_fly
engine_sound = true
on_timer = 1 | %=m_veh_esc.esc_heli_land_to_point1%
on_timer2 = 15000 | {-esc_heli_fly_p2} heli_move@idle0 ;-- нет посадки (15 сек) -> улетаем
on_actor_dist_le_nvis = 5 | {-esc_heli_fly_loading} %=m_veh_esc.esc_heli_fly_check_loading% ;--загрузка ГГ
on_info = {+esc_heli_fly_p2} heli_move@idlepoint1 ;--сели -> ждать

[heli_move@idlepoint1] ;-- сели и ждем посадки ГГ
path_move = heli_fly
;engine_sound = true
on_timer = 1 | {-esc_heli_fly_loading} %=m_veh_esc.esc_heli_land_to_point1%
on_timer2 = 120000 | {-esc_heli_fly_loading} heli_move@idle0 ;-- нет посадки (3 мин) - улетаем
;on_timer3 = 3000 | {-esc_heli_fly_desant +esc_heli_fly_p2} %=m_veh_esc.esc_heli_fly_spawn_npc% ;-- спавним десант
on_actor_dist_le_nvis = 8 | {-esc_heli_fly_loading} %=m_veh_esc.esc_heli_fly_check_loading% ;--сажаем ГГ
on_info = {+esc_heli_fly_loading} heli_move@flypoint2 ;--посадили-на взлет

[heli_move@flypoint2] ;-- взлетаем с ГГ
path_move = heli_fly
engine_sound = true
on_timer = 1 | %=m_veh_esc.esc_heli_fly_to_point3%
on_info = {+esc_heli_fly_p3} heli_move@flying ;--в полет

[heli_move@flying] ;-- летаем
path_move = heli_fly
engine_sound = true
combat_use_rocket = true
combat_use_mgun = true
m_max_mgun_dist = 100
m_max_rocket_dist = 30
m_min_mgun_dist = 120
m_min_rocket_dist = 50
on_actor_dist_le_nvis = 8 | %=m_veh_esc.esc_heli_fly_flight%
on_actor_dist_ge_nvis = 8 | heli_move@idle0 ;--потеряли ГГ -> улетаем
on_info = {+esc_heli_fly_landing} heli_move@landpoint2 ;--посадка
on_death_info = esc_heli_fly_death

[heli_move@landpoint2] ;-- приземляемся
path_move = heli_fly
engine_sound = true
invulnerable = true
on_timer = 1 | %=m_veh_esc.esc_heli_fly_to_unload%
on_info = {+esc_heli_fly_unload} heli_move@idle0

[heli_move@idle0] ;--
path_move = heli_sleep2
engine_sound = true
on_timer = 60000 | %=m_veh_esc.esc_heli_fly_release% ;-- самоуничтожение (1 мин)

[heli_move@death]
engine_sound = false
on_info = %+esc_heli_fly_death =m_veh_esc.esc_heli_fly_release%
[/cut]
И, собственно, скриптовый файл, на который ссылаются многие строки из логики:
[cut=m_veh_esc.script]
--[[------------------------------------------------------------------------------------------------
File : m_veh_esc.script
Description: Транспортный вертолет
Copyright : 2007 © SIMBION:SHOC mod
Author : Lost_Stranger (update by Artos)
Last edit : 06.08.2009 (by Artos)
--]]------------------------------------------------------------------------------------------------

--/ ------------------------------------------------------------------
--/ Settings (установка переменных окружения)
--/ ------------------------------------------------------------------
local f_module = "m_veh_esc" --/ строковое имя файла-модуля
local flg_init = false --/ флаг инициализации модуля
--/ ------------------------------------------------------------------
--/ Print-Log (вывод отладочной информации)
--/ ------------------------------------------------------------------
function printf(fmt, ...)
db.log(f_module..":"..fmt,...)
end
--/ ------------------------------------------------------------------
--/ VARIABLEs
--/ ------------------------------------------------------------------
--local timer_upd10 = 0
local heli1_id, heli2_id = nil, nil
local heli1_str = "fly"
local heli2_str = "rev"
local landing_id = nil
local height_max = 40 --/ высота полета
local tbl_targets = {} --/ список целей
local next_choice_time = 0 --/ timeout поиска цели
local m_max_mgun_dist = 100 --/200
local m_min_mgun_dist = 30
local m_max_rocket_dist = 120 --/200
local m_min_rocket_dist = 50

local tbl_pos = {
[11] = {pos = {x = -150, y = 50, z = -670 }, gv = -1, lv = -1}, --/ точка спавна транспортного вертолета
[12] = {pos = {x = -119, y = 35, z = -74 }, gv = -1, lv = -1}, --/ точка над посадкой ГГ
[13] = {pos = {x = -119, y = -1, z = -74 }, gv = 72, lv = 135123}, --/ точка посадки ГГ
[14] = {pos = {x = 81, y = 33, z = 689 }, gv = 214, lv = 377023}, --/ точка высадки
[15] = {pos = {x = 65, y = 29.2, z = 674 }, gv = -1, lv = -1}, --/ точка респауна ГГ

[21] = {pos = {x = -317, y = 16, z = 83 }, gv = -1, lv = -1}, --/ точка спавна боевого вертолета (2)
[22] = {pos = {x = 58, y = 30, z = 130 }, gv = -1, lv = -1}, --/ точка подлета
[23] = {pos = {x = 59.41, y = 4, z = 131.73}, gv = 94, lv = 346930}, --/ точка посадки
[24] = {pos = {x = 61.66, y = 1.93, z = 133.6 }, gv = 96, lv = 347838} --/ точка спавна десанта
}
--/ ------------------------------------------------------------------
--/ Initialise Module (инициализация, выполняется единожды)
--/ ------------------------------------------------------------------
function init()
-- printf("init:[%s]", "info" ) --/#~#
register_callback("game_load", load_variables, nil)
--register_callback("update", update, nil)
flg_init = true
end
function load_variables()
-- printf("load_variables:[%s]", "info" ) --/#~#
if not flg_init then abort(f_module..":Not_initialised!") end
register_callback("npc_death", check_npc_death, nil)
end
--/ ------------------------------------------------------------------------------------------------
--/ Process (функции)
--/ ------------------------------------------------------------------------------------------------
function check_npc_death(uo,victim,who)
if level.name() == "l01_escape" then
if victim and who and db.actor and who:id() == db.actor:id() then --/and xr_gulag.getGulagState("esc_blokpost") == 2
local victim_name = victim:name()
if victim_name then
local g_rank = ranks.get_actor_game_rank()
if victim_name == "esc_bridge_soldier5" or (g_rank >= 4 and string.find(victim_name, "esc_bridge")) then --/ убил Кузнецова (или вояку при ранге выше ...)
printf("check_npc_death:[%s]~killed,g_rank=[%s]:[%s]", victim_name, g_rank, "i") --/#~#
spawn_esc_heli_rev() --/ вызываем атакующий вертолет
unregister_callback("npc_death", check_npc_death)
end
else
printf("check_npc_death:victim_name=[%s]<~?:<%s>", _f.get_charname(victim), "Warning!")
end
end
else
unregister_callback("npc_death", check_npc_death)
end
end

--/ ------------------------------------------------------------------
function check_esc_heli(type)
local hid = heli1_id
if type == heli2_str then
hid = heli2_id
end
if ( hid and ( has_alife_info("esc_heli_"..type.."_death") or not has_alife_info("esc_heli_"..type.."_spawn") )) or
( hid == nil and has_alife_info("esc_heli_"..type.."_spawn") )
then
printf("check_esc_heli:Error!:Ошибка_спавна_вертолета:%s_id=[%s]:<%s>", type, hid, "Warning!")
esc_heli_release(type)
return false --/>
end
return true
end
function check_esc_heli_fly()
return check_esc_heli("fly")
end
function check_esc_heli_rev()
return check_esc_heli("rev")
end

--/ спавн вертолета
function spawn_esc_heli(type)
if not db.m_vehicles then return end --/>
local h
local hid
if type == heli1_str then
h = tbl_pos[11]
hid = heli1_id
else
h = tbl_pos[21]
hid = heli2_id
end
if has_alife_info("esc_heli_"..type.."_spawn") and hid then return end --/> уже заспавнен
if has_alife_info("esc_heli_"..type.."_death") then
db.actor:disable_info_portion("esc_heli_"..type.."_death")
end
local logic = "[logic] \n cfg = scripts\\veh\\esc_heli_"..type..".ltx"
local obj = m_vehicles.create_vehicle("helicopter", vector():set(h.pos.x, h.pos.y, h.pos.z), nil, nil, logic)
if obj then
if type == heli1_str then
heli1_id = obj.id
_f.add_spot_on_map(obj.id,"green_location","Вертолет ГГ")
else
heli2_id = obj.id
end
db.actor:give_info_portion("esc_heli_"..type.."_spawn")
printf("Заспавнен_вертолет=[%s]:id=[%s]", type, obj.id )
end
end
function spawn_esc_heli_fly() --/ Fly - спавн вертолета для полета ГГ
spawn_esc_heli("fly")
end
function spawn_esc_heli_rev() --/ Rev - спавн вертолета (карательный)
spawn_esc_heli("rev")
end

--/ летит к точке приземления
function esc_heli_to_point1(type,heliObject)
local h
if type == heli1_str then
h = tbl_pos[12]
else
h = tbl_pos[22]
end
local point = vector():set(h.pos.x, h.pos.y, h.pos.z)
this.heli_move(point, heliObject, false)
local pos = heliObject:position()
-- printf(type.."->летит_к_точке_посадки:x=[%s],y=[%s],z=[%s]:2", pos.x, pos.y, pos.z)
if pos.x > h.pos.x-20 and pos.x < h.pos.x+20 and pos.z > h.pos.z-20 and pos.z < h.pos.z+20 then
db.actor:give_info_portion("esc_heli_"..type.."_p1")
printf("Подлетает_к_точке_посадки:"..type.."_id=[%s]:[%s]",heliObject:id(), "p1")
end
end
function esc_heli_rev_to_point1(object,heliObject) --/ Rev
esc_heli_to_point1("rev",heliObject)
end
function esc_heli_fly_to_point1(object,heliObject) --/ Fly
esc_heli_to_point1("fly",heliObject)
end

--/ садится
function esc_heli_to_point2(type, heliObject)
local h, point_look = nil, nil
if type == heli1_str then
h = tbl_pos[13]
point_look = vector():set(65, 30, 675)
else
h = tbl_pos[23]
point_look = db.actor:position()
end
local point = vector():set(h.pos.x, h.pos.y, h.pos.z)
this.heli_move(point, heliObject, true, point_look)
local pos = heliObject:position()
-- printf(type.."->садится_в_точке_посадки:x=[%s],y=[%s],z=[%s]", pos.x, pos.y, pos.z)
if pos.y <= h.pos.y and not has_alife_info("esc_heli_"..type.."_p2") then
db.actor:give_info_portion("esc_heli_"..type.."_p2")
if type == heli1_str then
_f.send_tip("Для полета Вы должны быть возле него","Вертолет в точке посадки",0,8,"gen_info")
end
printf("Приземляемся:"..type.."_id=[%s]:[%s]",heliObject:id(), "p2")
end
end
function esc_heli_rev_to_point2(object, heliObject) --/ Rev - садится
esc_heli_to_point2("rev", heliObject)
end
function esc_heli_land_to_point1(object, heliObject) --/ Fly - садится
esc_heli_to_point2("fly", heliObject)
end

--/ Fly - ждем посадки ГГ в вертушку
function esc_heli_fly_check_loading(object, heliObject)
if not has_alife_info("esc_heli_fly_loading") then
local h = tbl_pos[13]
local pos = db.actor:position()
if pos.x > h.pos.x-8 and pos.x < h.pos.x+8 and pos.z > h.pos.z-8 and pos.z < h.pos.z+8 then
db.actor:set_actor_position(vector():set(pos.x, pos.y+3, pos.z))
db.actor:set_actor_direction(-vector():set(65, 30, 675):getH())
db.actor:give_info_portion("esc_heli_fly_loading")
_f.remove_spot_from_map(heli1_id,"green_location")
_f.send_tip("Пристегните ремни, взлетаем!","Взлет",0,8,"gen_info")
-- printf("ГГ_в_вертолете:esc_heli_fly_loading")
end
end
end

--/ взлетает
function esc_heli_to_point3(type, heliObject)
local actor = db.actor
local h, point_look = nil, nil
if type == heli1_str then
h = tbl_pos[12]
point_look = vector():set(65, 30, 675)
else
h = tbl_pos[22]
point_look = actor:position():mad(actor:direction(),5)--/ actor:position()
end
local point = vector():set(h.pos.x, h.pos.y, h.pos.z)
this.heli_move(point, heliObject, true, point_look)
local pos = heliObject:position()
if type == heli1_str then
actor:set_actor_position(vector():set(pos.x, pos.y+4, pos.z))
end
-- printf(type.."->взлетает:x=[%s],y=[%s],z=[%s]", pos.x, pos.y, pos.z)
if pos.y > h.pos.y-5 and not has_alife_info("esc_heli_"..type.."_p3") then
actor:give_info_portion("esc_heli_"..type.."_p3")
if type == heli1_str then
local m = tbl_pos[14]
local obj = _f.spawn_obj("gps_metka",vector():set(m.pos.x, m.pos.y, m.pos.z), m.lv, m.gv)
landing_id = obj.id
_f.add_spot_on_map(obj.id,"green_location","Точка посадки")
_f.send_tip("Для посадки летите на холм справа от перехода на Свалку (cм.метку на карте).","Приятного полета!",0,8,"gen_info")
end
printf("Взлетел:"..type.."_id=[%s]:[%s]",heliObject:id(), "p3")
end
end
function esc_heli_rev_to_point3(object, heliObject) --/ Rev - взлетает
esc_heli_to_point3("rev", heliObject)
end
function esc_heli_fly_to_point3(object, heliObject)--/ Fly - взлетает
esc_heli_to_point3("fly", heliObject)
end

--/ полет по локации
function esc_heli_fly_flight(object,heliObject) --/ #~#
if has_alife_info("esc_heli_fly_death") then
printf("esc_heli_fly_flight:esc_heli_fly_death")
esc_heli_fly_release(object, heliObject)
return --/>
end
local actor = db.actor
--local point, pointlook, pointmove
local pos_h = heliObject:position()
local lnd = tbl_pos[14]
if pos_h.x > lnd.pos.x-20 and pos_h.x < lnd.pos.x+20 and pos_h.z > lnd.pos.z-20 and pos_h.z < lnd.pos.z+20 and not has_alife_info("esc_heli_fly_landing") then
actor:give_info_portion("esc_heli_fly_landing") --/ на посадку
_f.send_tip("Пристегните ремни! Садимся.","Прибыли в район посадки",0,5,"gen_info")
-- printf("Долетели_до_точки_высадки:esc_heli_fly_landing")
end

local dir, pos, pos_to
dir = actor:direction()
pos = actor:position()
actor:set_actor_position(vector():set(pos_h.x+(dir.x*7), pos_h.y+1, pos_h.z+(dir.z*7)))

pos_to = pos
pos_to.x = pos.x + (dir.x*15)
if pos_h.y < height_max-2 and pos_h.y > height_max+2 then
pos_to.y = pos_h.y
else
pos_to.y = height_max
end
pos_to.z = pos.z + (dir.z*15)

local heli = level.object_by_id(heliObject:id())
heli.heliObject = heli:get_helicopter()
heli.heliObject:LookAtPoint(pos_to, true)
heli.heliObject:SetSpeedInDestPoint(0)
heli.heliObject:SetDestPosition(pos_to)
--heli.heliObject.m_max_mgun_dist = m_max_mgun_dist
--heli.heliObject.m_max_rocket_dist = m_max_rocket_dist
--heli.heliObject.m_min_mgun_dist = m_min_mgun_dist
--heli.heliObject.m_min_rocket_dist = m_min_rocket_dist

--actor:set_actor_position(vector():set(pos_to.x+(dir.x*1), pos_to.y+1, pos_to.z+(dir.z*1)))
local enemy = esc_heli_choice_purpose(nil,heli) --/ выбираем цель
if enemy ~= nil then
heli.heliObject:SetEnemy(enemy)
end
end

--/ опять садимся
function esc_heli_fly_to_unload(object, heliObject)
local h = tbl_pos[14]
local point = vector():set(h.pos.x, h.pos.y, h.pos.z) --/ точка посадки
local point_look = vector():set(-50, 0, -60)
this.heli_move(point, heliObject, true, point_look)
local pos = heliObject:position()
-- printf("Садимся:x=[%s],y=[%s],z=[%s]:p5", pos.x, pos.y, pos.z)
db.actor:set_actor_position(vector():set(pos.x, pos.y+3, pos.z))
if pos.y > h.pos.y-5 and pos.y < h.pos.y+1 and not has_alife_info("esc_heli_fly_unload") then
db.actor:give_info_portion("esc_heli_fly_unload")
this.esc_heli_fly_unloading() --/ высаживаем ГГ
-- printf("Сели._Высаживаем_ГГ:p5")
end
end

--/ отпускаем ГГ
function esc_heli_fly_unloading()
db.actor:set_actor_position(vector():set( 65, 29.15, 674 )) --/ точка респауна ГГ
if landing_id then
alife():release(alife():object(landing_id), true)
end
_f.send_tip("Удачи в Зоне!","Полет окончен.",0,8,"gen_info")
end

--/ уничтожаем вертушку
function esc_heli_release(type, heliObject)
if heliObject ~= nil and heliObject:id() ~= nil then
db.actor:give_info_portion("esc_heli_"..type.."_death")
alife():release(alife():object(heliObject:id()), true)
end
if type == heli1_str then
heli1_id = nil
else
heli2_id = nil
end
db.actor:disable_info_portion("esc_heli_"..type.."_death")
printf("esc_heli_release:esc_heli_"..type.."_release")
--_f.send_tip("Вертолет=["..type.."]->уничтожен","",0,8,"gen_info")
end
function esc_heli_fly_release(object, heliObject) --/ Fly - уничтожаем вертушку ГГ
esc_heli_release("fly", heliObject)
end
function esc_heli_rev_release(object, heliObject) --/ Rev - уничтожаем карат. вертолет
esc_heli_release("rev", heliObject)
end

function esc_heli_fly_spawn_npc()
if not has_alife_info("esc_heli_fly_desant") then
if cnt_s < 3 then
cnt_s = cnt_s + 1
local s = tbl_pos[13]
local lvid = db.actor:level_vertex_id()
local gvid = db.actor:game_vertex_id()
local obj = alife():create("hunter_".. cnt_s .."_regular", vector():set(s.pos.x, s.pos.y-2, s.pos.z), lvid, gvid)
else
db.actor:give_info_portion("esc_heli_fly_desant")
cnt_s = 0
end
end
end

local tbl_s = {"esc_soldier_respawn_1", "esc_soldier_respawn_1", "esc_soldier_respawn_specnaz", "esc_soldier_respawn_specnaz", "esc_soldier_respawn_specnaz"}
local num_s, cnt_s = 0, 0 --/ кол-во и счетчик спавнящихся десантников
local next_time_s = 0

function esc_heli_rev_spawn_npc()
if (next_time_s or 0) < time_global() and not has_alife_info("esc_heli_rev_desant") then
next_time_s = time_global() + 1500 + math.random(-300,300) --/ проверяем раз в ~1.5 сек
--local num_s = ranks.get_obj_rank_number(db.actor) + 3
if num_s < 1 then num_s = 3 + level.get_game_difficulty() end
-- printf("esc_heli_rev_spawn_npc:cnt=[%s],num=[%s]", cnt_s, num_s)
if cnt_s < num_s then
cnt_s = cnt_s + 1
local npc_s = tbl_s[math.random(5)]
local s = tbl_pos[24]
--local obj = alife():create(npc_s, vector():set(s.pos.x, s.pos.y, s.pos.z), s.pos.lv, s.pos.gv)
local obj = alife():create(npc_s, vector():set(s.pos.x, s.pos.y, s.pos.z), db.actor:level_vertex_id(), db.actor:game_vertex_id())
printf("esc_heli_rev_spawn_npc:npc=[%s],cnt=[%s],num=[%s]", obj:name(), cnt_s, num_s)
if cnt_s >= num_s then
db.actor:give_info_portion("esc_heli_rev_desant")
-- printf("esc_heli_rev_spawn_npc:cnt>=num=[%s]", cnt_s)
next_time_d = 0
num_s, cnt_s = 0, 0
end
end
end
end

--/-------------------------------------------------------------------
--/ универсальные функции
--/-------------------------------------------------------------------

--/ устанавливаем свойства вертолёта
function heli_move(pos, heliObject, flg, point_look)
local heli = level.object_by_id(heliObject:id())
heli.heliObject = heliObject:get_helicopter()
if flg == true then
heli.heliObject:LookAtPoint(point_look,true)
end
heli.heliObject:SetSpeedInDestPoint(0)
heli.heliObject:SetDestPosition(pos)
end

--/ выбор цели для атаки
function esc_heli_choice_purpose(p1, heliObject)
local obj
if (next_choice_time or 0) < time_global() then
next_choice_time = time_global() + 4000 + math.random(-500,500) --/ проверяем раз в 3-5 сек
local actor = db.actor
local pos = heliObject:position()
for i=1,65534 do
obj = level.object_by_id(i)
if obj and (IsMonster(obj) or IsStalker(obj)) and obj:alive() and actor:see(obj) and actor:relation(obj) == game_object.enemy then
local opos = obj:position()
obj.dist = math.sqrt( (pos.x - opos.x)^2 + (opos.z - pos.z)^2 ) --/dist_2d
if obj.dist and obj.dist < (m_max_rocket_dist + 100) and obj.dist > height_max + 20 then
-- printf("esc_heli_choice_purpose:obj_name=[%s],obj.dist=[%s]:[%s]",obj:name(), obj.dist , i) --/#~#
table.insert(tbl_targets,obj)
end
end
end
end
local nearest = nil
-- printf("esc_heli_choice_purpose:num_tbl_targets=[%s]:[%s]", #tbl_targets, ">") --/#~#
if #tbl_targets > 1 then
table.sort(tbl_targets, function(a,b) return a.dist > b.dist end) --/compare_dist
end
for k,v in pairs(tbl_targets) do
if v and v:alive() then
nearest = v
break
else
table.remove(tbl_targets,k)
end
end
--printf("esc_heli_choice_purpose:цель=[%s],дист=[%s],целей=[%s]:[%s]", nearest:name(), tbl_targets[1].dist, #tbl_targets, ">") --/#~#
return nearest
end

--/-------------------------------------------------------------------------------------------------[/cut]
Там есть строчки, говорящие о развороте вертолёта на точку взгляда актёра и вроде как полёт на эту точку. Этот скрипт можно адаптировать для ЗП ? Интересует только взгляд и полёт в сторону взгляда ГГ.


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


 
bergДата: Сб, 16.07.2016, 11:03 | Сообщение # 2015
Отмычка
Пользователи
Сообщений: 38
Награды: 0
Репутация: [ 0 ]

Помогите плз вот по такому вопросу. Установлен SGM 2.2 но не чистый, а с Weapon Returns + еще там по мелочи. Столкнулся с неприятным моментом - на стволах, где встроенные прицелы и есть модификация оружия "контрастный прицел" - эффект контраста отсутствует.
Покопался в конфигах, постиг, что эффект этой желтизны прицела вроде как достигается при помощи contrast.ppe. И не сказать что в этой версии мода он отсутствует полностью - на съемных прицелах типа "Сумерки" он есть.
Если взять к примеру секцию конфига апгрейда винтореза:

;Контрастный прицел
;------------------
cost = 12000

scope_contrast = scope_contrast

то вроде все на месте. К примеру у FN2000 в этой секции был бардак, стояло:
scope_contrast = scope_nightvision

и при апгрейде получался ПНВ, заменил строку на scope_contrast = scope_contrast - ПНВ исчез, но прицел не пожелтел :-( Где что еще посмотреть?

upd: сорри, разобрался сам, по аналогии с работающим прицелом "Сумерки":-) Как это ни смешно, но правильная строка должна выглядеть как:
scope_nightvision = scope_contrast


Сообщение отредактировал berg - Сб, 16.07.2016, 11:22
 
КошелевДата: Сб, 16.07.2016, 23:14 | Сообщение # 2016
Гражданский
Пользователи
Сообщений: 19
Награды: 0
Репутация: [ 0 ]

Имеется вот такая логика кат-сцены. Пошел по пути, который предложил товарищ asd123 и прописал в начало новой игры выдачу поршня esc_intro_start. Кат-сцена воспроизводится в начале игры, останавливается, все как надо, однако воспроизводится после перезагрузки сохранения на этой локации и при переходе на эту локацию. Как быть?

Код
[logic]
active = sr_idle

[sr_idle]
on_info = {+esc_intro_start} sr_cutscene@esc

[sr_cutscene@esc]
point = esc_walk
look = esc_look
cam_effector = scenario_cam\escape\actor_start_cam
global_cameffect = true
enable_ui_on_end = true
on_signal = cameff_end | %=stop_sr_cutscene%
 
asd123Дата: Сб, 16.07.2016, 23:39 | Сообщение # 2017
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

Кошелев, откуда выдаётся инфопоршень?

Цитата Кошелев ()
on_signal = cameff_end | %=stop_sr_cutscene%

Попробуйте так:
on_signal = cameff_end | %=stop_sr_cutscene -esc_intro_start%


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




Сообщение отредактировал asd123 - Сб, 16.07.2016, 23:43
 
КошелевДата: Вс, 17.07.2016, 00:37 | Сообщение # 2018
Гражданский
Пользователи
Сообщений: 19
Награды: 0
Репутация: [ 0 ]

asd123, Не помогло. Поршень выдается из xr_effects, из этой функции
Код
function zat_a1_tutorial_end_give(actor, npc)
--    level.add_pp_effector("black.ppe", 1313, true) ---do not stop on r1 !
    db.actor:give_info_portion("zat_a1_tutorial_end")
    db.actor:give_info_portion("esc_intro_start")
end
 
asd123Дата: Вс, 17.07.2016, 00:46 | Сообщение # 2019
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

Кошелев, функция откуда запускается? Какие условия для её запуска?

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


 
НаблюдательДата: Вс, 17.07.2016, 13:55 | Сообщение # 2020
Ветеран
Пользователи
Сообщений: 400
Награды: 1
Репутация: [ 59 ]

Здравствуйте Всем! Подскажите, плиз, умные Люди, в каких папке и файле правятся текстуры растений. Играю в Ferr um mod + спецназ, так всё нормально, но очень ядовито-зелёная растительность, с какими-то переливами... Глаза устают. Можно как то вернуть только текстуры растительности из оригинальной ЗП, не затрагивая текстур стволов и прочего?
 
КошелевДата: Вс, 17.07.2016, 18:49 | Сообщение # 2021
Гражданский
Пользователи
Сообщений: 19
Награды: 0
Репутация: [ 0 ]

asd123, Условие одно - начало игры. Функция стандартная ПЫС, добавлен лишь мой поршень.

Добавлено (17.07.2016, 18:49)
---------------------------------------------
Наблюдатель, Все текстуры растений и деревьев хранятся в gamedata\textures\trees. Вам нужно только перенести оригинальную папку trees с заменой.

 
GreenGoblinДата: Вс, 17.07.2016, 19:36 | Сообщение # 2022
Гражданский
Пользователи
Сообщений: 11
Награды: 0
Репутация: [ 0 ]

Цитата Кошелев ()
Все текстуры растений и деревьев хранятся в gamedata\textures\trees. Вам нужно только перенести оригинальную папку trees с заменой.

Ну или из папки:
Цитата Кошелев ()
gamedata\textures

удалить папку trees

Добавлено (17.07.2016, 19:36)
---------------------------------------------
Просто дополняю ответ
Цитата Кошелев ()


Сообщение отредактировал GreenGoblin - Вс, 17.07.2016, 19:38
 
asd123Дата: Пн, 18.07.2016, 13:12 | Сообщение # 2023
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

Подскажите.. Хочу сделать систему бесконечных заданий как у Сидоровича, Волка, Бармена, Сахорова и других квестовых персонажей в ТЧ. Ну там, зачистка/оборона лагеря, поиск артефактов/частей тел мутантов, да только не знаю что исправлять sad Понимаю, что task_manager.script, но что туда добавить - не в курсе. Хотелось бы ещё объеденить его с менеджером из ЧН - чтобы можно было смарт-террайны вместе со сквадами захватывать, или защищать.

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




Сообщение отредактировал asd123 - Пн, 18.07.2016, 14:33
 
denis2000Дата: Ср, 20.07.2016, 13:27 | Сообщение # 2024
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Voland-777, В логе написано: Не могу открыть файл gamedata\sound\$no_sound.ogg

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
Voland-777Дата: Ср, 20.07.2016, 14:01 | Сообщение # 2025
Эмиссар
Пользователи
Сообщений: 1702
Награды: 9
Репутация: [ 474 ]

denis2000, да я уж понял) Причина в том, что там этот файл есть, но с неверным расширением. Исправляю - история повторяется.

Добавлено (20.07.2016, 14:01)
---------------------------------------------
satanpower, в теме "Читер-Клуб" есть в шапке метод спавна предмета в рюкзак через скрипт, посмотри там.

 
Поиск: