Space.Marine 466 Опубликовано 7 Мая 2020 Приветствую ! Старый мод "Stories by the bonfire v1.0". Как в xr_kamp.script сделать запрет на истории для Долга и Военных ? Там есть: Скрытый текст -- Если чувак знает истории, надо добавить их к лагерю if self.population > 1 and db.story_by_id[npc:id()] ~= nil then self.kamp_states["story"] = true self.kamp_states["post_story"] = true else self.kamp_states["story"] = false self.kamp_states["post_story"] = false end Думаю, что куда-то сюда надо... В общем прошу помощи. А то как-то не канонично получается, когда Долг и Вояки рассказывают голосами Сталкеров сталкерские байки.Сам скрипт полностью. Поделиться этим сообщением Ссылка на сообщение
Space.Marine 466 Опубликовано 7 Мая 2020 (изменено) 33 минуты назад, UriZzz сказал: наличия/отсутствия звуковых файлов этих баек в папках Это точная информация ? Просто сторисы ещё разрабами компания-разработчик (признана нежелательной)* были сделаны и лежат в оригинальных архивах игры- там в каждой папке stories - 50 файлов звуковых - это надо тогда заглушки делать - 300 штук... Изменено 7 Мая 2020 пользователем Space.Marine Поделиться этим сообщением Ссылка на сообщение
Space.Marine 466 Опубликовано 7 Мая 2020 1 час назад, Капрал Хикс сказал: В самом начале функции, Но тогда они не будут: -- играть на гармошке -- играть на гитаре -- анекдоты Надо как-то по другому... Поделиться этим сообщением Ссылка на сообщение
Space.Marine 466 Опубликовано 7 Мая 2020 (изменено) @Капрал Хикс Скрытый текст -- Если чувак знает истории, надо добавить их к лагерю if self.population > 1 and db.story_by_id[npc:id()] ~= nil and npc:character_community() ~= "military" and npc:character_community() ~= "dolg" then self.kamp_states["story"] = true self.kamp_states["post_story"] = true else self.kamp_states["story"] = false self.kamp_states["post_story"] = false end end Так нормально ? Изменено 7 Мая 2020 пользователем Space.Marine 1 Поделиться этим сообщением Ссылка на сообщение
Space.Marine 466 Опубликовано 8 Мая 2020 4 минуты назад, UriZzz сказал: если сработало Всё работает. Долг и Вояки байки сталкерскими голосами не травят. 1 Поделиться этим сообщением Ссылка на сообщение
Space.Marine 466 Опубликовано 11 Мая 2020 (изменено) "New Sleep Mod" для ТЧ Скрытый текст FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ...stalker_fin_up\gamedata\scripts\sleep_manager.script:111: attempt to index local 'ph_element' (a nil value) stack trace: Регулярно вылетает с одной и той же ошибкой при разрушении какого нибудь объекта на локации. Сам sleep_manager.script : Скрытый текст --=======================================================-- -- Скрипт cна -- -- Авторы: Mechanic, Shoker, Z.E.N., Ab@dDon -- -- Может кого не указал, но скрипт брал из Zenoban Mod'а -- --=======================================================-- local table_sleep_zone = { -- Кордон: -- Матрас на чердаке в доме возле Лиса {"l01_escape", "m", nil, 140.09, 3.5, 336.91, 444961, 232, nil}, -- Матрасы в подвале в деревне новичков {"l01_escape", "m", "no_icon_1", -210.73, -22.9, -122.30, 42632, 59, nil}, {"l01_escape", "m", "icon_1", -210.34, -22.9, -125.75, 42632, 59, nil}, -- Свалка: -- Матрас в ангаре возле группы Серого {"l02_garbage", "m", nil, -70.34, -1.60, 19.88, 131025, 329, nil}, -- Матрас в вагончике возле заставы долга {"l02_garbage", "m", nil, 46.73, 1.56, 243.93, 218601, 359, nil}, -- Агропром: -- Матрасы в конце ж/д тунеля с аномалиями {"l03_agroprom", "m", "icon_2", 254.96, 0.15, 74.44, 428649, 498, nil}, {"l03_agroprom", "m", "no_icon_2", 257.46, 0.15, 73.50, 429416, 498, nil}, -- Подземелья Агропрома: -- Матрас в тайнике Стрелка {"l03u_agr_underground", "b", nil, -69.74, -6.87, -74.45, 3439, 717}, {"l03u_agr_underground", "m", nil, -69.74, -6.35, -74.45, 3439, 717, "allways"}, -- Бар: -- Матрасы на базе Долга {"l05_bar", "m", "icon_3", 232.28, -4.9, 131.44, 59301, 1200, nil}, {"l05_bar", "m", "no_icon_3", 232.08, -4.9, 135.36, 59301, 1200, nil}, -- Матрас в комнате Бармена (за барной стойкой) {"l05_bar", "b", nil, 115.85, -5.3, 12.0, 33756, 1239}, {"l05_bar", "m", nil, 115.85, -4.6, 12.0, 33756, 1239, "allways"}, -- Янтарь: -- Матрасы в бункере ученых на Янтаре {"l08_yantar", "m", "no_icon_4", 30.36, -10.98, -280.2, 54978, 1480, "allways"}, {"l08_yantar", "m", "icon_4", 27.68, -10.98, -280.2, 54978, 1480, "allways"}, -- Армейские склады: -- Матрасы на базе Свободы в казармах {"l07_military", "m", "no_icon_5", 14.07, -6.82, 13.1, 319840, 1582, nil}, {"l07_military", "m", "icon_5", 11.18, -6.82, 13.27, 317158, 1582, nil}, -- Матрас в комнате напротив Скряги {"l07_military", "m", nil, -25.39, -6.82, -26.74, 281271, 1593, nil} --[[ -- Это места, где можно поспать (требует начало новой игры) {"1", "2", "3", 4, 5, 6, 7, 8, "9", "10"} 1 - название уровня 2 - m или b (m - невидимый объект, при клике на который мы спим, b - кровать, для декорации) 3 - если написать что-нибудь в "" и !добавить! эту запись в таблицу ниже, то на глобальной/мини карте для этого матраса не будет иконки сна (только для невидимого объекта) 4,5,6 - координаты x,y,z соответственно 7,8 - level_vertex и game_vertex соответственно 9 - если стоит "allways" значит можно спать независимо от наличия рядом врагов (только для невидимого объекта) ]] } -- таблица матрасов, при использовании которых никогда не ставить метки local table_non_spot_sleep_zone = { ["no_icon_1"] = true, ["no_icon_2"] = true, ["no_icon_3"] = true, ["no_icon_4"] = true, ["no_icon_5"] = true } local mattress_id = {} local mattress_count = 0 local mattress_processed = 0 local first_scaling local left_scaling local last_health local ENEMY_RADIUS = 15 -- радиус врагов -- Обычный апдейт function update(delta) local mcnt = load_variable("matras_cnt", 0) for i=1, mcnt do local obj = level.object_by_id(load_variable(i.."_matras", 65000)) if obj then --------------------- --get_console():execute("THIS_IS_SPARTA!") --get_console():execute(obj:name()) local bone_name = get_ltx(obj:section(), "fixed_bone", "str") local ph_shell = obj:get_physics_shell() if not ph_shell then --get_console():execute("NO_PH_SHELL") return end local ph_element = ph_shell:get_element_by_bone_name(bone_name) if ph_element:is_fixed() then --get_console():execute("ART_FIXED") else --get_console():execute("FIXING_OBJECT") ph_element:fix() end --------------------- end end if db.actor == nil then return end if not db.actor:alive() then local hud = get_hud() local custom_static = hud:GetCustomStatic("hud_mattress") if custom_static ~= nil then hud:RemoveCustomStatic("hud_mattress") end end local actor = db.actor local pos = actor:position() local zn = actor_in_sleep_zone(pos) if load_variable("bed_spawned", false) == false then spawn_mattress() save_variable("bed_spawned", true) end if zn == "m" then local hud = get_hud() local custom_static = hud:GetCustomStatic("hud_mattress") if custom_static == nil then hud:AddCustomStatic("hud_mattress", true) end else local hud = get_hud() local custom_static = hud:GetCustomStatic("hud_mattress") if custom_static ~= nil then hud:RemoveCustomStatic("hud_mattress") end end end -- Update матраса(вешаем колбек если ещё не повесили) function mattress_update(obj) if mattress_count ~= mattress_processed then for kk,vv in pairs(mattress_id) do if vv[1] == obj:id() and vv[2] == false then vv[2] = true obj:set_callback(callback.use_object, this.mattress_use) obj:set_tip_text("tip_sleep") mattress_processed = mattress_processed + 1 end end end end -- Отлавливаем спавн матрасов и запоминаем их id function mattress_spawn(obj) mattress_count = mattress_count + 1 local m = {obj:id(), false} table.insert(mattress_id, m) end -- Юзаем матрас function mattress_use(obj, who) if test_for_can_sleep(obj) then ------------------------------- local hud = get_hud() local spwn = ui_sleep.sleep(hud) local frst local scnd level.start_stop_menu(spwn,true) -- можно ли ставить спот local valid = true for name, val in pairs(db.storage[db.actor:id()].pstor) do if table_non_spot_sleep_zone[name] and load_variable(name, -1) == obj:id() then valid = false end end if valid then if not level.map_add_object_spot_ser(obj:id(), "sleep_pointer", "Место для сна") then level.map_add_object_spot_ser(obj:id(), "sleep_pointer", "Место для сна") end end for i = 1, 5 do frst = load_variable("no_icon_"..i, -1) scnd = load_variable("icon_"..i, -1) if frst == obj:id() and not level.map_add_object_spot_ser(scnd, "sleep_pointer", "Место для сна") then level.map_add_object_spot_ser(scnd, "sleep_pointer", "Место для сна") end end ------------------------------- end end -- Игрок в зоне сна function actor_in_sleep_zone(pos) for i,z in pairs(table_sleep_zone) do if z[1] == level.name() and z[2] == "m" and actor_in_zone(z[4], z[5], z[6], 2, pos) then return z[2] end end return "" end -- Спавним всё, что нужно function spawn_mattress() for kk,vv in pairs(table_sleep_zone) do if vv[2] == "m" then local obj = alife():create("mattress", vector():set(vv[4], vv[5], vv[6]), vv[7], vv[8]) if vv[9] == "allways" then save_variable(obj:name().."_allways_sleep", true) end if vv[3] then save_variable(vv[3], obj.id) end end if vv[2] == "b" then local obj = alife():create("bed_matras", vector():set(vv[4], vv[5], vv[6]), vv[7], vv[8]) local i = load_variable("matras_cnt", 1) save_variable(i.."_matras", obj.id) save_variable("matras_cnt", i+1) end end end -- Проверка, можно ли спать function test_for_can_sleep(matras) local allways = load_variable(matras:name().."_allways_sleep", false) -- проверка на врагов if not allways then for a=1,65535 do local obj = level.object_by_id(a) if obj then if ((IsStalker(obj) and get_npc_relation(obj,db.actor)=="enemy") or IsMonster(obj)) and obj:position():distance_to(db.actor:position())<ENEMY_RADIUS then news_manager.send_tip(db.actor, "sleep_warning_enemy", nil, "default", 5000) return false end end end end -- проверка на радиацию if db.actor.radiation > 0 then news_manager.send_tip(db.actor, "sleep_warning_radiation", nil, "default", 5000) return false end return true end -- Спать function sleep(h) sleep_manager.start_sleep(h) end function start_sleep(scale) local sleep_ltx = ini_file ("scripts\\actorsleep.ltx") schemes["ar_sleep"] = "ar_sleep" ar_sleep.set_scheme(db.actor, sleep_ltx, "ar_sleep", logic) db.actor:stop_talk() db.actor:hide_weapon() level.disable_input() sleep_manager.starter (scale) end function starter(scale) last_health = db.actor.health left_scaling = scale first_scaling = scale _G.mus_vol = get_console():get_float("snd_volume_music") _G.amb_vol = get_console():get_float("snd_volume_eff") get_console():execute("snd_volume_music 0") get_console():execute("snd_volume_eff 0") game.start_tutorial("time_scaling") level.set_time_factor(3460) end -- Вызывается каждый час сна function stop_scaling() left_scaling = left_scaling - 1 if left_scaling + 1 == first_scaling and last_health > db.actor.health then sleep_manager.dreamer() news_manager.send_tip(db.actor, "sleep_warning_satiety_or_bleeding", nil, "default", 5000) elseif left_scaling > 0 and last_health <= db.actor.health then sleep_manager.hp_corrector(2) last_health = db.actor.health game.start_tutorial("time_scaling") elseif left_scaling > 0 and last_health > db.actor.health then sleep_manager.hp_corrector(12) last_health = db.actor.health game.start_tutorial("time_scaling") elseif left_scaling <= 0 and last_health > db.actor.health then sleep_manager.hp_corrector(12) db.actor.power = 1 last_health = db.actor.health sleep_manager.dreamer() elseif left_scaling <= 0 and last_health <= db.actor.health then db.actor.power = 1 sleep_manager.dreamer() end end function dreamer() level.set_time_factor(system_ini():r_float("alife","time_factor")) if sleep_manager.is_sleep_active() then get_console():execute("snd_volume_music "..tostring(_G.mus_vol)) get_console():execute("snd_volume_eff "..tostring(_G.amb_vol)) _G.amb_vol = 0 _G.mus_vol = 0 sleep_manager.stopper() end end function stopper() level.set_time_factor(system_ini():r_float("alife","time_factor")) ar_sleep.disable_scheme() if not db.actor:alive() then sleep_manager.onliner() else db.actor:restore_weapon() end level.enable_input() end -- Игрок умер во время сна function onliner() get_console():execute("snd_volume_music "..tostring(_G.mus_vol)) get_console():execute("snd_volume_eff "..tostring(_G.amb_vol)) _G.amb_vol = 0 _G.mus_vol = 0 end function hp_corrector(fr) db.actor.health = fr/12 end function is_sleep_active() if db.storage[db.actor:id()].active_scheme == "ar_sleep" then return true end return false end ----------------------------------------------------- -------------- Вспомогательные функции -------------- ----------------------------------------------------- -- Записываем переменную function save_variable(variable_name, value) xr_logic.pstor_store(db.actor, variable_name, value) end -- Загружаем переменную function load_variable(variable_name, value_if_not_found) return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found) end -- Удаляем переменную function del_variable(variable_name) if db.storage[db.actor:id()].pstor[variable_name] then db.storage[db.actor:id()].pstor[variable_name] = nil end end -- Проверка на наличие актора в области function actor_in_zone(x, y, z, r, pos) if math.pow(x-pos.x,2) + math.pow(y-pos.y,2) + math.pow(z-pos.z,2) <= math.pow(r,2) then return true else return false end end -- Узнаём отношения (взято из AMK) function get_npc_relation(obj,target) local rel = obj:relation(target) local relation if rel == game_object.neutral then relation = "neutral" elseif rel == game_object.friend then relation = "friend" elseif rel == game_object.enemy then relation = "enemy" else return false end return relation end -- Получаем строку из LTX файла function get_ltx(l_name,l_string,type) if system_ini():section_exist(l_name) and system_ini():line_exist(l_name, l_string) then if type=="bol" then return system_ini():r_bool(l_name, l_string) end if type=="num" then -- целое число return tonumber(system_ini():r_u32(l_name, l_string)) end if type=="num_float" then -- число с запятой return tonumber(system_ini():r_float(l_name, l_string)) end if type=="str" then return tostring(system_ini():r_string(l_name, l_string)) end if type==nil then return system_ini():r_u32(l_name, l_string) end end return nil end Изменено 11 Мая 2020 пользователем Space.Marine Поделиться этим сообщением Ссылка на сообщение
Space.Marine 466 Опубликовано 12 Мая 2020 12 часов назад, naxac сказал: добавь проверку, вот так: То есть заменить верхнее на то, что ты написал ? 2 Поделиться этим сообщением Ссылка на сообщение
Space.Marine 466 Опубликовано 18 Июля 2020 14 минут назад, mole venomous сказал: авторазряжание дропнутого оружия Для ТЧ и ЗП 1 Поделиться этим сообщением Ссылка на сообщение
Space.Marine 466 Опубликовано 24 Августа 2020 @Firestarter, а прописать броню в death_items_....ltx не проще ??? Поделиться этим сообщением Ссылка на сообщение
Space.Marine 466 Опубликовано 25 Апреля 2021 Приветствую ! Платформа ЗП. Попробовал перенести из мода на ТЧ скрипт на лечение раненых врагов. Собственно, вот что получилось: Скрытый текст local iTimer local npc_save function start_timer() iTimer = time_global() + 1*1000 end function timer_update() if iTimer and iTimer < time_global() then iTimer = nil npc_out_gulag(npc_save) end end function enemies_dialog_rep(first_speaker, second_speaker) local com = second_speaker:character_community() if com == "stalker" then db.actor:set_character_rank(db.actor:character_rank() + 40) elseif com == "killer" or com == "bandit" then second_speaker:set_character_community("stalker", 0, 0) db.actor:set_character_rank(db.actor:character_rank() + 30) npc_save = second_speaker start_timer() elseif second_speaker:character_community() == "dolg" then db.actor:set_character_rank(db.actor:character_rank() + 40) elseif second_speaker:character_community() == "freedom" then db.actor:set_character_rank(db.actor:character_rank() + 40) else second_speaker:set_character_community("stalker", 0, 0) db.actor:set_character_rank(db.actor:character_rank() + 30) end if second_speaker ~= nil then if com == "stalker" or com == "bandit" or com == "dolg" or com == "freedom" or com == "killer" then second_speaker:set_relation(game_object.friend, first_speaker) end end end function npc_out_gulag(second_speaker) local obj = alife():object(second_speaker:id()) local unreg_id = obj:smart_terrain_id() if unreg_id ~= 65535 and second_speaker:alive() then local unreg = alife():object(unreg_id) if unreg then unreg:unregister_npc(obj) end end npc_save = nil end meh.timer_update() - висит на апдейте в bind_stalker. enemies_dialog_rep(first_speaker, second_speaker) - вызывается из dialogs.script: Скрытый текст function transfer_medkit(first_speaker, second_speaker) if first_speaker:object("medkit") ~= nil then dialogs.relocate_item_section(second_speaker, "medkit", "out") --alife():release(alife():object(second_speaker:object("medkit"):id()), true) elseif first_speaker:object("medkit_army") ~= nil then dialogs.relocate_item_section(second_speaker, "medkit_army", "out") --alife():release(alife():object(second_speaker:object("medkit_army"):id()), true) else dialogs.relocate_item_section(second_speaker, "medkit_scientic", "out") --alife():release(alife():object(second_speaker:object("medkit_scientic"):id()), true) end alife():create("medkit_script", second_speaker:position(), second_speaker:level_vertex_id(), second_speaker:game_vertex_id(), second_speaker:id()) -- Тут надо анлочить аптечку для использования. xr_wounded.unlock_medkit(second_speaker) -- Лечение врагов if second_speaker:relation(first_speaker) == game_object.enemy then meh.enemies_dialog_rep(first_speaker, second_speaker) end first_speaker:change_character_reputation(10); end Всё, вроде, работает. Прошу проверить "грамотность" meh.script. Вопрос возник потому, что узнал, что неписей после принудительной смены community необходимо выводить из гулага. Раньше просто прям в dialogs.script было следующее: Скрытый текст if second_speaker:relation(first_speaker) == game_object.enemy then second_speaker:set_relation(game_object.friend, first_speaker) second_speaker:set_character_community("stalker", 0, 0) first_speaker:set_relation(game_object.friend, second_speaker) end first_speaker:change_character_reputation(10); end И также всё работало нормально. Просветите, пожалуйста, стоило вообще заморачиваться с meh.script или можно оставить всё как было без unregister_npc. P.S. Сам ни в коей мере не программист... Поделиться этим сообщением Ссылка на сообщение
Space.Marine 466 Опубликовано 28 Апреля 2021 Попросил помощи с проверкой скрипта на предыдущей странице, но в виду "оживлённой" беседы моё сообщение, видимо, просто осталось без внимания... Попрошу ешо раз: Поделиться этим сообщением Ссылка на сообщение
Space.Marine 466 Опубликовано 12 Июня 2021 (изменено) 7 часов назад, Colder сказал(а): Хотел добавить 2 кнопки Так в ЗП "взять всё" на кнопке Х забиндена, а в ТЧ легко в xml указывается кнопка на которой можно взять всё. Не проще ли посмотреть уже имеющееся в оригинале решение? Или это движковая фишка? Изменено 12 Июня 2021 пользователем Space.Marine Поделиться этим сообщением Ссылка на сообщение
Space.Marine 466 Опубликовано 7 Ноября 2021 4 часа назад, Firestarter сказал: Какие "стволы" группы соперников примут в обмен на искомый арт: А ты уверен, что у тебя "чистый" ЗП? 1 Поделиться этим сообщением Ссылка на сообщение
Space.Marine 466 Опубликовано 9 Ноября 2021 (изменено) 07.11.2021 в 16:01, Firestarter сказал: сколько нужно ждать времени/выбросом периодичность выбросов и начало первого выброса с начала новой игры регулируется в surge_manager.script. От взятого квеста на поиск артов периодичность выбросов, как и появление после них новых артов в аномалиях никак не зависит. Также появление артов в аномалиях после выбросов - рандомно. В скрипте (запамятовал уже в каком) можно указать процент вероятности появления в аномалиях артов после выбросов. Про обмен у групп сталкеров оружия на арты, если честно, слышу впервые, но, судя по скрипту, имеет место быть. Хотя, ИМХО, это совершенно бесполезная штука. Выгоднее просто продавать найденные арты Бороде. Также, с начала игры на Скадовске, мы ограничены детектором Медведь, который поможет нам найти малое кол-во артов из запрашиваемых Бородой. А с момента получения нами детектора помощнее (на Юпитере) пропадает смысл в торговле артами, так как ГГ уже почти миллионэр. Как-то так ) Изменено 9 Ноября 2021 пользователем Space.Marine 1 1 Поделиться этим сообщением Ссылка на сообщение
Space.Marine 466 Опубликовано 10 Ноября 2021 (изменено) 10 часов назад, Firestarter сказал: влияния выбросов на появление артов Тыц. Там для Misery, но какая разница. bind_anomaly_zone.script: if math.random(1,100) > 17 then Изменено 10 Ноября 2021 пользователем Space.Marine 1 Поделиться этим сообщением Ссылка на сообщение
Space.Marine 466 Опубликовано 11 Ноября 2021 14 часов назад, Firestarter сказал: что это означает процент шанса В оригинале вероятность появления новых артов в аномалиях после выброса 17%. 10.11.2021 в 09:44, Space.Marine сказал: if math.random(1,100) > 17 then 1 1 Поделиться этим сообщением Ссылка на сообщение