Здесь задают вопросы и получают на них ответы. Прежде чем задать вопрос, воспользуйтесь поиском по разделу, ответ на него, вероятно, уже есть.
Если у вас произошёл вылет, проверьте лог и поищите информацию об ошибке в справочнике. Также будет полезно посмотреть справочник ошибок. Если у Вас вылетает какой-то мод, то следует написать в тему этого мода.
Грамотно оформляйте свой пост, чётко доносите суть своего вопроса (ответа).
Благодарность выражаем в личке или же ставим плюсик в историю репутации. Подобные посты будут удаляться.
Даже боюсь разбираться..))))) запутаюсь, слишком много букв и файлов задействовано, пытаюсь по возможно максимально оставить оригинальное из игры, чтоб не потерять атмосферу из оригиналов. Вопрос просто возник по аналогиям, в ЗП есть этот файл в оригинале scripts\treasure_inventory_box.ltx, но я не соображу откуда он берёт наполнение этих тайников, в логике никаких указаний на конкретный файл или скрипт. Если я не ошибаюсь то в ЗП все тайники прописаны по названиям в каком то файле, и очевидно что тайники из локаций из ТЧ и ЧН там прописаны быть не могут. Поэтому и спросил. Или всё таки существует скрипт в ЗП на рандомное наполнение по этой логике?
не знаю, как в ЗП выдаются тайники. Скорее всего через диалог. Я просто предложил, взять систету тайников из ТЧ. Ничего сложного. Берём файл treasure_manager.script, переименовываем в treasure_man. В самом файле, для удобства, тож убираем anager. И через поисковик по файлам. В _g.script добавим ["treasure_man"] = true,. В bind_physic_object.script, вместо: -- Прожектор нужно биндить даже без logic if obj:clsid() ~= clsid.inventory_box then пишем:
Код
-- Прожектор нужно биндить даже без logic if ini and not ini:section_exist("drop_box") then if obj:clsid() ~= clsid.projector then return end
Строчку -- treasure_manager.use_box(obj, who) сокращаем до treasure_man.use_box(obj, who) В bind_stalker.script добавляем из ТЧ, вместо:
Цитата
function actor_binder:take_item_from_box(box, item) local box_name = box:name() end
Код
function actor_binder:take_item_from_box(box, item) local box_name = box:name() local story_id = box:story_id()
if story_id == nil then return end
treasure_man.take_item_from_box(box, story_id) end
В xr_effects.script, чтобы можно было выдавать тайник из логики, а не только снимать с трупов:
Код
function give_treas (actor, npc, p) if p == nil then abort("Required parameter is [NIL]") end for k,v in pairs(p) do treasure_man.get_treasure_man():give_treasure(v) end end
И последний скрипт xr_motivator.script. Так-же сравниваем ЗП и ТЧ файлы и правим, после -- self.need_relation_update = false добавим: self.treasure_processed = false После self:clear_callbacks() (211 строчка) self.object:set_callback(callback.use_object, nil) В use_callback, после: xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "use_callback", obj, who) end (350 строчка)
Код
elseif self.treasure_processed == false then treasure_man:get_treasure_man():use(self.object) self.treasure_processed = true
В function motivator_binder:save(packet), после object_binder.save(self, packet) (484 строчка) packet:w_bool(self.treasure_processed) Раскоментировать и укоротить -- treasure_manager.save(packet) (487 строчка) до treasure_man.save(packet) В function motivator_binder:load(reader) после object_binder.load(self, reader) (507 строчка) self.treasure_processed = reader:r_bool() Раскоментировать и сократить: -- treasure_manager.load(reader)( 510строчка) до treasure_man.load(reader)
Со скиптами всё. Далее новый файл в configs\misc\treasure_man.ltx. Пишем в него:
zat_secret_0001
[zat_secret_0001] target = 1 name = zat_secret_0001_name description = zat_secret_0001_descr items = ammo_5.45x39_ap,21,medkit_army,3 condlist = {=actor_on_level(zaton)} 10 community = stalker
Путь к файлу уже инициировали в скрипте: treasure_man.script: self.ini = ini_file("misc\\treasure_man.ltx") Потом в configs\game_story_ids.ltx пишем наши стори_иды: [story_ids] 001 = "zat_secret_0001"
Добавляем файл в СДК, спавним инвентори_бокс. Вот секция из all.spawn'a: ; cse_abstract properties section_name = inventory_box name = zat_inventory_box position = 256.648468017578, 19.251838684082, 543.304138183594 direction = 0.0711899995803833, -0.00395799987018108, 0.0555809997022152 id = 65535 version = 128 script_version = 12 spawn_id = 1866
Вроде всё. Простой копирайт из ТЧ. Четыре тайника заспавнил - выдаются и через скрипт и с трупов. А в самой ЗП, мне кажется, только скриптом. С трупов нет.
function parse_spawns(line) if line == nil then return {} end
--' если default-ов больше, чем значений в ini, то забить недостающие последним значением из ini -- local t = se_respawn.parse_names(line) local t = this.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_man.ltx")
--' Итерируемся по всем настройкам фраз if not self.ini:section_exist("list") then abort("There is no section
in treasure_man.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,"","")
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].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 end
function CTreasure:use(npc) printf("TREASURE USE") --' Нужно рандомно выбрать один из тайников. 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) 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) < 65 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) 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) local v = self.treasure_info[k] local obj = alife():story_object(v.target) if obj ~= nil then this.send_treas(v.name)
--' Пометить на карте local text = "%c[255,238,155,23]"..game.translate_string(v.name).."\\n".."%c[default]"..game.translate_string(v.description) level.map_add_object_spot_ser(obj.id, "treasure", text)
--' Сгенерить вещи for kk,vv in pairs(v.items) do
if ammo_section[vv.section] == true then this.create_ammo(vv.section,obj.position,obj.m_level_vertex_id,obj.m_game_vertex_id,obj.id,vv.prob) else for i=1,vv.prob do alife():create(vv.section,obj.position,obj.m_level_vertex_id,obj.m_game_vertex_id,obj.id) end end end
--' Пометим тайник как выданный self.treasure_info[k].active = true self.treasure_info[k].done = true else printf("TREASURE %s, target doesnt exist", k) end end
function send_treas(name) local news_caption = game.translate_string("st_found_new_treasure") if db.actor:is_talking() then db.actor:give_talk_message2(news_caption, "", "ui_inGame2_Polucheni_koordinaty_taynika", "iconed_answer_item") else db.actor:give_game_news(news_caption, "", "ui_inGame2_Polucheni_koordinaty_taynika", 0, 3000) end 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 level.map_remove_object_spot(box:id(), "treasure") xr_statistic.inc_founded_secrets_counter() 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_stringZ(k) 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 = p:r_stringZ() self.treasure_info[k].active = p:r_bool() self.treasure_info[k].done = p:r_bool() end end
function get_treasure_man() if treasure_man == nil then treasure_man = CTreasure() end return treasure_man end
function take_item_from_box(box, box_story_id) printf("!!! take item from box %s", tostring(box:is_inv_box_empty())) if box:is_inv_box_empty() == true then get_treasure_man():treasure_empty(box, box_story_id) end end
function save(p) get_treasure_man():save(p) end function load(p) get_treasure_man():load(p) end function clear_treasure_man() treasure_man = nil end
function create_ammo(section, position, lvi, gvi, pid, num) local ini = system_ini() local num_in_box = ini:r_u32(section, "box_size") while num > num_in_box do alife():create_ammo(section, position, lvi,gvi, pid, num_in_box) num = num - num_in_box end alife():create_ammo(section, position, lvi,gvi, pid, num) end
function parse_names( s ) local t = {} for name in string.gfind( s, "([%w_%-.\\]+)%p*" ) do table.insert( t, name ) end return t end
Сообщение отредактировал Arist - Вторник, 11.09.2018, 08:51
Да мне трупы и не нужны, суть вопроса, будут ли работать тайники на локациях из ТЧ и ЧН без правок чего то, и тем более скриптов. Не нужны мне такие переделки. Задача максимум оставить по оригиналу просто на движке ЗП...
Добавлено (11.09.2018, 12:05) --------------------------------------------- И ещё такая проблема обнаружилась, кто в теме подскажите, почему долговцу невозможно прописать калаш? в файле character_desc_bar.xml все нпс из долга кому в спавн секцию прописан или wpn_ak74 или wpn_ak74u
Стоят без оружия, при нападении на пост, все отстреливаются, а все у кого прописана такая секция, сломя голову убегают подальше от боя. валю НПС, он пустой, только аптечки и еда.... Все секции взяты из оригинала ЗП, из файла character_desc_general.xml Ничего не меняю кроме спавн секции, меняю на
Добавлено (11.09.2018, 14:56) --------------------------------------------- Не заметил строчку у тебя #include "gameplay\character_sell_weapons.xml" Добавил, проверил - первый без ствола, второй wpn_fort. Убил второго с оружием, первый щеманулся, только пятки сверкали
Не заметил строчку у тебя #include "gameplay\character_sell_weapons.xml" Добавил, проверил - первый без ствола, второй wpn_fort. Убил второго с оружием, первый щеманулся, только пятки сверкали
Что даёт эта строчка????? В оригинале то она есть... содержимое как раз то что не может быть у НПС??? По сути то по названию это связано с торговлей.
Добавлено (11.09.2018, 16:05) --------------------------------------------- Закоментил этот инклюд, и всё стало нормально, и стволы появились... Понять бы ещё каким боком это вылезло, это же вроде то чем можно торговать...
Сообщение отредактировал Policai - Вторник, 11.09.2018, 15:57
Понять бы ещё каким боком это вылезло, это же вроде то чем можно торговать...
Этот файл к торговле имеет очень косвенное отношение - это вероятность проявления в инвентаре НПС при спавне определенных предметов (стволов), и поскольку он включен после ваших правок, то работает именно он, а вероятность там очень низкая. Эти стволы НПС сможет продать ГГ если это ему разрешено в настройках торговли или использовать если по какой то причине лишился ствола в аналогичном слоте.
Сообщение отредактировал denis2000 - Вторник, 11.09.2018, 16:27
Этот файл к торговле имеет очень косвенное отношение - это вероятность проявления в инвентаре НПС при спавне определенных предметов (стволов), и поскольку он включен после ваших правок, то работает именно он, а вероятность там очень низкая.
То есть эта вероятность получается не зависит от того есть ли у нпс вообще хоть какой то ствол? Просто выходит прописаны 2 ствола в спавне, ак и пистоль из этого списка, и ни один не заспавнился из за этого инклюда... Теперь хоть иметь ввиду буду, что если в спавн прописан предмет из файла character_sell_weapons.xml, то этот инклюд в профиле нужно коментить...
Добавлено (11.09.2018, 16:37) --------------------------------------------- Спасибо всем за помощь!!!