Это популярное сообщение. Dennis_Chikin 3 658 Опубликовано 16 Мая 2014 Это популярное сообщение. Поделиться Опубликовано 16 Мая 2014 Ковыряемся в файлах ТЧ Прежде чем писать в тему - внимательно читаем первый пост, и пользуемся поиском. Возможно, ответ на Ваш вопрос уже есть. Касательно телепатии: если Вы передаете Ваши файлы телепатическим путем - ответы будут передаваться тоже телепатически. Если Вы предлагаете угадать, отчего у Вас в подвале происходит странный стук - ответ будет передан стуком. 4 8 6 12 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Irish Rover 0 Опубликовано 28 Марта 2012 Поделиться Опубликовано 28 Марта 2012 Artos Т.е. юзать схему camper (для стоящего на одном месте сталкера)? Ссылка на комментарий
kratos888 0 Опубликовано 28 Марта 2012 Поделиться Опубликовано 28 Марта 2012 (изменено) А на мой вопрос будет хоть какой-нибудь намёк типа ответа? По поводу музыки в бункере у Сидрыча. Да, будет, точнее уже был... В общем, музыка, как ты и предполагал является частью карты. Лично смотрел в СДК. И на будущее - повторять свой вопрос не нужно, слепых на форуме нет, кто сможет тот ответит. ColR_iT Изменено 28 Марта 2012 пользователем ColR_iT Ссылка на комментарий
Artem_K. 75 Опубликовано 28 Марта 2012 Поделиться Опубликовано 28 Марта 2012 (изменено) ColR_iT, я имею ввиду как в Метро, когда поджигается фитиль у шашки, пространство вокруг освещено светом который излучает горящий фитиль и зажигалка, думаю тут понятно что к чему. Такое же требуется и в Сталкере, но вот класс гранат не имеет вспышки от выстрела, вот я и питаюсь узнать, можно ли сделать нормальную динамитную шашку как в Метро. Класс гранат, в принципе не имеет "выстрела". Боюсь, что тебя не правильно поймут, если ты не перефразируешь вопрос. ColR_iT Изменено 28 Марта 2012 пользователем ColR_iT Ссылка на комментарий
Artos 99 Опубликовано 28 Марта 2012 Поделиться Опубликовано 28 Марта 2012 Irish Rover, выше уже было сказано про переспрашивания ... Да и не зная, что тебе требуется невозможно давать какие либо советы о том, что тебе надобно иль достаточно. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Priboj37 324 Опубликовано 28 Марта 2012 Поделиться Опубликовано 28 Марта 2012 (изменено) kratos888, gamedata\sounds\scripts\magnitofon Ты бы вопрос прочитал бы сначала. ColR_iT Добавлено через 69 мин.: Оk, ошибся. B СГМ ТЧ eсть эти мaгнитофоны (в чистом ТЧ тоже есть, но он для декорации там стоит. --# ColR_iT). ps. A что, в aрхивe скриптa озвучки и пути к Сидору нeт? В смысле? Музыка у Сидора играет не через логику, а посредством Sound Source поставленный в SDK. Там не каких путей то и нет, разве что до папки с самим звуком. Это статический "объект". ColR_iT Добавлено через 27 мин.: B модe рaботaют < и дaстaют конкрeтно >. -- B aрхивe можно помeнять путь, зaмeнить или удaлить мeлодию? Извини, но опять не понял... Что в моде работают? В каком архиве? И Какой путь? ColR_iT Изменено 28 Марта 2012 пользователем ColR_iT Ссылка на комментарий
Isaac 0 Опубликовано 28 Марта 2012 Поделиться Опубликовано 28 Марта 2012 (изменено) Товарищи! Прошу помощи, я перенес собачек из билда Перегнал, настроил, ну все как надо Но вот вылет: Expression : capture_bone_id!=BI_NONE Function : CPHCapture::CPHCapture File : E:\stalker\sources\trunk\xr_3da\xrGame\PHCaptureInit.cpp Line : 83 Description : wrong capture bone Самое интересно в игру я зашел, после чего и побежал посмотреть на одну из них, и через секунд 5-8 вылет В чем же проблема? Что-то с костями намудрил. ColR_iT Изменено 28 Марта 2012 пользователем ColR_iT Ссылка на комментарий
Priboj37 324 Опубликовано 28 Марта 2012 Поделиться Опубликовано 28 Марта 2012 B aрхивe игры помeнять звук, возможно? Что бы в игрe, нe проигрывaлись одноврeмeнно двa. -- Почeму рeдaктировaть посты нe могу? Ссылка на комментарий
Irish Rover 0 Опубликовано 28 Марта 2012 Поделиться Опубликовано 28 Марта 2012 (изменено) Ок, напишу свой вопрос максимально грамотно. Изменил Волку логику на camper, прописал, всё что надо - стоит и смотрит. Smart terrain удалил. НО! После того, как по его заданию сбегаю на другую локацию и вернусь, его нет на месте, появляется чёрт знает где. Как исправить? [logic] active = camper combat_ignore = combat_ignore [combat_ignore] combat_ignore_cond = always [camper] path_walk = wolk_stoit path_look = wolk_smotrit Помогите разобраться, может, напутал чего, т.к. в логике я не особенно силён. Изменено 28 Марта 2012 пользователем Artos Ссылка на комментарий
Artos 99 Опубликовано 28 Марта 2012 Поделиться Опубликовано 28 Марта 2012 (изменено) Priboj37, все довольно просто: Хотим удалить дефолтный звук в бункере Сидоровича? Вариант 1 ("в лоб"): Заменяем в файл \gamedata\sounds\scripts\magnitofon\magnitofon_2.ogg на заглушку, т.е. берем $no_sound.ogg копируем и переименовываем ... Ву-а-ля, звук пропал. Вариант 2 (если звук magnitofon_2.ogg еще где-то задействован): а) открываем \gamedata\levels\l01_escape\level.snd_static в hex-редакторе и исправляем magnitofon_2 -> magnitofon_0; б) берем $no_sound.ogg, копируем в папку \gamedata\sounds\scripts\magnitofon\ и переименовываем его в magnitofon_0.ogg ... звук исчез. Добавлено через 16 мин.: Irish Rover, в подобных случаях нужно учитывать, что твой объект может быть задействован не только тобою (твоими скриптами). Если твоя фраза "Smart terrain удалил" не означает, что ты ему в алл.спавне или нет-пакетами в игре не поставил [smart_terrains] none = true, то смарт ты ему НЕ удалил, а только отключил явную привязку. В gulag_escape.script для Волка имеется персональная работенка и ... при первом удобном случае он ее может получить. Ну а при других условиях и вполне может уйти, как ему пописано, и на Склады ... Так что смотри сюжет и все связанное с Волком, и исправляй как тебе надобно. Изменено 28 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Driv3r 9 Опубликовано 30 Марта 2012 Поделиться Опубликовано 30 Марта 2012 (изменено) Всем привет! Помогите, пожалуйста. Вылет после получения тайника через инфопоршень. Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...f chernobyl\gamedata\scripts\treasure_manager.script:483: attempt to index a nil value ... -- Непись во время диалога дает наводку на тайник function npc_give_treasure (first, second) reject_percent = 0 get_treasure_manager():use(first) reject_percent = reject_percent_def end ... P.S. И комментировал/удалял - ничего. Ссылается на эту функцию. К стати, а что значит "получение тайника через инфопоршень"? ColR_iT Добавлено через 14 мин.: ColR_iT, запускается таймер. Через 10 секунд ГГ получает инфопоршень. На инфопоршне action -> treasure_manager.get_treasure_manager():give_treasure("тайник") Изменено 30 Марта 2012 пользователем Driv3r Ссылка на комментарий
ColR_iT 171 Опубликовано 30 Марта 2012 Поделиться Опубликовано 30 Марта 2012 (изменено) Driv3r, ну начнём с того, что в чистом ТЧ 1.0006 в файле treasure_manager.script всего то 241 строка, так что ну невероятно сложно понять, что же там понаписано в дополнительных 200 строках. Но в любом случае, тег <action>, скажем так, не предназначен для вызова функции с параметрами, единственно возможное решение это: <action>file_name.function_name</action> И только, без каких либо скобок и тем более параметров. Если тебе нужно, чтобы ГГ во время диалога получил тайник, то сделать это можно по аналогии с Лисом в чистой игре, где после его спасения от собак, в конце диалога ГГ получает тайник дальше по дороге. Происходит это благодаря вот такой записи: <action>escape_dialog.fox_pay_money</action> Если открыть саму функцию, то можно увидеть, собственно то, что тебе нужно: function fox_pay_money(actor, npc) dialogs.relocate_money(npc, 1500, "in") treasure_manager.get_treasure_manager():give_treasure("esc_secret_truck_goods") end Думаю дальше разберёшься. Изменено 30 Марта 2012 пользователем ColR_iT Ссылка на комментарий
Driv3r 9 Опубликовано 30 Марта 2012 Поделиться Опубликовано 30 Марта 2012 (изменено) ColR_iT, ясно, но нужно не задействовать НПС, только через таймер. Я взял treasure_manager.script из Zenobian mod'а. [spoiler=Вот сам скрипт:] local table_art = { {"af_medusa", 0.25, 0.15, 0, 0, 1, 1}, {"af_cristall_flower", 0, 0.04, 0.07, 0, 1, 1}, {"af_night_star", 0, 0, 0.05, 0.10, 1, 1}, {"af_vyvert", 0.25, 0.15, 0, 0, 1, 1}, {"af_gravi", 0, 0.04, 0.07, 0, 1, 1}, {"af_gold_fish", 0, 0, 0.05, 0.09, 1, 1}, {"af_blood", 0.25, 0.15, 0, 0, 1, 1}, {"af_mincer_meat", 0, 0.04, 0.07, 0, 1, 1}, {"af_soul", 0, 0, 0.05, 0.09, 1, 1}, {"af_electra_sparkler", 0, 0.05, 0.06, 0, 1, 1}, {"af_electra_flash", 0, 0.03, 0.06, 0, 1, 1}, {"af_electra_moonlight",0, 0, 0.05, 0.09, 1, 1}, {"af_rusty_thorn", 0, 0.05, 0.07, 0, 1, 1}, {"af_rusty_kristall", 0, 0.03, 0.06, 0, 1, 1}, {"af_rusty_sea-urchin", 0, 0, 0.05, 0.09, 1, 1}, {"af_ameba_slime", 0.25, 0.15, 0, 0, 1, 1}, {"af_ameba_slug", 0, 0.04, 0.06, 0, 1, 1}, {"af_ameba_mica", 0, 0, 0.05, 0.09, 1, 1}, {"af_drops", 0, 0.05, 0.07, 0, 1, 1}, {"af_fireball", 0, 0.03, 0.06, 0, 1, 1}, {"af_cristall", 0, 0, 0.05, 0.09, 1, 1}, {"af_dummy_glassbeads", 0, 0, 0, 0.06, 1, 1}, {"af_dummy_pellicle", 0, 0, 0, 0.06, 1, 1}, {"af_dummy_battery", 0, 0, 0, 0.06, 1, 1}, {"af_dummy_dummy", 0, 0, 0, 0.06, 1, 1}, {"af_dummy_spring", 0, 0, 0, 0.06, 1, 1}, {"af_fuzz_kolobok", 0, 0, 0, 0.06, 1, 1} } local table_ammo = { {"ammo_9x18_fmj", 0.30, 0.1, 0, 0, 2, 3}, {"ammo_9x18_pmm", 0, 0.05, 0.05, 0, 2, 3}, {"ammo_9x19_pbp", 0.15, 0.1, 0, 0, 2, 3}, {"ammo_9x19_fmj", 0, 0.05, 0.05, 0, 2, 3}, {"ammo_11.43x23_hydro", 0.20, 0.1, 0, 0, 2, 3}, {"ammo_11.43x23_fmj", 0, 0.05, 0.05, 0, 2, 3}, {"ammo_12x70_buck", 0.25, 0.1, 0, 0, 2, 3}, {"ammo_12x76_dart", 0.10, 0.1, 0.05, 0, 2, 3}, {"ammo_12x76_zhekan", 0, 0.05, 0.05, 0, 2, 3}, {"ammo_5.45x39_ap", 0, 0.15, 0.20, 0, 3, 5}, {"ammo_5.45x39_fmj", 0, 0.05, 0.10, 0, 3, 5}, {"ammo_9x39_sp5", 0, 0, 0, 0.08, 2, 3}, {"ammo_9x39_ap", 0, 0, 0, 0.08, 2, 3}, {"ammo_9x39_pab9", 0, 0, 0, 0.08, 2, 3}, {"ammo_5.56x45_ss190", 0, 0, 0.05, 0.08, 3, 5}, {"ammo_5.56x45_ap", 0, 0, 0, 0.08, 3, 5}, {"ammo_7.62x54_7h14", 0, 0, 0.05, 0.08, 3, 4}, {"ammo_7.62x54_7h1", 0, 0, 0, 0.08, 3, 4}, {"ammo_7.62x54_ap", 0, 0, 0, 0.08, 3, 4}, {"ammo_og-7b", 0, 0, 0, 0.08, 1, 1}, {"ammo_vog-25p", 0, 0, 0.05, 0.07, 2, 4}, {"ammo_vog-25", 0, 0, 0.05, 0.07, 2, 4}, {"grenade_f1", 0, 0.05, 0.1, 0, 2, 4}, {"grenade_rgd5", 0, 0.05, 0.1, 0, 2, 4}, {"ammo_m209", 0, 0, 0.05, 0.07, 2, 4}, {"ammo_gauss", 0, 0, 0, 0.07, 1, 2} } local table_medkit = { {"bandage", 0.40, 0.25, 0.15, 0.10, 3, 5}, {"medkit", 0.60, 0.45, 0.40, 0.30, 2, 3}, {"medkit_scientic", 0, 0.20, 0.25, 0.25, 2, 3}, {"medkit_army", 0, 0, 0, 0.15, 2, 3}, {"antirad", 0, 0.10, 0.20, 0.20, 2, 4} } local table_food = { {"nuts", 0.2, 0.2, 0.2, 0.2, 1, 1}, {"vodka", 0.2, 0.2, 0.2, 0.2, 1, 1}, {"energy_drink", 0.2, 0.2, 0.2, 0.2, 1, 1} } local table_cool = { {"outfit_dolg_m1", 0, 0, 0, 0.16, 1, 1}, {"outfit_killer_m1", 0, 0, 0, 0.17, 1, 1}, {"outfit_exo_m1", 0, 0, 0, 0.16, 1, 1}, {"wpn_vintorez", 0, 0, 0, 0.17, 1, 1}, {"wpn_val_m1", 0, 0, 0, 0.17, 1, 1}, {"wpn_rg6_m1", 0, 0, 0, 0.17, 1, 1} } local table_percent = {{30, 35, 35, 0, 0}, {0, 30, 40, 30, 0}} local treasure_manager = nil local reject_percent = 85 local mined_percent = 25 local drop_percent = 40 local reject_percent_def = reject_percent need_move_pstor_data = false function parse_spawns(line) if line == nil then return {} end --' если default-ов больше, чем значений в ini, то забить недостающие последним значением из ini local t = se_respawn.parse_names(line) local n = table.getn(t) local ret_table = {} local k = 1 while k <= n do local spawn = {} spawn.section = t[k] -- Проверяем что это не последняя запись if t[k+1] ~= nil then local p = tonumber(t[k+1]) -- проверяем что вторым числом задана вероятность, а не другая секция спавну if p then -- забиваем число spawn.prob = p k = k + 2 else -- забиваем дефолт 1 spawn.prob = 1 k = k + 1 end else spawn.prob = 1 k = k + 1 end table.insert(ret_table, spawn) end return ret_table end class "CTreasure" function CTreasure:__init() --' На конструкторе вычитываем LTX и создаем заготовки квестов. self.ini = ini_file("misc\\treasure_manager.ltx") --' Итерируемся по всем настройкам фраз if not self.ini:section_exist("list") then abort("There is no section [list] in treasure_manager.ltx") end local n = self.ini:line_count("list") local id, value = "","" --' начальная установка self.treasure_info = {} for i=0,n-1 do result, id, value = self.ini:r_line("list",i,"","") self.treasure_info[id] = {} self.treasure_info[id].target = utils.cfg_get_number(self.ini, id, "target", nil, true) self.treasure_info[id].name = utils.cfg_get_string(self.ini, id, "name", nil, true, "") self.treasure_info[id].description = utils.cfg_get_string(self.ini, id, "description", nil, true, "") self.treasure_info[id].items = parse_spawns(utils.cfg_get_string(self.ini, id, "items", nil, true, "")) local community = parse_names(utils.cfg_get_string(self.ini, id, "community", nil, false, "", "stalker, bandit, dolg, freedom")) self.treasure_info[id].community = {} for k,v in pairs(community) do self.treasure_info[id].community[v] = true end if self.treasure_info[id].items == nil then abort("cant find 'items' in %s", id) end self.treasure_info[id].condlist = xr_logic.parse_condlist(db.actor, "treasure_manager", "condlist", utils.cfg_get_string(self.ini, id, "condlist", nil, false, "", "")) --' Отметим тайник как новый self.treasure_info[id].active = false self.treasure_info[id].done = false --print_table(self.treasure_info) end --' Вспомогательные таблицы для облегчения поиска self.treasure_by_target = {} for k,v in pairs(self.treasure_info) do self.treasure_by_target[v.target] = k end self.loss_workaround_queue = {} end --' Юзание инициатора (возможность выдать тайник) function CTreasure:use(npc) printf("TREASURE USE") --' Проверим, не вызывались ли мы уже для этого объекта. local se_obj = alife():object(npc:id()) if se_obj.treasure_processed == true then return end se_obj.treasure_processed = true --' Нужно рандомно выбрать один из тайников. local avail = {} local tr_sum = 0 for k,v in pairs(self.treasure_info) do if v.done == false then local treasure_prob = xr_logic.pick_section_from_condlist(db.actor, npc, v.condlist) if treasure_prob == "" or treasure_prob == nil then treasure_prob = 0 end if tonumber(treasure_prob) >= 0 and v.community[npc:character_community()] == true and v.active == false then if tonumber(treasure_prob) == 100 then self:give_treasure(k, npc) else table.insert(avail, {k = k, prob = treasure_prob}) tr_sum = tr_sum + treasure_prob end end end end if tr_sum == 0 or math.random(100) < reject_percent then return end local tr_w = math.random(tr_sum) for k,v in pairs(avail) do tr_w = tr_w - v.prob if tr_w <= 0 then --' Выдать тайник self:give_treasure(v.k, npc) break end end end --' Сохранение function CTreasure:check() --' Проверка тайников for k,v in pairs(self.treasure_info) do --' Выдать тайник self:give_treasure(k) end end --' Выдача тайника function CTreasure:give_treasure(k, npc) local v = self.treasure_info[k] local sim = alife() local obj = sim:story_object(v.target) local actor_rank_number = ranks.get_obj_rank_number(db.actor) local npc_rank_number = ranks.get_obj_rank_number(npc) local rank_number = nil if (actor_rank_number == nil) then actor_rank_number = 1 end if npc_rank_number == nil then rank_number = actor_rank_number else rank_number = math.min(actor_rank_number, npc_rank_number) end if obj ~= nil then local pstor_obj local lobj = level.object_by_id(obj.id) if lobj ~= nil then pstor_obj = lobj else pstor_obj = db.actor end -- news_manager.send_treasure(v.name) --' Пометить на карте local text = "%c[255,238,155,23]"..game.translate_string(v.name).."\\n".."%c[default]"..game.translate_string(v.description).."\\n" -- level.map_add_object_spot_ser(obj.id, "treasure", text) --' Сгенерить вещи --' --' Из-за какого-то дефекта в xrGame.dll тайник потеряет --' сгенерированное содержимое в следующей ситуации: --' 1) получена ссылка на тайник, который находится в online; --' 2) игрок сохраняется и загружается; --' 3) между 1 и 2 не было переводов тайника в offline хотя бы раз. --' Для предотвращения этого создаём вещи у актёра, запоминаем --' идентификаторы, а в вызове actor_binder:update() переносим их --' в нужный ящик. local item_ids = {} local pos, lvid, gvid, pid, new_obj local need_workaround = level.object_by_id(obj.id) ~= nil if need_workaround then pos = db.actor:position() lvid = db.actor:level_vertex_id() gvid = db.actor:game_vertex_id() pid = db.actor:id() else pos = obj.position lvid = obj.m_level_vertex_id gvid = obj.m_game_vertex_id pid = obj.id end if self:named_treasure(v) then for kk,vv in pairs(v.items) do if ammo_section[vv.section] == true then local left, box_size = vv.prob, system_ini():r_u32(vv.section, "box_size") while left > box_size do new_obj = sim:create_ammo(vv.section, pos, lvid, gvid, pid, box_size) table.insert(item_ids, new_obj.id) left = left - box_size end if left > 0 then new_obj = sim:create_ammo(vv.section, pos, lvid, gvid, pid, left) table.insert(item_ids, new_obj.id) end else for i=1,vv.prob do new_obj = sim:create(vv.section, pos, lvid, gvid, pid) table.insert(item_ids, new_obj.id) end end local tmp_str = "" if kk > 1 then tmp_str = ", " else tmp_str = "" end --if string.find(text,add_dialogs.get_treasure_name(vv.section)) == nil then --text = text.."%c[255,155,238,23]"..tmp_str..add_dialogs.get_treasure_name(vv.section) --end end else local rnd = nil local t_rnd = nil local tables = {0, 0} for i=1,2 do rnd = math.random(100) t_rnd = 0 for kk,vv in pairs(table_percent[i]) do t_rnd = t_rnd + vv if t_rnd >= rnd then tables[i] = kk break end end end local mined = math.random(100) <= mined_percent local table_items = {} local mined_items_str = "" for i=1,2 do if tables[i] == 1 then table_items = table_art elseif tables[i] == 2 then table_items = table_ammo elseif tables[i] == 3 then table_items = table_medkit elseif tables[i] == 4 then table_items = table_food elseif tables[i] == 5 then table_items = table_cool else break end rnd = math.random() t_rnd = 0 for kk,vv in pairs(table_items) do t_rnd = t_rnd + vv[rank_number+1] if t_rnd >= rnd then for cnt=1,math.random(vv[6],vv[7]) do if tables[i] == 2 then new_obj = sim:create_ammo(vv[1], pos, lvid, gvid, pid, system_ini():r_u32(vv[1], "box_size")) table.insert(item_ids, new_obj.id) else new_obj = sim:create(vv[1], pos, lvid, gvid, pid) table.insert(item_ids, new_obj.id) end if mined then if new_obj ~= nil then if mined_items_str == "" then mined_items_str = tostring(new_obj.id) else mined_items_str = tostring(new_obj.id)..","..mined_items_str end end end end local tmp_str = "" if i ~= 1 then tmp_str = ", " else tmp_str = "" end if string.find(text,add_dialogs.get_treasure_name(vv[1])) == nil then text = text.."%c[255,155,238,23]"..tmp_str..add_dialogs.get_treasure_name(vv[1]) end break end end if tables[i] == 1 or tables[i] == 5 then break end end if mined_items_str ~= "" then xr_logic.pstor_store(pstor_obj, "mined_items_"..tostring(obj.id), mined_items_str) end end if need_workaround then self.loss_workaround_queue[v.target] = item_ids end text = text.."." news_manager.send_treasure(v.name) local rnd_spot = nil if actor_rank_number == 1 then rnd_spot = math.random(1,16) else rnd_spot = math.random(1,8) end level.map_add_object_spot_ser(obj.id, "treasure_"..actor_rank_number.."_"..rnd_spot, text) --' Пометим тайник как выданный self.treasure_info[k].active = true self.treasure_info[k].done = true else printf("TREASURE %s, target doesnt exist", k) end end function move_pstor_data() if need_move_pstor_data == true then for i=0,65535 do local mn_var = "mined_items_"..i local mn_val = xr_logic.pstor_retrieve(db.actor, mn_var, nil) if mn_val ~= nil then local box = level.object_by_id(i) if box ~= nil then xr_logic.pstor_store(box, mn_var, mn_val) db.storage[db.actor:id()].pstor[mn_var] = nil end end end end need_move_pstor_data = false end -- Непись во время диалога дает наводку на тайник [b]function npc_give_treasure (first, second) reject_percent = 0 get_treasure_manager():use(first) reject_percent = reject_percent_def end [/b] -- Проверка, может ли НПС дать наводку на тайник. Сделано на основе CTreasure:use() function CTreasure:can_use(npc) local se_obj = alife():object(npc:id()) if se_obj.treasure_processed == true then return false end local avail = {} local tr_sum = 0 for k,v in pairs(self.treasure_info) do if v.done == false then local treasure_prob = xr_logic.pick_section_from_condlist(db.actor, npc, v.condlist) if treasure_prob == "" or treasure_prob == nil then treasure_prob = 0 end if tonumber(treasure_prob) >= 0 and v.community[npc:character_community()] == true and v.active == false then if tonumber(treasure_prob) == 100 then return true else table.insert(avail, {k = k, prob = treasure_prob}) tr_sum = tr_sum + treasure_prob end end end end if tr_sum == 0 then return false end local tr_w = math.random(tr_sum) for k,v in pairs(avail) do tr_w = tr_w - v.prob if tr_w <= 0 then return true end end return false end --' Снимаем отметку с тайника --' Перенос содержимого для предотвращения возможной потери function CTreasure:loss_workaround() for k,v in pairs(self.loss_workaround_queue) do box = level_object_by_sid(k) if box == nil then abort("inv box nil") end dbglog("loss_workaround:box=%d", k) for kk,vv in ipairs(v) do dbglog(" item:name=%s", level.object_by_id(vv):name()) db.actor:transfer_item(level.object_by_id(vv), box) end end self.loss_workaround_queue = {} end --' Снимаем отметку с тайника function CTreasure:treasure_empty(box, box_story_id) printf("!!! treasure empty") local k = self.treasure_by_target[box_story_id] if k == nil or self.treasure_info[k] == nil then return end self.treasure_info[k].active = false for i=1,4 do for j=1,16 do level.map_remove_object_spot(box:id(), "treasure_"..i.."_"..j) end end level.map_remove_object_spot(box:id(), "treasure") end --' Сохранение function CTreasure:save(p) --' Сохраняем размер таблицы local size = 0 for k,v in pairs(self.treasure_info) do size = size + 1 end p:w_u16(size) for k,v in pairs(self.treasure_info) do p:w_u16(v.target) p:w_bool(v.active) p:w_bool(v.done) end end --' Загрузка function CTreasure:load(p) local t = p:r_u16() for i = 1,t do local k = self.treasure_by_target[p:r_u16()] self.treasure_info[k].active = p:r_bool() self.treasure_info[k].done = p:r_bool() end end -- проверка, является ли тайник именным function CTreasure:named_treasure(v) if v.name == "agr_secret_0000_name" --Tайник Серого or v.name == "treasure_888_0000_name" --Tайник Арни or v.name == "treasure_889_0000_name" --Tайник Tорпала or v.name == "gar_secret_0002_name" --Вещи Гризли or v.name == "gar_secret_0011_name" --Склад группы Стрелка or v.name == "gar_secret_0021_name" --Рюкзак Дохляка or v.name == "pri_secret_0003_name" --Хабар Клыка or v.name == "pri_secret_0004_name" --Запасы лидера Свободы or v.name == "rad_secret_0000_name" --Слад Угрюмого or v.name == "rad_secret_0004_name" --Запас группы отчаянных or v.name == "ros_secret_0015_name" --Tайник Счастливчика or v.name == "ros_secret_0018_name" --Ящик с медикаментами or v.name == "val_secret_0028_name" --Tайник Борова or v.name == "x18_secret_0000_name" --Tайник Копченого or v.name == "yan_secret_0011_name" --Tайник учёного then return true else return false end end function get_treasure_manager() if treasure_manager == nil then treasure_manager = CTreasure() end return treasure_manager end function use_box(box) local mn_var = "mined_items_"..box:id() local mined_items_str = xr_logic.pstor_retrieve(box, mn_var, nil) -- Проверка на заминированость if mined_items_str ~= nil then local item = nil local mined_items = parse_nums(mined_items_str) for kk,vv in pairs(mined_items) do item = alife():object(vv) local section = item:section_name() local ammo = false if item:clsid() == wpn_ammo then ammo = true end if item ~= nil then alife():release(item, true) if math.random(100) < drop_percent then if ammo == false then alife():create(section, box:position(), box:level_vertex_id(), box:game_vertex_id()) else alife():create_ammo(section, box:position(), box:level_vertex_id(), box:game_vertex_id(), nil, system_ini():r_u32(section, "box_size")) end end end end local dir = db.actor:direction() local snd = xr_sound.get_safe_sound_object([[weapons\f1_explode]]) local h = hit() h.power = 0.25 h.impulse = 300 h.type = hit.explosion h.direction = vector():set(-dir.x,dir.y,-dir.z) h.draftsman = db.actor snd:play_at_pos(db.actor, db.actor:position()) level.add_cam_effector("camera_effects\\head_shot.anm", 789, false, "") db.actor:hit(h) if db.storage[box:id()].pstor[mn_var] then db.storage[box:id()].pstor[mn_var] = nil end local story_id = box:story_id() take_item_from_box(box, story_id) -- Спавним и сразу же удаляем предмет для перерисовки инвентаря (по другому не знаю пока как) local obj = alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) if obj ~= nil then alife():release(obj, true) end end end function take_item_from_box(box, box_story_id, item) printf("!!! take item from box %s", tostring(box:is_inv_box_empty())) if box:is_inv_box_empty() == true then get_treasure_manager():treasure_empty(box, box_story_id) end end function save(p) get_treasure_manager():save(p) end function load(p) get_treasure_manager():load(p) end function clear_treasure_manager() treasure_manager = nil end P.S. Скрипт не понял, кто выдал тайник, вот и ругается - только предположение. Изменено 30 Марта 2012 пользователем Artos Ссылка на комментарий
ColR_iT 171 Опубликовано 30 Марта 2012 Поделиться Опубликовано 30 Марта 2012 (изменено) Driv3r, думаю не ошибусь, если скажу, что от куда именно скрипт - никому не интересно. К тому же 483 строка указывает на совершенно другой код, как в моде ZENOBIAN v0.0115, так и в том коде, что привёл ты. Предположение твоё глупое, поскольку нормально вызванная функция treasure_manager.get_treasure_manager():give_treasure("treasure_name") в любом случае выдаст тайник. Ты же вызываешь эту функцию не пойми как. Повторюсь: тег <action> не предназначен для вызова функции с параметрами. Я привёл 100% рабочий пример выдачи тайника через диалог. Если тебе принципиально делать так, как делаешь ты - пожалуйста, но сразу тебя огорчу, делаешь ты не правильно. Изменено 30 Марта 2012 пользователем ColR_iT Ссылка на комментарий
Artos 99 Опубликовано 30 Марта 2012 Поделиться Опубликовано 30 Марта 2012 (изменено) (чуть поправлю и дополню) Тайник, если указан в качестве аргумента (k) при вызове function CTreasure:give_treasure(k, npc) будет выдан, если нет каких-то ограничений на него (типа "уже выдан"). От аргумента npc тут зависит только расчет вероятности наполнения тайника и вполне этот аргумент может и отсутствовать. А вот ошибки при правке исходных скриптов НЕ следует допускать. В строке 315 исходного скрипта treasure_manager.script из мода читаем: for kk,vv in pairs(table_percent[i]) do - и посмотри, Driv3r, какова эта строка у тебя. Так же, при постинге кодов в своих сообщениях используй соответствующий тег [cоde], дабы сохранять читабельность скрипта (его форматирование/отступы). Изменено 30 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Driv3r 9 Опубликовано 30 Марта 2012 Поделиться Опубликовано 30 Марта 2012 ColR_iT, Artos, спасибо, ситуация ясна. Последний вопрос: есть функция напрямую вызова тайника. Как например db.actor:give_info_portion("ah"), только тайник. Например: db.actor:give_treasure("0000_esc_topol") Ссылка на комментарий
Artos 99 Опубликовано 30 Марта 2012 Поделиться Опубликовано 30 Марта 2012 (изменено) Driv3r Нет таких "прямых" функций, т.к. разработчики посчитали излишним заниматься подобной писаниной в скриптах. Если уже имеется: treasure_manager.get_treasure_manager():give_treasure("treasure_name") , то зачем же изобретать еще нечто аналогичное? Тайник и так выдается только актору и в специальном указании на это не нуждается, а имя - смотри процитированную функцию и твоя желаемая функция превратится в: treasure_manager.get_treasure_manager():give_treasure("0000_esc_topol") Изменено 30 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
xrPhoenix 0 Опубликовано 30 Марта 2012 Поделиться Опубликовано 30 Марта 2012 (изменено) За что отвечает параметр max_ignore_distance в m_stalker.ltx? А воспользоваться поиском по сайту/инету не судьба? Штатных толлкователей на форуме нет. --/Artos Изменено 30 Марта 2012 пользователем Artos Ссылка на комментарий
Хек 20 Опубликовано 31 Марта 2012 Поделиться Опубликовано 31 Марта 2012 Народ привет! Вроде в тему. Когда НПС просят гг спрятать ствол, целясь в Меченого ( косо немного ) Вопрос: не подскажете, как исправить( в каком файлике ), чтобы целились в лоб? Мы типа сталкеры, мы крутые Ссылка на комментарий
ColR_iT 171 Опубликовано 31 Марта 2012 Поделиться Опубликовано 31 Марта 2012 (изменено) Хек, в файле state_mgr.script закомментируй строки с 370 по 375, в них должен находится следующий код: Изменено 31 Марта 2012 пользователем ColR_iT Подправил... Ссылка на комментарий
ruslan.barc 0 Опубликовано 1 Апреля 2012 Поделиться Опубликовано 1 Апреля 2012 Всем доброго времени суток! Заранее извиняюсь, что не совсем по теме. но тема мода, в который я играю, закрыта и я не знаю куда написать У меня такая проблема (или это не проблема?): в консоли игры красным выдает вот такой текст "cannot find saved game - proctss_trade - unknown - device_pda_npc_device_pda_npc_35844". Таких строчек 8 и цифры в конце разные. Очень прошу подсказать (или направить в нужную тему) что это значит и что лучше всего делать: продолжать играть и не паниковать или же появилась реальная проблема? Спасибо. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти