Перейти к контенту

[SoC] Ковыряемся в файлах


Halford

Рекомендуемые сообщения

(изменено)

Перевел две группы НПС на созданные гулаги, но где-то накосячил, т.к. все они просто стоят на месте. Кто разбирается, посмотрите, может я чего и не увидел (мобы из гулагов временно вырезаны, работают нормально):

 

local t = {}



function load_job(sj, gname, type, squad, groups)

-- Группа Алекса

if type == "generators_alex_squad" then
t = { section = "logic@generators_alex_squad_alex",
idle = 0,
prior = 1, state = {0},
squad = squad,
online = true,
in_rest = "", out_rest = "",
redicate = function(obj_info)
return obj_info.name == "generators_alex"
end
}
table.insert(sj, t)
t = { section = "logic@generators_alex_squad_werewolf",
idle = 0,
prior = 1, state = {0},
squad = squad,
online = true,
in_rest = "", out_rest = "",
redicate = function(obj_info)
return obj_info.name == "generators_werewolf"
end
}
table.insert(sj, t)
t = { section = "logic@generators_alex_squad_taurus",
idle = 0,
prior = 2, state = {0},
squad = squad,
online = true,
in_rest = "", out_rest = "generators_monolith_base",
redicate = function(obj_info)
return obj_info.name == "generators_taurus"
end
}
table.insert(sj, t)
end

-- База "Монолита"

if type == "generators_monolith_base" then
t = { section = "logic@generators_monolith_base_commander",
idle = 0,
prior = 1, state = {0},
online = true,
in_rest = "", out_rest = "",
redicate = function(obj_info)
return obj_info.name == "generators_monolith_base_commander"
end
}
table.insert(sj, t)
t = { section = "logic@generators_monolith_base_door_guard",
idle = 0,
prior = 1, state = {0},
online = true,
in_rest = "", out_rest = "",
redicate = function(obj_info)
return obj_info.name == "generators_monolith_base_door_guard"
end
}
table.insert(sj, t)
t = { section = "logic@generators_monolith_base_barrikada_guard_1",
idle = 0,
prior = 1, state = {0},
online = true,
in_rest = "", out_rest = "",
redicate = function(obj_info)
return obj_info.name == "generators_monolith_base_barrikada_guard_1"
end
}
table.insert(sj, t)
t = { section = "logic@generators_monolith_base_barrikada_guard_2",
idle = 0,
prior = 1, state = {0},
online = true,
in_rest = "", out_rest = "",
redicate = function(obj_info)
return obj_info.name == "generators_monolith_base_barrikada_guard_2"
end
}
table.insert(sj, t)
t = { section = "logic@generators_monolith_base_perimetr_guard_1",
idle = 0,
prior = 1, state = {0},
online = true,
in_rest = "", out_rest = "",
redicate = function(obj_info)
return obj_info.name == "generators_monolith_base_perimetr_guard_1"
end
}
table.insert(sj, t)
t = { section = "logic@generators_monolith_base_perimetr_guard_2",
idle = 0,
prior = 1, state = {0},
online = true,
in_rest = "", out_rest = "",
redicate = function(obj_info)
return obj_info.name == "generators_monolith_base_perimetr_guard_2"
end
}
table.insert(sj, t)
t = { section = "logic@generators_monolith_base_prisoner_guard",
idle = 0,
prior = 1, state = {0},
online = true,
in_rest = "", out_rest = "",
redicate = function(obj_info)
return obj_info.name == "generators_monolith_base_prisoner_guard"
end
}
table.insert(sj, t)
t = { section = "logic@generators_monolith_base_sniper_1",
idle = 0,
prior = 1, state = {0},
online = true,
in_rest = "", out_rest = "",
redicate = function(obj_info)
return obj_info.name == "generators_monolith_base_sniper_1"
end
}
table.insert(sj, t)
t = { section = "logic@generators_monolith_base_sniper_2",
idle = 0,
prior = 1, state = {0},
online = true,
in_rest = "", out_rest = "",
redicate = function(obj_info)
return obj_info.name == "generators_monolith_base_sniper_2"
end
}
table.insert(sj, t)
t = { section = "logic@generators_monolith_base_sniper_3",
idle = 0,
prior = 1, state = {0},
online = true,
in_rest = "", out_rest = "",
redicate = function(obj_info)
return obj_info.name == "generators_monolith_base_sniper_3"
end
}
table.insert(sj, t)
end

end

function load_states(gname, type)

if type == "generators_alex_squad" then
return function(gulag)
if has_alife_info("back_to_alex_squad") then
return 0
end
end
end

if type == "generators_monolith_base" then
return function(gulag)
return 0
end
end

end


--------------------------------------------------------------------------
-- Dynamic ltx
--------------------------------------------------------------------------
function load_ltx(gname, type)
return nil
end

function checkStalker(npc_community, gulag_type, npc_rank, se_obj)

if gulag_type == "generators_alex_squad" then
return npc_community == "stalker"
end

if gulag_type == "generators_monolith_base" then
return npc_community == "monolith"
end

return false
end

function checkMonster(npc_community, gulag_type)
return false
end

 

 

[spoiler='gualg.ltx

;-- Группа Алекса:

 

; Алекс
[logic@generators_alex_squad_alex]
active = walker@alex_wait_actor
on_death = alex_squad_death

 

[walker@alex_wait_actor]
path_walk = generators_alex_squad_alex_walk_1
path_look = generators_alex_squad_alex_look_1
invulnerable = true
meet = meet@alex_meet_1
danger = danger_condition@alex
on_info  = {+save_taurus} walker@alex_after_start_task
on_info2 = {+save_taurus_alternative} walker@alex_after_start_alternative_task
on_info3 = {+taurus_dead} walker@alex_after_taurus_dead

 

[meet@alex_meet_1]
meet_state = 30| hello@talk_hello| 8| wait@wait| 3| ward@wait
meet_state_wpn = 30| hello@talk_hello| 8| wait@wait| 3| ward@wait
victim = 30| actor
victim_wpn = 30| actor
use = true
use_wpn = true
meet_dialog = {-save_taurus} gen_alex_start_dialog

 

[walker@alex_after_start_task]
path_walk = generators_alex_squad_alex_walk_1
path_look = generators_alex_squad_alex_look_2
invulnerable = true
meet = meet@alex_meet_2
danger = danger_condition@alex
on_info = {+back_to_alex_squad_complite} walker@alex_after_complite_task
on_info2 = {+taurus_dead} walker@alex_after_fail_task

 

[meet@alex_meet_2]
meet_state = 10| wait@wait| 3| ward@wait
meet_state_wpn = 10| wait@wait| 3| ward@wait
victim = 10| actor
victim_wpn = 10| actor
use = true
use_wpn = true
meet_dialog = {+save_taurus -back_to_alex_squad_complite} gen_alex_taurus_save_in_progress_dialog

 

[walker@alex_after_start_alternative_task]
path_walk = generators_alex_squad_alex_walk_1
path_look = generators_alex_squad_alex_look_1
invulnerable = true
meet = meet@alex_meet_3
danger = danger_condition@alex
on_info = {+back_to_alex_squad_complite} walker@alex_after_complite_task

 

[meet@alex_meet_3]
meet_state = 10| wait@wait| 3| ward@wait
meet_state_wpn = 10| wait@wait| 3| ward@wait
victim = 10| actor
victim_wpn = 10| actor
use = true
use_wpn = true
meet_dialog = {+save_taurus_alternative -back_to_alex_squad_complite} gen_alex_taurus_dead_hello_dialog

 

[walker@alex_after_complite_task]
path_walk = generators_alex_squad_alex_walk_1
path_look = generators_alex_squad_alex_look_2
invulnerable = true
meet = meet@alex_meet_4
danger = danger_condition@alex

 

[meet@alex_meet_4]
meet_state = 10| wait@wait| 3| ward@wait
meet_state_wpn = 10| wait@wait| 3| ward@wait
victim = 10| actor
victim_wpn = 10| actor
use = true
use_wpn = true
meet_dialog = {+back_to_alex_squad_complite -save_taurus_task_talk_to_alex_complite} gen_alex_taurus_safety_dialog, {+save_taurus_task_talk_to_alex_complite} gen_alex_hello_dialog

 

[walker@alex_after_fail_task]
path_walk = generators_alex_squad_alex_walk_1
path_look = generators_alex_squad_alex_look_2
invulnerable = true
meet = meet@alex_meet_5
danger = danger_condition@alex

 

[meet@alex_meet_5]
meet_state = 10| wait@wait| 3| ward@wait
meet_state_wpn = 10| wait@wait| 3| ward@wait
victim = 10| actor
victim_wpn = 10| actor
use = true
use_wpn = true
meet_dialog = {+taurus_dead +save_taurus -taurus_dead_talk_to_alex_complite} gen_alex_taurus_dead_dialog, {+taurus_dead_talk_to_alex_complite} gen_alex_taurus_dead_hello_dialog

 

[walker@alex_after_taurus_dead]
path_walk = generators_alex_squad_alex_walk_1
path_look = generators_alex_squad_alex_look_1
invulnerable = true
meet = meet@alex_meet_6
danger = danger_condition@alex

 

[meet@alex_meet_6]
meet_state = 10| wait@wait| 3| ward@wait
meet_state_wpn = 10| wait@wait| 3| ward@wait
victim = 10| actor
victim_wpn = 10| actor
use = true
use_wpn = true
meet_dialog = {+taurus_dead -save_taurus -taurus_dead_talk_to_alex_alternative_complite} gen_alex_taurus_dead_alternative_dialog, {+taurus_dead_talk_to_alex_alternative_complite} gen_alex_taurus_dead_hello_dialog

 

[danger_condition@alex]
ignore_distance            = 30
ignore_distance_grenade    = 30
ignore_distance_corpse     = 0
ignore_distance_sound      = 30
danger_inertion_time_hit   = 1

 

; Вервольф
[logic@generators_alex_squad_werewolf]
active = remark@werewolf_wounded
combat_ignore = combat_ignore@alex_squad
danger = danger_condition@werewolf
on_death = alex_squad_death

 

[remark@werewolf_wounded]
anim = wounded_heavy
combat_ignore_cond = always
meet = no_meet

 

[danger_condition@werewolf]
ignore_distance            = 30
ignore_distance_grenade    = 30
ignore_distance_corpse     = 0
ignore_distance_sound      = 30
danger_inertion_time_hit   = 1

 

; Таурус (пленный)
[logic@generators_alex_squad_taurus]
active = walker@monolith_base_taurus_prisoner
on_death = taurus_death
combat_ignore = combat_ignore@alex_squad

 

[walker@monolith_base_taurus_prisoner]
path_walk = generators_alex_squad_taurus_prisoner_walk
path_look = generators_alex_squad_taurus_prisoner_look
invulnerable = true
combat_ignore_cond = always
meet = no_meet
on_info = {+monolith_base_destroy} walker@monolith_base_taurus_need_help

 

[walker@monolith_base_taurus_need_help]
path_walk = generators_alex_squad_taurus_walk_1
path_look = generators_alex_squad_taurus_look_1
combat_ignore_cond = {!actor_enemy !fighting_actor}
meet = meet@taurus_meet_1
on_info = {+back_to_alex_squad} walker@taurus_back_to_alex_squad

 

[meet@taurus_meet_1]
meet_state = 10| hello@talk_hello| 8|wait
meet_state_wpn = 10| hello@talk_hello| 8|wait
victim = 10| actor
victim_wpn = 10| actor
use = true
use_wpn = true
meet_dialog = {+save_taurus} gen_taurus_save_dialog, {-save_taurus} gen_taurus_save_alternative_dialog

 

[walker@taurus_back_to_alex_squad]
path_walk = generators_alex_squad_taurus_walk_2
path_look = generators_alex_squad_taurus_look_2
combat_ignore_cond = {!actor_enemy !fighting_actor}
meet = no_meet
on_signal = arrive | walker@alex_squad_taurus_after_safety

 

[walker@alex_squad_taurus_after_safety]
path_walk = generators_alex_squad_taurus_walk_3
path_look = generators_alex_squad_taurus_look_2
meet = meet@taurus_meet_2
on_info = {+save_taurus_task_talk_to_taurus_complite} walker@alex_squad_taurus_after_complite_task

 

[meet@taurus_meet_2]
use = true
use_wpn = true
meet_dialog = {+back_to_alex_squad_complite +save_taurus} gen_taurus_after_save_dialog, {+back_to_alex_squad_complite +save_taurus_alternative} gen_taurus_after_save_alternative_dialog

 

[walker@alex_squad_taurus_after_complite_task]
path_walk = generators_alex_squad_taurus_walk_3
path_look = generators_alex_squad_taurus_look_2
meet = meet@taurus_meet_3

 

[meet@taurus_meet_3]
use = true
use_wpn = true
meet_dialog = {+save_taurus_task_talk_to_taurus_complite} gen_taurus_hello_dialog

[taurus_death]
on_info = %+taurus_dead +take_taurus_pda%

;--------------------------------------------
[combat_ignore@alex_squad]

 

[alex_squad_death]
on_info = %+alex_squad_dead%
;--------------------------------------------

 

;-- База "Монолита":

 

;-- Командир базы
[logic@generators_monolith_base_commander]
active = walker@generators_monolith_base_commader
on_death = death@generators_monolith_base_commader
combat_ignore = combat_ignore@generators_monolith_base

 

[walker@generators_monolith_base_commader]
path_walk = generators_monolith_base_commander_walk
path_look = generators_monolith_base_commander_look
no_retreat = true

 

[death@generators_monolith_base_commader]
on_info = %+monolith_base_commander_dead%

 

;-- Охранник у двери в лабораторию Х-8
[logic@generators_monolith_base_door_guard]
active = walker@generators_monolith_base_door_guard
on_death = death@generators_monolith_base_door_guard
combat_ignore = combat_ignore@generators_monolith_base

 

[walker@generators_monolith_base_door_guard]
path_walk = generators_monolith_base_door_guard_walk
path_look = generators_monolith_base_door_guard_look

 

[death@generators_monolith_base_door_guard]
on_info = %+monolith_base_door_guard_dead%

 

;-- Снайпер-1
[logic@generators_monolith_base_sniper_1]
active = camper@generators_monolith_base_sniper_1
on_combat = combat@generators_monolith_base_snipers
on_death = death@generators_monolith_base_sniper_1
combat_ignore = combat_ignore@generators_monolith_base

 

[camper@generators_monolith_base_sniper_1]
path_walk = generators_monolith_base_sniper_1_walk
path_look = generators_monolith_base_sniper_1_look
sniper = true

danger = danger_condition@generators_monolith_base_snipers

 

[death@generators_monolith_base_sniper_1]
on_info = %+monolith_base_sniper_1_dead%

 

;-- Снайпер-2
[logic@generators_monolith_base_sniper_2]
active = camper@generators_monolith_base_sniper_2
on_combat = combat@generators_monolith_base_snipers
on_death = death@generators_monolith_base_sniper_2
combat_ignore = combat_ignore@generators_monolith_base

 

[camper@generators_monolith_base_sniper_2]
path_walk = generators_monolith_base_sniper_2_walk
path_look = generators_monolith_base_sniper_2_look
sniper = true
danger = danger_condition@generators_monolith_base_snipers

 

[death@generators_monolith_base_sniper_2]
on_info = %+monolith_base_sniper_2_dead%

 

;-- Снайпер-3
[logic@generators_monolith_base_sniper_3]
active = camper@generators_monolith_base_sniper_3
on_combat = combat@generators_monolith_base_snipers
on_death = death@generators_monolith_base_sniper_3
combat_ignore = combat_ignore@generators_monolith_base

 

[camper@generators_monolith_base_sniper_3]
path_walk = generators_monolith_base_sniper_3_walk
path_look = generators_monolith_base_sniper_3_look
sniper = true
danger = danger_condition@generators_monolith_base_snipers

 

[death@generators_monolith_base_sniper_3]
on_info = %+monolith_base_sniper_3_dead%

 

;-- Охранник-1 у баррикад
[logic@generators_monolith_base_barrikada_guard_1]
active = walker@generators_monolith_base_barrikada_guard_1
on_death = death@generators_monolith_base_barrikada_guard_1
combat_ignore = combat_ignore@generators_monolith_base

 

[walker@generators_monolith_base_barrikada_guard_1]
path_walk = generators_monolith_base_barrikada_guard_1_walk
path_look = generators_monolith_base_barrikada_guard_1_look

 

[death@generators_monolith_base_barrikada_guard_1]
on_info = %+monolith_base_barrikada_guard_1_dead%

 

;-- Охранник-2 у баррикад
[logic@generators_monolith_base_barrikada_guard_2]
active = walker@generators_monolith_base_barrikada_guard_2
on_death = death@generators_monolith_base_barrikada_guard_2
combat_ignore = combat_ignore@generators_monolith_base

 

[walker@generators_monolith_base_barrikada_guard_2]
path_walk = generators_monolith_base_barrikada_guard_2_walk
path_look = generators_monolith_base_barrikada_guard_2_look

 

[death@generators_monolith_base_barrikada_guard_2]
on_info = %+monolith_base_barrikada_guard_2_dead%

 

;-- Охранник-1 внутреннего периметра базы
[logic@generators_monolith_base_perimetr_guard_1]
active = walker@generators_monolith_base_perimetr_guard_1
on_death = death@generators_monolith_base_perimetr_guard_1
combat_ignore = combat_ignore@generators_monolith_base

 

[walker@generators_monolith_base_perimetr_guard_1]
path_walk = generators_monolith_base_perimetr_guard_1_walk
path_look = generators_monolith_base_perimetr_guard_1_look

 

[death@generators_monolith_base_perimetr_guard_1]
on_info = %+monolith_base_perimetr_guard_1_dead%

 

;-- Охранник-2 внутреннего периметра базы
[logic@generators_monolith_base_perimetr_guard_2]
active = walker@generators_monolith_base_perimetr_guard_2
on_death = death@generators_monolith_base_perimetr_guard_2
combat_ignore = combat_ignore@generators_monolith_base

 

[walker@generators_monolith_base_perimetr_guard_2]
path_walk = generators_monolith_base_perimetr_guard_2_walk
path_look = generators_monolith_base_perimetr_guard_2_look

 

[death@generators_monolith_base_perimetr_guard_2]
on_info = %+monolith_base_perimetr_guard_2_dead%

 

;-- Охранник пленника
[logic@generators_monolith_base_prisoner_guard]
active = walker@generators_monolith_base_prisoner_guard
on_death = death@generators_monolith_base_prisoner_guard
combat_ignore = combat_ignore@generators_monolith_base

 

[walker@generators_monolith_base_prisoner_guard]
path_walk = generators_monolith_base_prisoner_guard_walk
path_look = generators_monolith_base_prisoner_guard_look

 

[death@generators_monolith_base_prisoner_guard]
on_info = %+monolith_base_prisoner_guard_dead%

;--------------------------------------------
[combat@generators_monolith_base_snipers]
combat_type = monolith

 

[danger_condition@generators_monolith_base_snipers]
danger_expiration_time = 60000
danger_inertion_time =  90000

 

[combat_ignore@generators_monolith_base]
combat_ignore_cond = {=check_fighting(10010)}

;--------------------------------------------

 

 

З.Ы. Если 1 НПС относящийся к одному гулагу принудительно должен находиться некоторое время на территории другого (играет роль пленного), ему нужно создавать отдельное место в этом гулаге, или он никуда не уйдет? При необходимости добавлю секции из all.spawn.

Изменено пользователем Stalker_AleX333

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

Нужно вывести стандартное текстовое сообщение, конструкции вида:

function message()
    news_manager.send_tip(db.actor, "%c[255,255,128,128]Автор сообщения\n%c[default]Текст сообщения", 0, "wolf", 17000)
end

или

local text = "текст"
function test()
    news_manager.send_tip(db.actor, text, 0, "trader", 20000)
end

не подходят, т.к. не имеется возможности настроить отображаемую иконку отправителя. Попробовал так (вызывается из спейс-рестриктора, предварительно пройдя через xr_conditions.script):

 

function restrictor_alex_squad_send_sos_signal()
	local alex_squad_send_sos_signal = alex_mod_tasks.alex_squad_send_sos_signal() == true
end 

 

 

function alex_squad_send_sos_signal()
	local alex_squad_sos_signal_text = "Мужики, выручайте! На мою группу напал отряд 'монолитовцев', мы на Генераторах - тут нет излучения! Координаты прилагаю."
	db.actor:give_game_news(alex_squad_sos_signal_text, "ui\\ui_iconsTotal",Frect():set(498,282,83,47), 0, 7000)
end

- работает криво. Дублируется раз 10 и вместо текста вываливаются "кракозябры", да и иконка отображается дефолтная.

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Кто-нибудь знает, из-за чего эта байда:

Открытие потока...
* phase time: 4 ms
* phase cmem: 214575 K
Загрузка формы объектов...
* phase time: 233 ms
* phase cmem: 224784 K
Загрузка шейдеров...
stack trace:

0023:0049FF36 XR_3DA.exe, CEffect_Rain::Render()
0023:00493DD0 XR_3DA.exe, CKinematicsAnimated::BoneChain_Calculate()

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

Изменено пользователем Stalker_AleX333

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

Народ, заметил у себя такую занятную "проблемку": заспавненные через СДК мобы, привязанные к своим гулагам (созданным также через СДК) на локации не уходят в оффлайн (на дистанции свыше 150м от ГГ, если я не ошибаюсь). Есть идеи, как подобное исправить?

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

@AndreySol, Отбой. В СДК ничего править не нужно было.  Просто в скрипте гулагов был принудительно включен онлайн. 

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

Существует ли возможность задать условие спавна физического объекта и желательно, его уничтожения через all.spawn по аналогии с НПС и мобами?

 

Если нет, то каким образом в заспавненном через скрипт объекте указать и логику и список костей которыми объект будет прекреплен (аналог fixed_bones из all.spawna).

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

@Сталкер-Стрелок, по возможности, хотелось бы иметь перед глазами пример такого использования классов. Или хотя-бы любую модификацию, где использовали подобный "трюк". Ибо скриптописание не моя стизя.

З.Ы. А касательно правок схемы для all.spawna, я не совсем понял. Что необходимо править? И связаны ли правки с ковырянием движка игры? Если да - такая задача мне явно не по силам. Во-всяком случае пока-что...

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Я конечно в скриптах полное днище, но почему не происходит спавна объекта понять не могу (на другой функции проверил - работает):

 

Сам спавн вызывается из логики выключателя:

 

 

[logic]
active = ph_button@air_conditioning_system_off

[ph_button@air_conditioning_system_off]
on_info     = {+lab_x7_air_conditioning_system_turned_on} ph_idle@nil
anim        = lab_primary_switcher_idle
tooltip     = tips_lab_x7_air_conditioning_system_switcher
on_press    = ph_button@air_conditioning_system_on %=lab_x7_air_conditioning_system_turned_on%

[ph_button@air_conditioning_system_on]
anim        = lab_primary_switcher_off

[ph_idle@nil] 

 

 

 

Дальше, стандартная переброска вызова функции из xr_effects.script в свой скрипт:

 

 

function lab_x7_air_conditioning_system_turned_on()
	db.actor:db.actor:give_info_portion("lab_x7_air_conditioning_system_turned_on") 
	this.remove_all_lab_x7_static_ventilators()
	this.create_lab_x7_animated_ventilators()
end

function remove_all_lab_x7_static_ventilators()
	local id, obj
	for id=0, 65535 do
		obj = level.object_by_id(id)
		if obj ~= nil and obj:section() == "lab_x7_static_ventilators" then
			alife():release(alife():object(id), true)
		end
	end
end

function create_lab_x7_animated_ventilators() 
local ser_obj = alife():create("lab_x7_animated_ventilator",vector():set(-99.62,-18.25,73.64),2889,802) -- пока один, для тестов
	if ser_obj then
		local pk = m_netpk.get(ser_obj) 
			if pk and pk:isOk() then
		local data = pk:get() 
			if data and data.upd then
				data.fixed_bones = "link"
				pk:set(data)
			if data.custom_data:getString() == "lab_x7_animated_ventilator" then
				data.custom_data:setString("alex_mod\lab_x7_ventilators.ltx")
				end
			end
		end
	end
end 

 

 

 

Ну и секция предметов для спавна:

 

 

[lab_x7_static_ventilator]:identity_immunities
GroupControlSection 		= spawn_group
discovery_dependency 		= 
$spawn 				= "alex_mod\devices\lab_x7_static_ventilator"
class				= O_PHYS_S
cform				= skeleton
visual				= alex_mod\objects\ventilator_lab_static.ogf
custom_data			= scripts\alex_mod\lab_x7_ventilators.ltx
script_binding      		= bind_physic_object.init

[lab_x7_animated_ventilator]:identity_immunities
GroupControlSection 		= spawn_group
discovery_dependency 		= 
$spawn 				= "alex_mod\devices\lab_x7_animated_ventilator"
class				= O_PHYS_S
cform				= skeleton
visual				= physics\decor\ventilator_mike.ogf
custom_data			= scripts\alex_mod\lab_x7_ventilators.ltx
script_binding      		= bind_physic_object.init 

 

 

 

Может чего прописал не так, или не зарегестрировал?

 

З.Ы. Вспомнил, что помимо спавна и удаления объектов с логикой и прикрепленными костями, необходимо еще иметь возможность их разворота, аналогично all.spawn-ому. Надеюсь для этого тоже чего-нибудь придумали?

Изменено пользователем Stalker_AleX333

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
Stalker_AleX333, непонятно, что такое "стандартная переброска".

Обычная функция вида:

function test()
my_script.test()
end
db.actor:db.actor:give_info_portion

Тут должно быть db.actor:give_info_portion.

Описался когда последний раз правил сообщение. В скрипте данной ошибки нет.

 

Что мешает сразу поставить вентиляторы с анимированными моделями и переключать им анимации по получению инфопоршня?

Предполагаю, что требуются правки логики похожие на этот пример:

[collide]
ignore_static

[logic]
active   = ph_idle@ventilator_off

[ph_idle@ventilator_off]
anim     = idle
on_info  = {+lab_x7_air_conditioning_system_turned_on} ph_idle@ventilator_on

[ph_idle@ventilator_on]
anim     = work

Если кто-то знает больше - просветите, буду безмерно благодарен.

Изменено пользователем Stalker_AleX333

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@UnLoaded, как ни странно, но данный вариант тоже почему-то не хочет работать.

 

Опишу по порядку, что делал (общая схема работы думаю уже ясна: дергаем выключатель - начинают "работать" вентиляторы):

 

1. В СДК подгрузил модельку вентилятора, изменил под себя анимации (медленное вращение - (idle) и собственно, работа (work) - быстрое вращение).

Отдельно сделал копию модельки вентилятора с приставкой static, без анимаций. (для антуража, т.к. некоторые из них должны не работать)

 

2. Секция выключателя в all.spwne и его логика (выдаваемый им инфопоршень зарегистрировал):

 

 

Секция в all.spawnе:

[2247]

; cse_abstract properties
section_name = physic_object
name = labx7_ventilation_system_switcher
position = -79.8399963378906, -9, 54.939998626709
direction = -1.95476889610291, 0, 0
id = 65535
version = 118
script_version = 7
spawn_id = 8990

; cse_alife_object properties
game_vertex_id = 2870
level_vertex_id = 974
object_flags = 0xffffff3a
custom_data = <<END
[collide]
ignore_static

[logic]
cfg = scripts\alex_mod\lab_x7_ventilation_system_switcher.ltx
END

; cse_visual properties
visual_name = physics\keyboard\lab_primary_switcher

; cse_ph_skeleton properties
skeleton_name = lab_primary_switcher_idle

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10
fixed_bones = link

Последняя версия логики, на данный момент:

[logic]
active 	    = ph_button@ventilation_system_off

[ph_button@ventilation_system_off]
on_info     = {+lab_x7_ventilation_system_turned_on} ph_idle@nil
anim        = lab_primary_switcher_idle
tooltip     = tips_lab_x7_ventilation_system_switcher
on_press    = ph_button@ventilation_system_on %+lab_x7_ventilation_system_turned_on%

[ph_button@ventilation_system_on]
anim        = lab_primary_switcher_off

[ph_idle@nil] 

 

 

 

2. Секции для вентиляторов в all.spwne и их логика:

 

 

Пример секций в all.spawne для статичных и анимированных моделей:

[2358]

; cse_abstract properties
section_name = physic_object
name = labx7_ventilator_01
position = -99.6182250976563, -14.9479446411133, 73.6351470947266
direction = 0, -1.57079637050629, 0
id = 65535
version = 118
script_version = 7
spawn_id = 8959

; cse_alife_object properties
game_vertex_id = 2870
level_vertex_id = 974
object_flags = 0xffffff3a
custom_data = <<END
[collide]
ignore_static

[logic]
cfg = scripts\alex_mod\lab_x7_ventilators.ltx
END

; cse_visual properties
visual_name = alex_mod\objects\lab_x7_ventilator

; cse_ph_skeleton properties
skeleton_name = idle

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10
fixed_bones = link

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[2362]

; cse_abstract properties
section_name = physic_object
name = labx7_ventilator_05
position = -75.750862121582, -15.3341751098633, 55.7204208374023
direction = 0, 0, 0
id = 65535
version = 118
script_version = 7
spawn_id = 8963

; cse_alife_object properties
game_vertex_id = 2870
level_vertex_id = 974
object_flags = 0xffffff3a
custom_data = <<END
[collide]
ignore_static
END

; cse_visual properties
visual_name = alex_mod\objects\lab_x7_ventilator_static

; cse_ph_skeleton properties
skeleton_name =  

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10
fixed_bones = link 

Логика (для анимированных моделей):

[logic]
active      = ph_idle@ventilators_off

[ph_idle@ventilators_off]
on_info     = {+lab_x7_ventilation_system_turned_on} ph_idle@ventilators_on
anim        = idle

[ph_idle@ventilators_on]
anim        = work 

 

 

 

Собственно, вроде все, надеюсь ничего не забыл.

Изменено пользователем Stalker_AleX333

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

@UnLoaded, проверил оба файла логики - отработка нормальная, но анимки вентиляторов никак не изменяются.


upd. Проблему решил. Необходимо было изменить схему работы вентиляторов во второй части, с ph_idle на ph_button.

  • Согласен 1

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@UnLoaded, без проблем (проверил сейвами - анимка запоминается):

[logic]
active = ph_idle@ventilators_off

[ph_idle@ventilators_off]
on_info     = {+lab_x7_ventilation_system_turned_on} ph_button@ventilators_on

[ph_button@ventilators_on]
anim        = work
Изменено пользователем Stalker_AleX333

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@Charsi, как-то не подумал об этом сразу, спасибо.

 

Вот чего-то крашится такая конструкция:

 

all.spawn:

 

 

[2147]

; cse_abstract properties
section_name = space_restrictor
name = labx7_biohazard_space_restrictor
position = -81.5000610351563, -7.43783712387085, 86.2225875854492
direction = 0, 0, 0
id = 65535
version = 118
script_version = 7
spawn_id = 8991

; cse_alife_object properties
game_vertex_id = 2870
level_vertex_id = 974
object_flags = 0xffffef3e
custom_data = <<END
[logic]
cfg = scripts\alex_mod\lab_x7_biohazard.ltx
END

; cse_shape properties
shapes = 1
shape_0:type = box
shape_0:axis_x = 80,0,0
shape_0:axis_y = 0,60,0
shape_0:axis_z = 0,0,70
shape_0:offset = 0,0,0

; cse_alife_space_restrictor properties
restrictor_type = 0 

 

 

 

Логика:

 

 

[logic]
active = sr_idle@biohazard
 
[sr_idle@biohazard]
on_actor_inside = {+lab_x7_ventilation_system_turned_on} nil, {=lab_x7_biohazard_check_actor_outfit -lab_x7_actor_have_bioprotection_outfit} sr_timer@no_bioprotection_outfit, 
{=lab_x7_biohazard_check_actor_outfit +lab_x7_actor_have_bioprotection_outfit} sr_timer@with_bioprotection_outfit
 
[sr_timer@no_bioprotection_outfit]
type = dec
start_value = 72000
on_value = 0 | nil %=aes_kill_actor%
on_actor_outside = sr_idle@biohazard
on_info = {+lab_x7_ventilation_system_turned_on} nil
string = lab_x7_biohazard_attention

[sr_timer@with_bioprotection_outfit]
type = dec
start_value = 144000
on_value = 0 | nil %=aes_kill_actor%
on_actor_outside = sr_idle@biohazard
on_info = {+lab_x7_ventilation_system_turned_on} nil
string = lab_x7_biohazard_attention 

 

 

 

Скрипт:

 

 

function lab_x7_biohazard_check_actor_outfit()
    local outfit = db.actor:item_in_slot(6)
	if outfit:section() == "ecolog_outfit"
	or outfit:section() == "protection_outfit"	
        or outfit:section() == "seva_outfit" 
	or outfit:section() == "medic_seva_outfit"
	or outfit:section() == "svoboda_scientific_outfit"
	or outfit:section() == "dolg_scientific_outfit"	then
	db.actor:give_info_portion("lab_x7_actor_have_bioprotection_outfit")
	else
	return false
    end
end 

 

 

Изменено пользователем Stalker_AleX333

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

Нужно как-то подправить данную схему, последняя часть явно не выполняется:

[logic]
active = ph_button@ventilation_system_off

[ph_button@ventilation_system_off]
anim_blend = false
anim = button_false
tooltip = lab_x7_ventilation_system_switcher
on_press = ph_button@ventilation_system_on %=play_snd_from_obj(10015:ambient\switch_1) +lab_x7_ventilation_system_turned_on%

[ph_button@ventilation_system_on]
anim_blend = false
anim = button_true
on_info = {+lab_x7_ventilation_system_turned_on} sr_idle@ventilators_timer

[sr_idle@ventilators_timer]
on_timer = 15000 | %+lab_x7_ventilation_system_turned_on_play_snd% | 0 | nil %+lab_x7_ventilation_system_worked%

Пробовал как вариант:

[sr_idle@ventilators_timer]
type = dec
start_value = 15000
on_value = 13000 | %+lab_x7_ventilation_system_turned_on_play_snd% | 0 | nil %+lab_x7_ventilation_system_worked%

Но он по-ходу тоже не пашет, к тому же перебивает уже действующий таймер выводимый на худ.

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@Nazgool, постараюсь изложить всю схему кратко: ГГ находясь внутри рестриктора "получает" таймер, по истечении которого - собственно погибает. Если до окончания отсчета жмет определенную кнопку, проигрывается "привязанный" к ней звук, передается инфа для смены анимации на моделях вентиляторов. Запускается второй, скрытый таймер. Он дает два инфопоршня 1-ый - на проигрывание зацикленного звука на вентиляторах, 2-ой, отключает таймер (т.к. нужна некоторая задержка).

 

Остальные схемы (на всякий случай):

 

 

[logic]
active = sr_idle@biohazard
 
[sr_idle@biohazard]
on_actor_inside = {+lab_x7_ventilation_system_worked} nil, %=lab_x7_biohazard_check_actor_outfit% {-lab_x7_actor_have_bioprotection_outfit} sr_timer@no_bioprotection_outfit, %=lab_x7_biohazard_check_actor_outfit% {+lab_x7_actor_have_bioprotection_outfit} sr_timer@with_bioprotection_outfit
 
[sr_timer@no_bioprotection_outfit]
type = dec
start_value = 120000
on_value = 5 | %=play_snd(heart\2)% | 0 | nil %=aes_kill_actor%
on_actor_outside = sr_idle@biohazard
on_info = {+lab_x7_ventilation_system_worked} nil
string = lab_x7_biohazard_attention

[sr_timer@with_bioprotection_outfit]
type = dec
start_value = 155000
on_value = 5 | %=play_snd(heart\2)% | 0 | nil %=aes_kill_actor%
on_actor_outside = sr_idle@biohazard
on_info = {+lab_x7_ventilation_system_worked} nil
string = lab_x7_biohazard_attention 
[logic]
active = ph_idle@ventilators_off

[ph_idle@ventilators_off]
on_info = {+lab_x7_ventilation_system_turned_on} ph_button@ventilators_on_anim

[ph_button@ventilators_on_anim]
on_info = {+lab_x7_ventilation_system_turned_on_play_snd} ph_sound@ventilators_on_snd
anim = work

[ph_sound@ventilators_on_snd]
snd = lab_x7_ventilations_run
looped 	= true 

 

 

Изменено пользователем Stalker_AleX333

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@Charsi, не стал пихать on_timer в схему ph_button т.к. думал, что она ее не поддерживает.

 

@Nazgool, подправил. Без изменений. Похоже инфопоршни вообще не выдаются.

 

А что по поводу это схемы:

[logic]
active = ph_idle@ventilators_off

[ph_idle@ventilators_off]
on_info = {+lab_x7_ventilation_system_turned_on} ph_button@ventilators_on_anim

[ph_button@ventilators_on_anim]
anim = work
on_info = {+lab_x7_ventilation_system_turned_on_play_snd} ph_sound@ventilators_on_snd

[ph_sound@ventilators_on_snd]
snd = lab_x7_ventilations_run
looped 	= true

Звук будет проигрываться? Или нужно юзать play_snd_from_obj? Но она вроде как завязана на id-шник объекта. А эта логика используется на многих объектах одновременно.

Изменено пользователем Stalker_AleX333

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@Nazgool, оказывается в данной схеме нельзя использовать числовые приставки после on_timer. Значит придется разбивать на две схемы.

 

@Charsi, а как бы обойтись без указания айдишника? Или их можно перечислить подряд.

Изменено пользователем Stalker_AleX333

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@UnLoaded, именно так все и планировалось. И главная проблема даже не в том, как выдать тот или иной инфопоршень, а как зацикленно проигрывать звук на вентиляторах, учитывая то, что их много, а логика на всех одна. И, кстати, кнопка никак не "гудела" бы, у нее один айдишник, а у вентиляторов другие.

 

Короче, попробую-ка я замутить все это дело через рестрикторы "подвешанные" к вентиляторам. Разрабы так вроде делали.


upd. C рестрикторами тоже вышел облом. Звук не в какую не хочет проигрываться, хотя схема явно работает. Более того, я спокойно "подвесил" аналогичную на матюгальник - исполняющий роль сирены.

В общем, выложу все, что написал. Тут люди куда умнее меня в этих вопросах заглядывают, может увидят то, что я упустил:

 

Схема "биозагрязнения" (рестриктор):

 

 

[logic]
active = sr_idle@biohazard_start_timer

;Делаем небольшую задержку перед запуском всей схемы
[sr_idle@biohazard_start_timer]
on_timer = 4000 | sr_idle@biohazard_start 

;Проверяем включена ли сис. вентиляции, какой на ГГ надет костюм 
[sr_idle@biohazard_start]
on_actor_inside = {+lab_x7_ventilation_system_worked} nil, %=lab_x7_biohazard_check_actor_outfit% {-lab_x7_actor_have_bioprotection_outfit} sr_timer@no_bioprotection_outfit, %=lab_x7_biohazard_check_actor_outfit% {+lab_x7_actor_have_bioprotection_outfit} sr_timer@with_bioprotection_outfit

;Таймер - запускаемый при отключенной сис. вентиляции и отсутствии у ГГ костюма высокой степени биозащиты 
[sr_timer@no_bioprotection_outfit]
type = dec
start_value = 120000
on_value = 5 | %=play_snd(heart\2)% | 0 | nil %=aes_kill_actor%
on_actor_outside = sr_idle@biohazard_start
;Сис. вентиляции включена - отключаем таймер
on_info = {+lab_x7_ventilation_system_worked} nil
string = lab_x7_biohazard_attention

;Таймер - запускаемый при отключенной сис. вентиляции и наличии у ГГ костюма высокой степени биозащиты 
[sr_timer@with_bioprotection_outfit]
type = dec
start_value = 155000
on_value = 5 | %=play_snd(heart\2)% | 0 | nil %=aes_kill_actor%
on_actor_outside = sr_idle@biohazard_start
;Сис. вентиляции включена - отключаем таймер
on_info = {+lab_x7_ventilation_system_worked} nil
string = lab_x7_biohazard_attention 

 

 

 

Выключатель (система аварийной продувки):

 

 

[logic]
active = ph_button@ventilation_system_off

;Система вентиляции отключена
[ph_button@ventilation_system_off]
anim_blend = false
anim = button_false
tooltip = lab_x7_ventilation_system_switcher
; При юзании, отыгрываем звук кнопки, выдаем инфопоршень о включении системы вентиляции и отыгрывания звука на вентиляторах
on_press = ph_button@ventilation_system_on %=play_snd_from_obj(10015:ambient\switch_1) +lab_x7_ventilation_system_turned_on%

;Система вентиляции включена. Кнопка более не юзабельна
[ph_button@ventilation_system_on]
anim_blend = false
anim = button_true
;Запускаем внутренний таймер на 15 сек., (нужна задержка) по окончании выдаем инфопоршень о том, что сис. вентиляции работает
on_timer = 15000 | nil %+lab_x7_ventilation_system_worked% 

 

 

 

Собственно сами проблемные вентиляторы:

1. Схема смены анимации:

 

 

[logic]
active = ph_idle@ventilators_off

;Вентиляторы отключены. Отыгрывается анимация из all.spawnа. Ожидается запускающий инфопоршень
[ph_idle@ventilators_off]
on_info = {+lab_x7_ventilation_system_turned_on} ph_button@ventilators_on_anim

;Вентиляторы включены. Заменяем анимацию
[ph_button@ventilators_on_anim]
anim = work  

 

2. Схема для рестрикторов подвешанных к каждому вентилятору (по аналогии используеой разрабами в бункере под Радаром):

 

 

Спавн секция (образец):

[2370]

; cse_abstract properties
section_name = space_restrictor
name = labx7_ventilators_sound_space_restrictor
position = -99.5400009155273, -14.9499998092651, 73.620002746582
direction = 0, 0, 0
id = 65535
version = 118
script_version = 7
spawn_id = 8994

; cse_alife_object properties
game_vertex_id = 2870
level_vertex_id = 987
object_flags = 0xffffff3e
custom_data = <<END
[logic]
cfg = scripts\alex_mod\lab_x7_ventilators_sound.ltx
END

; cse_shape properties
shapes = 1
shape_0:type = sphere
shape_0:offset = 0,0,0
shape_0:radius = 1

; cse_alife_space_restrictor properties
restrictor_type = 3 

Логика:

[logic]
active = sr_idle@ventilators_off

;Вентиляторы отключены. Ожидается запускающий инфопоршень
[sr_idle@ventilators_off]
on_info = {+lab_x7_ventilation_system_turned_on} ph_sound@ventilators_on

;Устанавливаем зацикленный звук для вентиляторов
[ph_sound@ventilators_on]
snd = lab_x7_ventilators_run
looped = true

 

 

 

Матюгальник - сирена:

 

 

[logic]
active = ph_sound@biohazard_alarm_on

;Система вентиляции отключена. Сирена активна
[ph_sound@biohazard_alarm_on]
snd = lab_x7_biohazard_alarm
looped = true
on_info = {+lab_x7_ventilation_system_turned_on} ph_sound@biohazard_alarm_off

;Система вентиляции включена. Отключаем сирену
[ph_sound@biohazard_alarm_off]
snd = lab_x7_biohazard_alarm
looped = false
on_signal = sound_end| nil 

 

 

 

Все инфопоршни зареганы, звуки прописаны в sound_sheme.script.

Изменено пользователем Stalker_AleX333

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@Nazgool, подсунул заведомо рабочий звук - из пяти рестрикторов с одинаковой логикой и настройками, он проигрывается только на одном. Свой звук, на всякий случай, снова прогнал через СДК - он вообще не работает. Ничего не понимаю.

Изменено пользователем Stalker_AleX333

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   1 пользователь

AMK-Team.ru

×
×
  • Создать...