naxac 2 605 Опубликовано 19 Октября 2016 (изменено) Левел и гейм вертиксы всех локацийЭто не все доступные левел-вертексы. Как ты их считал? По граф-поинтам (гейм-вертексам)? Так вот, это только вертексы граф-поинтов. Берешь самый большой из них для нужной локации, потом через math.random(1, <самый большой вертекс>) получаешь случайный вертекс, затем через level.vertex_position получаешь его координаты, а потом ищешь ближайший к этим координатам гейм-вертекс. Посмотри скрипты спавна динамических аномалий из того же АМК. Изменено 19 Октября 2016 пользователем naxac 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 19 Октября 2016 Если мы указываем позицию, то можно любой левел и гейм вертекс левела указать? Этого не знаю, надо у двигоправов спрашивать, что там к чему. Возможно, вертексы при спавне нужны для Ai. 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 21 Октября 2016 @advisor890, if math.ceil(distance) == 10 then Или if math.floor(distance) == 10 then Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 23 Октября 2016 Как считывать параметр из секции? ... Мне нужно открыть конкретный файл.local ini = ini_file("конкретный\\файл.ltx")return ini:r_string("section", "line") 2 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 24 Октября 2016 @advisor890, попробуй так local snd = xr_sound_soc.get_safe_sound_object("путь_до_звука") function anomaly_detector(anomaly) if anomaly.tim_beep == nil then anomaly.tim_beep = 0 return end local dist = db.actor:position():distance_to_sqr(anomaly:position()) if dist < 200 and math.max(dist, 50) < time_global() - anomaly.tim_beep then if not snd:playing() then anomaly.tim_beep = time_global() snd:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 1.0) end end end Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 28 Октября 2016 (изменено) @FonSwong, а не проще позицию получать непосредственно из объекта? local pos = smart.position фунуция level.vertex_position возвращает позицию вертекса на текущей локации. Зависает, т.к., видимо, передаваемого в нее вертекса нет на уровне. Изменено 28 Октября 2016 пользователем naxac 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 3 Ноября 2016 в какой момент начинается заполнение пакетаВ пстор при старте таймера пишется три перменных. Вот здесь они чистятся: amk.del_variable("rt"..i) amk.del_variable("rt"..i.."d") amk.del_variable("rt"..i.."p") amk.del_variable("gt"..i) amk.del_variable("gt"..i.."d") amk.del_variable("gt"..i.."p") rt* - реального времени, gt* - игрового. 2 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 15 Ноября 2016 @CRAZY_STALKER666, 1. Если ты имеешь в виду пояс, то пояс - это не слот, и номера у него нет. А активировать артефакт можно из первого или второго слота. Может, и из других тоже. 2. actor:transfer_item(item, box) где item - предмет, box - ящик. Например так function transfer_all_to_box() local box = level_object_by_sid(12345) -- 12345 - стори-ид ящика db.actor:iterate_inventory(function (actor, item) actor:transfer_item(item, box) end, db.actor) end 1 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 15 Ноября 2016 @CRAZY_STALKER666, если мне склероз не изменяет, то: Надо заспавнить в инвентарь предмет и потом перебирать инвентарь через iterate_inventory. Предметы, которые будут передаваться в итератор после заспавненного, будут либо в слотах, либо на поясе. Проверяешь их - если не в слоте, значит на поясе. Далее сверяешь то, что получилось с тем, что было на предыдущей проверке. В солянке, по крайней мере, используется такой метод - файл inventory.script. Единственное - именно момент перемещения предмета на пояс не отловить. А в проекте X-Ray Extensions добавлены каллбэки для актера на перемещение предметов между слотами, рюкзаком и поясом. Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 19 Ноября 2016 (изменено) @Kober(BRUC), наверно, ты хотел написать ini_file, а не system_ini? Возвратит как одно значение, т.е. все, что там написано: "One", "Two", "Three"Если нужен массив, то разбивай строку по запятым, обрезая пробелы, через string.gfind или string.gmatch. Готовые функции для этого видел где-то в "Сборочном цехе" Изменено 19 Ноября 2016 пользователем naxac 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 19 Ноября 2016 То есть переменная будет равна этому? Да. 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 5 Декабря 2016 (изменено) @losiara, если тебе нужно помирить их только на время одной сцены, то используй оверрайды в логике (combat_ignore и т.п.). Или можно зомбированным сталкерам сделать отдельную секцию, в которой прописать в species вместо human - zombie. Изменено 5 Декабря 2016 пользователем naxac Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 19 Декабря 2016 @KURT2013, урок вполне рабочий. Если все сделать по нему, то ГГ в принципе не сможет сам по себе или случайно засыпать, т.к. сон включается только через GUI. 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 26 Декабря 2016 (изменено) @HellRatz, из X-Ray Extensions: level.send_event_key_press(dik) - нажатие level.send_event_key_release(dik) - отпускание level.send_event_key_hold(dik) - удержание dik - код клавиши из DIK_keys. @Х_и_м_и_к, если надо просто прибавить здоровья, то нужно сначала получить game_object непися, а потом добавить ему хп. Например, по story_id. local npc = level_object_by_sid(12345) if npc then npc.health = 1 end Изменено 26 Декабря 2016 пользователем naxac 2 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 29 Декабря 2016 (изменено) @losiara, можно по имени в алл.спавне найти. Если по профилю, то перебирать всех онлайновых нпс и проверять у каждого character_name. Изменено 29 Декабря 2016 пользователем naxac Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 3 Января 2017 (изменено) @MegaStalker, self.chtime=time_global()+2000 это интервал между проверками, чтобы не проверять на каждом апдейте: 2 секунды. Данные о зомбированных хранятся в таблице "zombies", в псторе актера. amk.mylog() - это просто вывод в лог для отладки. Изменено 3 Января 2017 пользователем naxac Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 3 Января 2017 (изменено) @MegaStalker, придется. load_table/save_table - функции для сохранения/загрузки таблиц из пстора read_stalker_params/write_stalker_params - для чтения/записи нет-пакета нпс. Для нет-пакетов я бы рекомендовал что-нибудь другое использовать, не из АМК, т.к. там местами неверно пакет читается/пишется. Модуль m_netpk от Артоса например. А таблицы в АМК пакуются в строки - тоже так себе, но если альтернативы нет, то пойдет. Изменено 3 Января 2017 пользователем naxac Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 3 Января 2017 А чем плох этот вариант? И какие бывают альтернативы?Слишком он тормозной, мне кажется, особенно для использования на апдейте.Альтернативы - например, сохранение напрямую, без паковки function save_pstor_table(pk, tbl, obj) local tp for k, v in pairs(tbl) do if v == true then pk:w_u8(pstor_true) elseif v == false then pk:w_u8(pstor_false) else tp = type(v) if tp == "number" then pk:w_u8(pstor_number) pk:w_float(v) elseif tp == "string" then pk:w_u8(pstor_string) pk:w_stringZ(v) elseif tp == "table" then pk:w_u8(pstor_table) xr_logic.save_pstor_table(pk, v, obj) elseif tp == "userdata" then pk:w_u8(pstor_custom) pk:w_stringZ(v.classname == k and "" or v.classname) v:save(pk) else abort("xr_logic.save_pstor_table for %s: not registered type '%s' encountered [ %s :: %s ]", obj:name(), tv, k, utils.to_str(v)) end end pk:w_stringZ(k) end pk:w_u8(pstor_end_table) end function load_pstor_table(pk, tbl, obj) local k, v, n while true do n = pk:r_u8() if n == pstor_end_table then return tbl else if n == pstor_true then v = true elseif n == pstor_false then v = false elseif n == pstor_number then v = pk:r_float() elseif n == pstor_string then v = pk:r_stringZ() elseif n == pstor_table then v = {} xr_logic.load_pstor_table(pk, v, obj) elseif n == pstor_custom then local cls = reader:r_stringZ() if cls == "" then cls = k end v = pstor_custom_impl[cls]() v:load(pk) else abort("У объекта [%s] повреждён пстор, этим сохранением нельзя пользоваться - удалите его и переиграйте с предыдущего.", obj:name()) v = nil end k = pk:r_stringZ() tbl[k] = v end end end function pstor_save_all(obj, packet) local npc_id = obj:id() local pstor = db.storage[npc_id].pstor if not pstor then pstor = {} db.storage[npc_id].pstor = pstor end save_pstor_table(packet, pstor, obj) end function pstor_load_all(obj, reader) local npc_id = obj:id() local pstor = db.storage[npc_id].pstor if not pstor then pstor = {} db.storage[npc_id].pstor = pstor end if (not db.actor) and npc_id ~= 0 then abort("Не создан актор. Возможно, синтаксическая ошибка в bind_stalker.script") end load_pstor_table(reader, pstor, obj) end 2 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 4 Января 2017 @MegaStalker, ты меня не понял. Я привел пример, как переписать сохранение пстора в xr_logic.script для возможности хранения таблиц. Читать нетпакет этими функциями нельзя, как нельзя и сохранять таблицы напрямую. if (self.chtime or 0) < time_global() then self.chtime=time_global()+2000 if self.object:clsid()==clsid.controller_s and self.object:alive() then local npc=self.object:get_enemy() if npc then if npc:id()~=db.actor:id() and npc:clsid()==clsid.script_stalker and self.object:see(npc) and npc:character_community()~="zombied" and self.object:position():distance_to(npc:position())<30 then local sobj=alife():object( npc:id() ) if sobj and sobj.online then local zomb = xr_logic.pstor_retrieve(db.actor, "zombies", {}) zomb[sobj.id]={master=self.object:id(),comm=npc:character_community(),gw=npc:goodwill(db.actor)} xr_ligic.pstor_store(db.actor, "zombies", zomb) npc:set_character_community("zombied",0,0) local orgtbl=amk.read_stalker_params(sobj) if (not string.find(orgtbl.profile,"_zombi")) then orgtbl.profile=orgtbl.profile.."_zombi" end amk.write_stalker_params(orgtbl,sobj) end end end end end Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение
naxac 2 605 Опубликовано 9 Января 2017 (изменено) @Graff46, в ЗП есть функция перемещения нпс: set_npc_position(vector), в ЧН/ТЧ, вроде, их только по нодам гонять можно. Изменено 9 Января 2017 пользователем naxac Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Поделиться этим сообщением Ссылка на сообщение