amik 253 Опубликовано 22 Января 2011 Поделиться Опубликовано 22 Января 2011 Люди может кто написать шпору по добавлению секций в acdc.pl? Пролазил две темы в поиске ответа на свой вопрос, нечего по сути не нашел. Ну собственно и вопрос задам. Как и куда прописать новую секцию аномалии (допустим zone_teleport_ххх) в acdc.pl чтобы чистый acdc_ТЧ его собрал? Искал подобные секции там нечего не увидел... Спасибо. Добавлено через 71 мин.: У меня acdc_x1 #author: bardak #this modified version by xiani Там секций типа ее:zone_mincer => 'se_zone_anom нету... Мой архив Сталкером не занимаюсь. Ссылка на комментарий
Bombastik 0 Опубликовано 22 Января 2011 Поделиться Опубликовано 22 Января 2011 Доброго времени суток. Такая картина: Адаптировал Blowout_Mod_1.0 Под пак локаций на версию 1,0004. Решил сверху прикрутить Stalkers_are_not_blind_0.99, но вылетает с логом: FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ...s\s.t.a.l.k.e.r\gamedata\scripts\bind_stalker.script:2: attempt to index global 'xr_motivator' (a nil value) Кто знает, что это такое, и как это лечиццо? Заранее благодарен. Ссылка на комментарий
TRAMP14 1 Опубликовано 22 Января 2011 Поделиться Опубликовано 22 Января 2011 2 строку bind_stalker пожалуйста В файле xr_motivator изменения какие либо проводились? Ссылка на комментарий
Bombastik 0 Опубликовано 22 Января 2011 Поделиться Опубликовано 22 Января 2011 function init (obj) xr_motivator.AddToMotivator(obj) end (первые 3 строки) xr_motivator дописывалось: ... --' Для зомбированных чуваков говорим что аномалий не существует -- if self.object:character_community() == "zombied" then local manager = self.object:motivation_action_manager() manager:remove_evaluator (stalker_ids.property_anomaly) manager:add_evaluator (stalker_ids.property_anomaly, property_evaluator_const(false)) if outfit_evaluator then manager:add_evaluator(1101, property_evaluator_const(false)) end else if ogsm_hideout then local manager = self.object:motivation_action_manager() manager:add_evaluator(ogsm_hideout.property_blowout, property_evaluator_const(false)) ... ... if tonumber(_G.main_menu.get_main_menu():GetGSVer()) <= 1.0004 then dialog_manager.load(self.object, reader) else self.npc_script_version = alife():object(self.object:id()).script_version dialog_manager.load(self.object, reader, self.npc_script_version) end dialog_manager.load(self.object, reader) trade_manager.load(self.object, reader) end ... ... -- Эвалюаторы, которые имеют высший приоритет, и, соответственно, перебивают остальные скрипты собой function addCommonPrecondition(action) --action:add_precondition (world_property(xr_evaluators_id.reaction,false)) if ogsm_hideout then action:add_precondition(world_property(ogsm_hideout.property_blowout, false)) action:add_precondition(world_property(ogsm_hideout.property_hideout_lost, false)) action:add_precondition(world_property(ogsm_hideout.property_inhide, false)) end action:add_precondition (world_property(xr_evaluators_id.stohe_meet_base + 1,false)) action:add_precondition (world_property(xr_evaluators_id.sidor_wounded_base + 0, false)) action:add_precondition (world_property(xr_evaluators_id.chugai_heli_hunter_base, false)) action:add_precondition (world_property(xr_evaluators_id.abuse_base, false)) if anomaly_evader then action:add_precondition (world_property(1099,false)) end if outfit_evaluator then action:add_precondition (world_property(1101,false)) -- outfit evaluator end end Ссылка на комментарий
Министр 3 Опубликовано 22 Января 2011 Поделиться Опубликовано 22 Января 2011 (изменено) TRAMP14, мало того, что ф-ия "убога", так и причем не один из указанных аргументов не используется, следовательно в ней они не нужны. function bandits_die() return has_alife_info("esc_kill_bandits_quest_kill") and not has_alife_info("esc_kill_bandits_noquest_kill") end Изменено 22 Января 2011 пользователем Министр Ссылка на комментарий
AKKK1 6 Опубликовано 22 Января 2011 Поделиться Опубликовано 22 Января 2011 (изменено) Добавлю про check_fighting Использование функции check_fighting сама функция находится в файле \gamedata\scripts\xr_conditions.script вот она -- проверка (по story_id) того, что нашим врагом есть хотя бы кото-то один из списка function check_fighting(actor, npc, p) local enemy = db.storage[npc:id()].enemy local sid if enemy and enemy:alive() then sid = enemy:story_id() for i, v in pairs(p) do --printf("_bp: %s.check_fighting(%d)", npc:name(), v) if type(v) == 'number' and sid == v then --printf("TRUE") return true end end end --printf("_bp: check_fighting() = false") return false end Вызывается из логики НПС секция [combat_ignore] пример логика бандитов АТП (игнорируюе Шустрого) файл gamedata\config\misc\gulag_escape.ltx ;------------------------------------------------------------------------------------------------- ;-- ESCAPE FACTORY BANDITS ;------------------------------------------------------------------------------------------------- [logic@esc_fabrika_bandit_walker1] active = walker1@esc_fabrika_bandit combat_ignore = combat_ignore [walker1@esc_fabrika_bandit] path_walk = day_walk1 path_look = day_look1 def_state_moving = raid def_state_moving_fire = raid_fire def_state_campering = threat def_state_campering_fire = threat_fire combat_ignore_cond = {=check_fighting(004)} игнорируют НПС с story_id = 4 004 это story_id Шустрого вот его секция в алл спавне cse_abstract properties section_name = stalker name = esc_shustryi position = 118.689079284668,-7.4942798614502,7.65357303619385 direction = 0,0,0 ; cse_alife_trader_abstract properties money = 5000 character_profile = esc_shustryi ; cse_alife_object properties game_vertex_id = 118 distance = 8.39999961853027 level_vertex_id = 422012 object_flags = 0xffffffbf custom_data = <<END [smart_terrains] esc_lager = true END story_id = 4 ; cse_visual properties visual_name = actors\novice\green_stalker_1 ; cse_alife_creature_abstract properties g_team = 0 g_squad = 0 g_group = 0 health = 2 dynamic_out_restrictions = dynamic_in_restrictions = upd:health = 2 upd:timestamp = 0x69206669 upd:creature_flags = 0x6e upd:position = 118.689079284668,-7.4942798614502,7.65357303619385 upd:o_model = 0 upd:o_torso = 0,0,0 upd:g_team = 0 upd:g_squad = 0 upd:g_group = 0 ; cse_alife_monster_abstract properties upd:next_game_vertex_id = 65535 upd:prev_game_vertex_id = 65535 upd:distance_from_point = 0 upd:distance_to_point = 0 ; cse_alife_human_abstract properties predicate5 = 1,1,0,0,2 predicate4 = 1,1,0,0 ; cse_ph_skeleton properties upd:start_dialog = ; se_stalker properties Игнорируемых НПС может быть несколько пример часть логики стукача на арм складах [5281] ; cse_abstract properties section_name = stalker name = mil_freedom_member0001 position = -178.503997802734,-16.9659557342529,352.31005859375 direction = 0,0,0 ; cse_alife_trader_abstract properties money = 5000 character_profile = mil_Svoboda_stukach ; cse_alife_object properties game_vertex_id = 1828 distance = 24.5 level_vertex_id = 144846 object_flags = 0xfffff7ff custom_data = <<END [logic] active = walker0 on_death = death combat_ignore = combat_ignore [walker0] path_walk = mil_freedom_courier_wait_path path_look = mil_freedom_courier_wait_look on_actor_dist_le = 12 | %=killactor% on_info = {+mil_actor_in_khutor_zone} walker1 [walker1] path_walk = mil_freedom_stukach_walk4 path_look = mil_freedom_stukach_look4 on_actor_dist_le_nvis = 12 | %=killactor% on_signal = arrive | remark1 combat_ignore_cond = {=check_fighting(712:713:714:719)} false [remark1] no_rotate = true no_move = true anim = wait_rac snd = mil_pavlik_to_ara on_signal = sound_end | %+mil_courier_call% remark2 on_actor_dist_le_nvis = 12 | %=killactor% target = mil_courier_look_point, 0 combat_ignore_cond = {=check_fighting(712:713:714:719)} false [remark2] anim = guard on_info = {+mil_ara_end} kamp1 on_actor_dist_le_nvis = 12 | %=killactor% target = mil_courier_look_point, 0 combat_ignore_cond = {=check_fighting(712:713:714:719)} false [kamp1] center_point = mil_freedom_khutor_center meet_enable = true meet_dialog = mil_dolg_relax_dialog danger = danger path_walk = mil_freedom_khutor_center_task radius = 3 on_actor_dist_le_nvis = 12 | %=killactor% combat_ignore_cond = {=check_fighting(712:713:714:719)} false Изменено 22 Января 2011 пользователем kokkai Ссылка на комментарий
TRAMP14 1 Опубликовано 23 Января 2011 Поделиться Опубликовано 23 Января 2011 Министр это функция из скриптов игры. Ещё хотел спросить по теме: что именно делает строка return? В справочнике написано что она "возвращает" а что именно возвращает? И как ето помогает? Ссылка на комментарий
IQDDD 5 Опубликовано 23 Января 2011 Поделиться Опубликовано 23 Января 2011 return без явного объявления возвращает nil, что в условий эквивалентно логической лжи. Ссылка на комментарий
Virus_450 0 Опубликовано 23 Января 2011 Поделиться Опубликовано 23 Января 2011 Кто может подсказать, как заспаунить НПС или предмет скриптом, но чтоб был game_story_id. Ссылка на комментарий
AKKK1 6 Опубликовано 23 Января 2011 Поделиться Опубликовано 23 Января 2011 (изменено) Для АМК. Спавн с выдачей SID_а: function spawn_mervin22() local obj=alife():create("esc_mervin22",vector():set(9.693,56.273,48.022),5205,2417) local params=amk.read_stalker_params(obj) params.custom="[logic]ncfg = scriptsnewesc_mervin22.ltx" params.sid=30139 amk.write_stalker_params(params,obj) end Для контроля назначнных SID_ов надо зарегистрировать Вашего НПС в файле: game_story_ids.ltx (gamedataconfig) по аналогии с остальными. Номер sid надо брать, чтобы он не дублировался с существующими, лучше назначить с "запасом", напрмер, как в примере, иначе будут вылеты с указанием на "дублирование сида". Удаление НПС по SID_у: function del_mervin22() local sim = alife() local se_obj = sim:story_object(30139) if se_obj then sim:release(se_obj, true) end end Автор не я взято с СП Изменено 23 Января 2011 пользователем Министр Ссылка на комментарий
ColR_iT 171 Опубликовано 23 Января 2011 Поделиться Опубликовано 23 Января 2011 (изменено) AKKK1, а без помощи функций АМК можно продемонстрировать? Уж очень было бы полезным... // Из ф-ий АМК там используется только разбор нет-пакета непися. Эта штука достаточна "объемная", лучше самому в скриптах АМК посмотреть. Министр. Изменено 23 Января 2011 пользователем Министр Ссылка на комментарий
Malandrinus 615 Опубликовано 23 Января 2011 Поделиться Опубликовано 23 Января 2011 IQDDD, return без явного объявления возвращает nil, что в условий эквивалентно логической лжи. Это почти так. Иногда встречал вылеты в такой ситуации и смысл сообщения был в том, что "значения нет вообще", а не то, что оно равно nil. В частности, пусть есть функция fun1, принимающая bool. Пусть есть вторая fun2, просто с return. У меня иногда был вылет в такой ситуации: fun1(fun2()) Особенно, если fun1 - движковая, а не скриптовая. В общем, если нужно вернуть логическое значение - верните nil или false, но не "ничего". AKKK1, Для АМК. Спавн с выдачей SID_а: Есть только одна проблема. При этом sid не регистрируется в игре, т.е. он назначен объекту, а поиск по нему делать не выйдет (ну и соответственно в логике не будет работать). Причём, вроде даже не поможет вывести объект в оффлайн, поскольку регистрация происходит при создании/загрузке серверного объекта. Т.е. придётся ждать смены уровня или сохранения/загрузки. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Nazgool 250 Опубликовано 24 Января 2011 Поделиться Опубликовано 24 Января 2011 (изменено) ...смысл сообщения был в том, что "значения нет вообще", а не то, что оно равно nil...иногда был вылет в такой ситуации: fun1(fun2()) О, вот и хороший пример. Спасибо. Р.S. При вскрытии luа5.1.dll в сообщениях об ошибках используется словосочитание "no value". Что-то не хватило ума его проэмулировать. Теперь могу :-) ...если нужно вернуть логическое значение - верните nil или false, но не "ничего". И не только в движке встречаются "непонятки". Я не раз попадал в подобные ситуации и в "чистом" Luа. Как раз замена значений, например, объявленных локальных переменных на конкретное значение , прекращало серию "непонятных" ошибок. Так что хочу подтвердить - (конечно ситуация ситуации рознь, но...) лучше используйте какое-либо значение. Изменено 24 Января 2011 пользователем Gun12 Ссылка на комментарий
gruber 2 481 Опубликовано 24 Января 2011 Поделиться Опубликовано 24 Января 2011 Иногда просматривая примеры логики из ресурсов игры,сталкиваюсь с командами и оверрайдами ,не описаными ни в одном справочнике.Ниже я сделал подборку таких примеров.Если кто то сможет дать пояснения по каким либо строкам или хотя бы предположить их назначение,буду очень благодарен,да и многим думаю пригодится hp_state = 0|wounded_heavy@help_heavy hp_state_see = 0|wounded_heavy@help_heavy hp_victim = 0|nil hp_fight = 0|false hp_cover = 0|false psy_state = 0 [danger@val_escort_captive] ignore_types = corpse какие типы можно еще сюда включить ignore_distance_sound = 2 ignore_distance_corpse = 0 -не противоречит ли это первой строке danger_inertion_time_hit = 1000 danger_inertion_time_sound = 500 danger_inertion_time_ricochet = 1000 no_retreat = true radius = 1 [follower@val_escort_captive_go_to_nap1] stub_for_corpse = true dont_change_job = true snd = speech -этот тип стоит у всех участников сцены ,но фразы они произносят разные on_actor_dist_le = 3 | mob_camp2 %=monster_berserk% -- интересует эффект в знаках процента on_info = nil %=disable_combat_handler% -так же on_info2 = {=hitted_by(412)} nil %=hit_npc(412:bip01_head:400:2700)% -сдесь так же ,особенно последнее условие combat_ignore_keep_when_attacked = true [sr_idle] on_actor_inside = sr_timer@1 %=play_snd(characters_voice\scenario\radar\rad_hat_1)% -можно ли прописывать путь к файлу звука непосредственно из логики не прописывая его в соунд теме скрипт и в скрипт саунд team = escape_attack_team -что дает присвоение тима reactions = ignore ---что дает эта команда no_rotate = true enemy_idle = 60000 radius = 20 show_spot = false leader = 720 stub_for_corpse = true distance = 0.5 Ссылка на комментарий
Якут 0 Опубликовано 24 Января 2011 Поделиться Опубликовано 24 Января 2011 (изменено) написал логику НПС в ЗП, но если НПС начинает обыскивать трупы он не возвращается на место а остаеться на месте где труп. active = walker@zaton_layr_0001 danger = danger_ignore@zaton_layr_0001 [danger_ignore@zaton_layr_0001] ignore_distance = 5 [walker@zaton_layr_0001] def_state_standing = ward_noweap path_walk = zaton_otomstit_stalker_01_way path_look = zaton_otomstit_stalker_01_look invulnerable = true meet = meet@zaton_layr_0001 on_info = {+info_zaton_layr_0001} walker@zaton_layr_000101 [walker@zaton_layr_000101] invulnerable = true path_walk = zaton_otomstit_stalker_02_way on_signal = path_end | walker@zaton_layr_00011 %+zaton_layr_0001_kvest% [walker@zaton_layr_00011] invulnerable = true path_walk = zaton_otomstit_stalker_03_way on_info = {+info_zaton_layr_tryp_1} remark@zaton_layr_00111 [remark@zaton_layr_00111] anim = ward_noweap path_walk = zaton_otomstit_stalker_03_way target = story | actor no_move = true meet = meet@zaton_layr_0001 [meet@zaton_layr_0001] close_anim = nil close_victim = nil far_anim = nil far_victim = nil close_distance = 0 far_distance = 0 close_snd_distance = 3 abuse = false use = {=actor_enemy} false, true allow_break = false meet_on_talking = false meet_on_talking = false Можно ли как-то запретить этому НПС обыскивать трупы Изменено 24 Января 2011 пользователем Якут Ссылка на комментарий
AKKK1 6 Опубликовано 24 Января 2011 Поделиться Опубликовано 24 Января 2011 gruber Спасибо мне тоже интересно что все это значит . Давайте попробуем разобраться. on_actor_dist_le = 3 | mob_camp2 %=monster_berserk% -- интересует эффект в знаках процента насколько я понимаю при дистанции = 3 вкючается схема mob_camp2 с эфектом %=monster_berserk% файл хр_эфект.скрипт вот функция function monster_berserk(actor, npc) npc:berserk() end что это значит ? может berserk некий параметр поведения? on_info = nil %=disable_combat_handler% сдесь более менее понятно -- Вызов этой функции отключит обработчик [combat] боя для персонажа. -- Используется в случаях, когда все необходимые действия, такие как переключение на другую секцию, -- уже выполнены, и повторно выполнять их во время боя нельзя (а условия секции [combat] проверяются на каждом -- апдейте, когда персонаж в бою, если, конечно, не отключены вызовом этой функции). function disable_combat_handler(actor, npc) if db.storage[npc:id()].combat then db.storage[npc:id()].combat.enabled = false end if db.storage[npc:id()].mob_combat then db.storage[npc:id()].mob_combat.enabled = false end end -- Вызов этой функции отключит обработчик [combat_ignore] перехвата боя для персонажа. function disable_combat_ignore_handler(actor, npc) if db.storage[npc:id()].combat_ignore then db.storage[npc:id()].combat_ignore.enabled = false end end on_info2 = {=hitted_by(412)} nil %=hit_npc(412:bip01_head:400:2700)% Функция function hit_npc(actor, npc, p) тоже более менее понятно (если кто более досконально разберет буду только рад) local h = hit() local rev = p[5] and p[5] == 'true' h.draftsman = npc h.type = hit.wound if type(p[1]) == 'number' then local hitter = level_object_by_sid(p[1]) if not hitter then return end if rev then h.draftsman = hitter h.direction = hitter:position():sub(npc:position()) else h.direction = npc:position():sub(hitter:position()) end else if rev then h.draftsman = nil h.direction = npc:position():sub(patrol(p[1]):point(0)) else h.direction = patrol(p[1]):point(0):sub(npc:position()) end end h:bone(p[2]) h.power = p[3] h.impulse = p[4] --printf("HIT EFFECT: (%s, %s,%d,%d) health(%s)", npc:name(), p[2], h.power, h.impulse, npc.health) npc:hit(h) end --[[ Дать обьекту, заданному story_id, хит. параметры: actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()] 1. sid - story_id обьекта, по которому наносится хит. 2. bone - строка. Имя кости, по которой наносится удар. 3. power - сила удара 4. impulse - импульс 5. hit_src - если число, то рассматривается как story_id обьекта, со стороны которого наносится хит (он же является и инициатором хита), иначе это точка (waypoint), из которой по объекту наносится хит. Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.--]] [sr_idle] on_actor_inside = sr_timer@1 %=play_snd(characters_voice\scenario\radar\rad_hat_1)% -можно ли прописывать путь к файлу звука непосредственно из логики не прописывая его в соунд теме скрипт и в скрипт саунд функция так же хотеось увидеть полный разбор от знаюших. -- играть звук в голове актёра function play_snd(actor, npc, p) if p[1] then local snd_obj = xr_sound.get_safe_sound_object(p[1]) --snd_obj:play(actor, p[2] or 0, sound_object.s2d) snd_obj:play_no_feedback(actor, sound_object.s2d, p[2] or 0, vector(), 1.0) end end -- играть звук от указанного объекта function play_snd_from_obj(actor, npc, p) if p[1] and p[2] then local snd_obj = xr_sound.get_safe_sound_object(p[2]) local obj = level_object_by_sid(p[1]) if obj ~= nil then printf("can't find object with story id %s", tostring(p[1])) -- snd_obj:play_at_pos(obj, obj:position(), sound_object.s3d) snd_obj:play_no_feedback(obj, sound_object.s3d, 0, obj:position(), 1.0) en end end -- играть звук от указанного объекта function play_snd_now(actor, npc, p) xr_sound.set_sound_play(npc, p[1]) end это все что я хоть немного понимаю может более знаюшие помогут разобраться полностью. Ссылка на комментарий
Nazgool 250 Опубликовано 24 Января 2011 Поделиться Опубликовано 24 Января 2011 (изменено) Иногда просматривая примеры логики из ресурсов игры,сталкиваюсь с командами и оверрайдами ,не описаными ни в одном справочнике Там много чего есть непонятного. Когда-то написал скрипт (никаких великих целей не ставил, поэтому потратил на него минут ... несколько), которым просмотрел папки config\scripts и config\misk и выбрал название всех секций и все записи, используемые в каждой из секций. До этого я считал, что знаю достаточно о логике :-) All_sections_SoC Правда писал специально для SciTE, поэтому на расширение не обращайте внимания Да и на значения тоже. Мне главнее были ключи. Изменено 24 Января 2011 пользователем Gun12 Ссылка на комментарий
antreg 178 Опубликовано 25 Января 2011 Поделиться Опубликовано 25 Января 2011 Добрый день! Существует ли такая схема логики для НПС в ТЧ 1.0004, чтобы этот самый НПС следовал за актёром, пока актёр не дойдёт в назначенную точку? Т.е нужна логика "догоняющего" НПС. "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Ссылка на комментарий
ColR_iT 171 Опубликовано 25 Января 2011 Поделиться Опубликовано 25 Января 2011 antreg, в чистом 1004 этого нет. Но есть мод который реализует такую возможность Схема "Компаньоны". Ссылка на комментарий
gruber 2 481 Опубликовано 25 Января 2011 Поделиться Опубликовано 25 Января 2011 (изменено) Есть схема фоловер,которая вроде бы отключена в игре,но тем не менее используется в некоторых моментах,к примеру в логике конвоиров долговца ,там в схеме одному из них присваивают "лидер" -остальные повторяют его действия и следуют по его пути,наверное можно лидером назначить актора leader = 720 stub_for_corpse = true distance = 0.5 -вот пример из тех ,что я спрашивал,просто я думал подробнее узнать о этой схеме и ее нюансах Изменено 25 Января 2011 пользователем gruber Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти