Сергей Шубин
-
Публикаций
95 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные Сергей Шубин
-
-
58 минут назад, Paradox27kms сказал:Как удалить труп НПС по скрипту?
Прописать ему в спавн-секцию СТОРИ-ИД. Затем воспользоваться стандартной функцией
%=destroy_object(story:story_id_npc)%
- 1
-
Добрый день. Возник вопрос. Допустим, есть смарт-террайн. mar_b1, например.
Этот смарт может быть заселен враждебными ГГ сквадами, в том числе, находящимися в симуляции.
Рядом со смартом укрытие от выброса.
Как можно проверить, есть ли на смарте враждебные НПС?
-
Добрый вечер. Тестирую функции передачи от игрока квестовых предметов. В оригинальном Зове Припяти происходит трансферт предметов. Когда мы приносим Тесаку 6 банок тушенки, то они у него и остаются. Если грохнуть Тесака, то в этом можно убедиться.
Пробую функции для диалога, удаляющие квестовые предметы из игры. Получилось следующее.
Для одиночного предмета работает отлично.
Спойлерfunction esc_b3_atp_scout_medkit_out(actor, npc)
dialogs.relocate_object_ot_actor("medkit")
endfunction relocate_object_ot_actor(item)
local obj = db.actor:object(item)
if obj ~= nil then
alife():release(alife():object(obj:id()), true)
end
news_manager.relocate_item(db.actor,"out",item)
endНо если предметов два или несколько, то удаляется только один. Чтобы убрать два предмета, нужно в диалоге делать два экшена. Нашел такую функцию.
Спойлер
function esc_teleport_scaner_1_out(actor, npc)
dialogs.relocate_objects_ot_actor("teleport_scaner_1")
end
function relocate_objects_ot_actor(target_item)
local victim=db.actor
local function calc(temp,item)
if item~=nil then
if item:section()==target_item then
if alife():object(item:id()) then
alife():release(alife():object(item:id()),true)
news_manager.relocate_item(db.actor,"out",target_item)
end
end
end
end
victim:iterate_inventory(calc,victim)
endЭта функция убирает все предметы с данным именем. Есть в рюкзаке 10 автоматов, то уберет все подчистую. Вопрос такой. Как доработать первую функцию?
function relocate_object_ot_actor(item)
local obj = db.actor:object(item)
if obj ~= nil then
alife():release(alife():object(obj:id()), true)
end
news_manager.relocate_item(db.actor,"out",item)
endЧтобы можно было задать число удаляемых предметов.
-
Доброе утро. Возник вопрос. В файле xr_statistic обрабатываются переменные статистики ГГ. Как использовать эти значения в игровом процессе.
1. Как составить функцию - прекондишион для диалога? Должна возвращать true, если ГГ убил, например, 20 монстров.
2. Как составить функцию для xr_conditions в общем виде? Вызывается из логики рестриктора. Если ГГ выполнил, допустим, 5 квестов, то рестриктор переключается на следующую секцию.
-
4 минуты назад, liner сказал:В look вэйпоинте нужно прописать:
"wp00|t=время_ожидания_в_милисекундах"Там уже прописано время отыгрывания разных анимаций. Посмотреть в бинокль, почесать пятую точку, постоять с оружием, посидеть. Два параметра времени?
-
Добрый день. Написал для НПС такую работу.
Спойлер[esc_b1_base_5_look]
points = p0,p1,p2,p3,p4,p5
p0:name = wp00|a=guard|p=30|t=60000
p0:flags = 0x1
p0:position = -158.053024291992,-30.1030006408691,-358.866790771484
p0:game_vertex_id = 0
p0:level_vertex_id = 92731p1:name = wp00|a=guard_chasovoy|p=30|t=30000
p1:flags = 0x1
p1:position = -157.989273071289,-30.116340637207,-358.479614257813
p1:game_vertex_id = 0
p1:level_vertex_id = 92732p2:name = wp00|a=sit_ass|p=30|t=60000
p2:flags = 0x1
p2:position = -157.925903320313,-30.0917892456055,-359.192169189453
p2:game_vertex_id = 0
p2:level_vertex_id = 92731p3:name = wp01|a=binocular|p=30|t=60000
p3:flags = 0x2
p3:position = -152.068588256836,-30.3470077514648,-334.514709472656
p3:game_vertex_id = 0
p3:level_vertex_id = 100308p4:name = wp01|a=guard|p=30|t=60000
p4:flags = 0x2
p4:position = -152.18440246582,-30.3574905395508,-335.005310058594
p4:game_vertex_id = 0
p4:level_vertex_id = 100307p5:name = wp01|a=guard_chasovoy|p=30|t=30000
p5:flags = 0x2
p5:position = -151.915328979492,-30.3648796081543,-335.328765869141
p5:game_vertex_id = 0
p5:level_vertex_id = 100307
[esc_b1_base_5_walk]
points = p0,p1
p0:name = wp00
p0:flags = 0x1
p0:position = -147.962142944336,-30.0995025634766,-358.659576416016
p0:game_vertex_id = 0
p0:level_vertex_id = 105118
p0:links = p1(1)p1:name = wp01
p1:flags = 0x2
p1:position = -152.133804321289,-30.516227722168,-348.400451660156
p1:game_vertex_id = 0
p1:level_vertex_id = 100292
p1:links = p0(1)Он её выполняет. Можно ли как то задать время нахождения НПС на точках walk. Или это можно только сделать в логике?
-
Тогда, вероятно, модель кривая. Надо настраивать её в актор эдитор.
Смотрите тут.
- 1
-
16 минут назад, ForaCam сказал:Заменил вот модельку Сидора (ну надоела мне старая ...) и всё вроде бы хорошо , приветствие озвучивается , анимы проигрываются , вот только обчаться он никак не хочет , в смысле на курсор не реагирует совсем ... В чем может быть дело ? У конкретно Сидора какая-то своя специфика по замене ?
А при наведении курсора на Сидоровича надпись появляется? Типа сталкер такой то.
-
Добрый день. Возник такой вопрос.
У ГГ есть бустер - сканер телепортов. При использовании (активации) бустер подменяется другим предметом. Эта задача несложная. Но по моей задумке для успешной активации бустера нужен артефакт третьего ранга в рюкзаке ГГ. Как правильно написать функцию в общем виде? Функция должна вызываться из bind_stalker при использовании бустера.
Функция должна проверить, есть ли в рюкзаке ГГ хотя бы один артефакт из списка (артефакт третьего ранга) и удалить этот артефакт из рюкзака. Если таких артефактов в рюкзаке несколько одинаковых или разных, то рандомно удалить один из них.
Как правильно написать функцию в общем виде? Мне пока только последовательный перебор артефактов приходит в голову.
-
1 час назад, Ewgen_5057 сказал:Can't open section 'ammo 12x76'. Please attach [*.ini_log] file to your bug report
Как решить?Игра не может найти предмет ammo 12x76. Проверяйте файлы мода. Где-то должен упоминаться этот "коварный" патрон. В инвентаре НПС, в награде за квест, в тайнике, в качестве боеприпаса для оружия. Проверяйте везде. Когда найдете, исправьте ошибку, заменив патрон на ammo 12x76_zhekan. И вылет прекратится. Если лень искать, то можно добавить в игру патрон ammo 12x76.
-
Добрый вечер. Я подключил к Зову Припяти локацию Кордон. Заселил её. Организовал симуляцию. Сделал, как в оригинале. Чтобы сталкеры утром уходили на прогулку а вечером шли на базу.
Спойлер
army = {
squad = nil,
smart = { base = { prec = function(squad, target) return in_time_interval(18,8) and not xr_conditions.surge_started() and not travel_manager.check_squad_for_enemies(squad) and (target:name() == "esc_b1") end },
surge = { prec = function() return xr_conditions.surge_started() end },
territory= { prec = function() return in_time_interval(8,18) and not xr_conditions.surge_started() end },
resource = { prec = function(squad, target) return in_time_interval(8,18) and not xr_conditions.surge_started() end }
},
actor = nil
},
stalker = {
squad = nil,
smart = { base = { prec = function(squad, target) return in_time_interval(18,8) and not xr_conditions.surge_started() and not travel_manager.check_squad_for_enemies(squad) and (target:name() == "esc_b6") end },
surge = { prec = function() return xr_conditions.surge_started() end },
territory= { prec = function() return in_time_interval(8,18) and not xr_conditions.surge_started() end },
resource = { prec = function(squad, target) return in_time_interval(8,18) and not xr_conditions.surge_started() end }
},
actor = nil
},
bandit = {
squad = { stalker = { prec = function(squad, target) return in_time_interval(8,21) and not xr_conditions.surge_started() and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
smart = { base = { prec = function(squad, target) return in_time_interval(21,8) and not xr_conditions.surge_started() and not travel_manager.check_squad_for_enemies(squad) and (target:name() == "esc_b10") end },
territory= { prec = function() return in_time_interval(8,21) and not xr_conditions.surge_started() end },
surge = { prec = function() return xr_conditions.surge_started() end }
},
actor = nil
},Все работает как нельзя лучше. НПС утром дружно идут гулять, к ночи возвращаются на базы и ложатся в кроватки.
Воодушевился успехом и решил в этом же скрипте запретить монстрам заходить на базовые смарты.
Спойлер
monster_predatory_day = {
squad = { monster_vegetarian = { prec = function() return in_time_interval(6,19) end },
stalker = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
bandit = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
dolg = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
freedom = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
killer = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
smart = { territory= { prec = function() return in_time_interval(6, 19) and target:name() ~= "esc_b1" and target:name() ~= "esc_b2" and target:name() ~= "esc_b4" and target:name() ~= "esc_b6" and target:name() ~= "esc_b7" end },
lair = { prec = function() return in_time_interval(19,6) and target:name() ~= "esc_b1" and target:name() ~= "esc_b2" and target:name() ~= "esc_b4" and target:name() ~= "esc_b6" and target:name() ~= "esc_b7" end }
},
actor = { prec = function(squad, target) return in_time_interval(6, 19) and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
monster_predatory_night = {
squad = { monster_vegetarian = { prec = function() return in_time_interval(21,6) end },
stalker = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
bandit = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
dolg = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
freedom = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end },
killer = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},
smart = { territory= { prec = function() return in_time_interval(19,6) and target:name() ~= "esc_b1" and target:name() ~= "esc_b2" and target:name() ~= "esc_b4" and target:name() ~= "esc_b6" and target:name() ~= "esc_b7" end },
lair = { prec = function() return in_time_interval(6,19) and target:name() ~= "esc_b1" and target:name() ~= "esc_b2" and target:name() ~= "esc_b4" and target:name() ~= "esc_b6" and target:name() ~= "esc_b7" end }
},
actor = { prec = function(squad, target) return in_time_interval(19,6) and simulation_objects.sim_dist_to(squad, target) <= 150 end }
},И получил зеленое насекомое.
СпойлерFATAL ERROR
[error]Expression : !m_error_code
[error]Function : raii_guard::~raii_guard
[error]File : ..\xrServerEntities\script_storage.cpp
[error]Line : 748
[error]Description : ...ishing\Зов Припяти\gamedata\scripts\sim_board.script:107: attempt to index global 'target' (a nil value)
stack trace:
107 строка --
smart = { territory= { prec = function() return in_time_interval(6, 19) and target:name() ~= "esc_b1" and target:name() ~= "esc_b2" and target:name() ~= "esc_b4" and target:name() ~= "esc_b6" and target:name() ~= "esc_b7" end },
Чем то движку не приглянулось указание смартов. Вопрос - чем? Можно ли запретить в sim_board конкретным фракциям лезть на конкретные смарты?
-
4 минуты назад, Seraph сказал:А в чём фокус-то?
Предложили идею для сценария. Сделать локацию, какой она может быть. Со множеством трупов, сгоревшей техникой.
И такую же локацию с нормальным заселением. Это пока так на уровне - наметки и прикидки. Если бы речь шла об одноразовом случае, то было бы просто. Расставил бы в СДК, то что надо. Потом убрал. А как спавнить то, что надо в процессе игры? Возможно, несколько раз.
С другой стороны, разрабы мода Связь Времен два Лиманска делать не стали. У них там ГГ попадает в параллельную реальность. Вот и возник вопрос. Даст ли СДК собрать локпак с двумя одинаковыми локами, поймет ли этот фокус движок игры.
-
Доброе утро. Встал такой вопрос.
Возможно ли собрать локационный пак с двумя одинаковыми локациями? Например, Затон и Затон-2 Причем, Затон-2 копия Затона. Спавн ло копиях локаций предполагается разным.
Движок и СДК поймут такой фокус? Или это напрасная трата времени?
-
Добрый день. Возник вопрос по правильной работе этих диалогов.
Скрипт, контролирующий диалог, в файле dialog_manager
Спойлерlocal precond_table = {
[1] = "dialogs.npc_stalker",
[2] = "dialogs.npc_bandit",
[3] = "dialogs.npc_freedom",
[4] = "dialogs.npc_dolg",
[5] = "dialogs.npc_army", -- моя правка
}function uni_dialog_precond(first_speaker, second_speaker)
local npc = dialogs.who_is_npc(first_speaker, second_speaker)
return character_community(npc) == "stalker" or
character_community(npc) == "bandit" or
character_community(npc) == "freedom" or
character_community(npc) == "dolg" or
character_community(npc) == "army" -- моя правка
endДобавил к традиционным для Зова Припяти пятую фракцию - военных.
При попытке активации диалога с воякой ловлю жука. Со сталкерами диалог работает нормально.
СпойлерFATAL ERROR
[error]Expression : !phrase_dialog->m_PhraseVector.empty()
[error]Function : CPhraseDialog::SayPhrase
[error]File : .\PhraseDialog.cpp
[error]Line : 146
[error]Description : No available phrase to say, dialog[dm_universal_dialog]
stack trace:
Где еще нужно прописать вояк, чтобы не вылетало?
-
Добрый день. Возник вопрос. Есть идея - сделать патрульный вертолет. Чтобы летал над локацией и атаковал монстров, бандитов и зомбированнных. Как этого добиться и делалось ли это в каких то модах?
-
С вертушкой разобрался. Сначала взял не ту модель. Теперь она красиво гудит и летает. Встала задача - НПС должен завалить её из РПГ. Выдал НПС РПГ. Вертушка у него над головой висит. И НПС палит не по вертушке, а куда то вдаль.
Спойлер[logic]
active = remark[remark]
anim = threat_fire
target = story | mar_a4_heli_1
invulnerable = true
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false
on_info = {=dist_to_actor_ge(90)} nil %=destroy_object%
on_info2 = {!actor_friend} %=actor_friend% -
Добрый вечер. Добавил в игру вертолет.
Спойлер[170]
; cse_abstract properties
section_name = helicopter
name = mar_a4_heli_1
position = 710.799987792969, 120, -960.900024414063
direction = 0, 0.785398185253143, 0
id = 65535
version = 128
script_version = 12
spawn_id = 167; cse_alife_object properties
game_vertex_id = 0
level_vertex_id = 115941
object_flags = 0xffffffb2
custom_data = <<END
[story_object]
story_id = mar_a4_heli_1[logic]
cfg = scripts\marsh\mar_a4_heli_1.ltx
END; cse_visual properties
visual_name = dynamics\vehicles\mi24\veh_mi24_u_02; cse_motion properties
; cse_ph_skeleton properties
skeleton_name = idle; cse_alife_helicopter properties
cse_alife_helicopter__unk1_sz = idle
engine_sound = vehicles\helicopter\helicopter;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[mar_a4_heli_1_start]
points = p0
p0:name = wp00
p0:flags = 0x1
p0:position = 700,120,-940.099975585938
p0:game_vertex_id = 10320
p0:level_vertex_id = 4294967295
[mar_a4_heli_1_task]
points = p0
p0:name = wp00
p0:flags = 0x1
p0:position = 349.630004882813,122,-137.449996948242
p0:game_vertex_id = 7
p0:level_vertex_id = 363400
[mar_a4_heli_1_way_1]
points = p0
p0:name = wp00
p0:flags = 0x1
p0:position = 650,120,-900
p0:game_vertex_id = 10320
p0:level_vertex_id = 4294967295
[mar_a4_heli_1_way_2]
points = p0
p0:name = wp00
p0:flags = 0x1
p0:position = 334.690002441406,122,-96.9800033569336
p0:game_vertex_id = 7
p0:level_vertex_id = 352390Спойлер[logic]
active = heli_move[heli_move]
path_move = mar_a4_heli_1_start
path_look = mar_a4_heli_1_way_1
max_velocity = 100
combat_ignore_cond = true
combat_ignore_keep_when_attacked = true
engine_sound = false
on_info = {+mar_a4_heli_1_start_task} heli_move@1
[heli_move@1]
path_move = mar_a4_heli_1_task
path_look = mar_a4_heli_1_way_2
max_velocity = 100
combat_ignore_cond = true
combat_ignore_keep_when_attacked = trueПри заходе на локацию с вертолетом имею жука
stack trace:
[error][ 87] : Параметр задан неверно.В чем может быть причина?
-
16 минут назад, shadept сказал:Просто я не нашел ему объяснения
Я бы написал так. Без рестрикторов.
Спойлерfunction item_task_give()
-- даем игроку квест
task_manager.get_task_manager():give_task("find_bus_quest")
endfunction quest_reward()
-- отдаем бабло игроку
dialogs.relocate_money_to_actor(first_speaker, second_speaker, 4000)
endfunction has_item_task(first_speaker, second_speaker)
return db.actor:object("vodka") ~= nil
endСпойлерДиалоги. Первый в принципе сойдет. А второй слегка переделать. Прекондишион в шапку диалога. Поршень убрать.
<dialog id="plateau_debil_autobus_start">
<dont_has_info>plateau_quest_autobus_started</dont_has_info>
<dont_has_info>plateau_quest_autobus_smth</dont_has_info>
<phrase_list>
<!-- квест на водку начало -->
<phrase id="0">
<text>Есть дело для меня?</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>Конечно. Принеси мне водку.</text>
<next>2</next>
<next>3</next>
</phrase>
<phrase id="2">
<text>Ну нахер.</text>
</phrase>
<phrase id="3">
<text>Хорошо.</text>
<give_info>plateau_quest_autobus_started</give_info>
<action>plateau_quest_autobus.item_task_give</action>
</phrase>
</phrase_list>
</dialog><dialog id="plateau_debil_autobus_end">
<precondition>plateau_quest_autobus.has_item_task</precondition>
<dont_has_info>plateau_quest_autobus_end</dont_has_info>
<phrase_list>
<!-- квест на автобус конец -->
<phrase id="0">
<text>Насчет водки...</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>Чё там?</text>
<next>2</next>
<next>4</next>
</phrase>
<phrase id="2">
<text>Вот он.</text>
<next>3</next>
</phrase>
<phrase id="3">
<give_info>plateau_quest_autobus_end</give_info>
<text>Хорошо. Вот, держи за работу.</text>
<action>plateau_quest_autobus.quest_reward</action>
</phrase>
<phrase id="4">
<text>Ещё занимаюсь этим делом...</text>
</phrase>
</phrase_list>
</dialog>Неплохо было бы добавить функцию на передачу бутылки заказчику.
-
В 15.02.2022 в 21:01, shadept сказал:Что я прописал не так?
В 15.02.2022 в 21:01, shadept сказал:<phrase id="1">
<text>Чё там?</text>
<next>2</next>
</phrase>
<precondition>plateau_quest_autobus.has_item_task</precondition>
<phrase id="2">
<text>Вот он.</text>
<next>3</next>
</phrase>Прекондишион еще странно вставлен. Между фразами.
-
В 15.02.2022 в 21:01, shadept сказал:function has_item_task(first_speaker, second_speaker)
-- проверка если у игрока есть предмет
if db.actor:object("vodka") ~= nil then
db.actor:give_info_portion("plateau_quest_autobus_has_item")
end
endВ таком виде проверка не сработает. Надо разделить. Как то так.
function has_item_task(first_speaker, second_speaker)
-- проверка если у игрока есть предмет
return db.actor:object("vodka") ~= nil
endА поршень выдать отдельно.
function has_item_task_1(first_speaker, second_speaker)
db.actor:give_info_portion("plateau_quest_autobus_has_item")
endЧерез рестриктор, например.
-
В 15.02.2022 в 21:01, shadept сказал:Что я прописал не так?
Для начала. Во втором диалоге на передачу водки предусмотрено разветвление. Водка есть - водки нет А вот перехода на 4 фразу с первой нет.
<phrase id="0">
<text>Насчет водки...</text>
<next>1</next>
</phrase>Должно быть что то вроде.
<phrase id="0">
<text>Насчет водки...</text>
<next>1</next>
<next>4</next>
</phrase> -
Добрый вечер.
В Зове Припяти есть возможность скриптом задать ориентацию ГГ. Что то вроде.
db.actor:set_actor_direction(0.035)
Для НПС есть такая возможность? Нужно принудительно заставить НПС смотреть в заданном направлении. Логика валкер не подходит, НПС стоит не на сетке.
Что нужно прописать в скрипте? Функция вызывается из логики этого самого НПС.
-
В 04.09.2021 в 17:15, Emmis сказал:Есть ли функция или способ удалить труппы определенного сквада в нужный момент?
Если ответ еще актуален, то можно сделать так.
Сквад из уникальных НПС. У каждого НПС стори-ид.
Команда на удаление =destroy_object(story:story_id_npc_1) =destroy_object(story:story_id_npc_2) =destroy_object(story:story_id_npc_3)
-
Добрый вечер. В свойствах артефактов в вашем моде есть параметр.
max_health_add = 0.00 ; Изменение величины здоровья 1 еденица = 0.01 (+ увеличение/- уменьшение)
У артефакта af_black_angel он равен max_health_add = 0.15 ;+15
Здоровье должно вроде восстанавливаться. Но при помещении артефакта в слот разом отнимается 15% здоровья. Затем оно постепенно восстанавливается. Параметр в какую сторону работает?
[CoP] Модострой: вопросница
в Уроки, вопросы и советы по созданию модов
Опубликовано
Такие логи обычно бывают при ошибках в логике НПС. Было бы неплохо посмотреть спавн-секции и файлы логики этих товарищей.
И заодно. Что скрывается под маской?