Это популярное сообщение. Dennis_Chikin 3 658 Опубликовано 16 Мая 2014 Это популярное сообщение. Поделиться Опубликовано 16 Мая 2014 (изменено) Ковыряемся в файлах ТЧ Прежде чем писать в тему - внимательно читаем первый пост, и пользуемся поиском.Возможно, ответ на Ваш вопрос уже есть.Касательно телепатии: если Вы передаете Ваши файлы телепатическим путем - ответы будут передаваться тоже телепатически. Если Вы предлагаете угадать, отчего у Вас в подвале происходит странный стук - ответ будет передан стуком. Изменено 23 Февраля 2016 пользователем warwer 4 8 6 12 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Okichi 859 Опубликовано 18 Ноября 2020 Поделиться Опубликовано 18 Ноября 2020 15 часов назад, mole venomous сказал: Теоретически, может ли моб, заспауненный вот так: Для того, чтобы моб никуда не мог рвануть со своей локации - ему в его кастомдате ( именно в файле кастомдаты при создании моба, а не в файле логики) должна быть прописана секция [smart_terrains] имя_смарта = {кондлист условий, по которым непись находится в этом смарте} Тогда логику непися определит логика смарта. Конечно же, чтобы нпс "никуда не ушел", тоже есть условия - смарт должен при создании непися существовать на локации спавна непися , быть открытым и не быть заполнен одними эксклюзивами. Так же в нем должно хватать работ для всех нпс, кому этот смарт "назначен" , и если этому уникальному нпс нужна какая-то уникальная работа - она должна существовать в списке работ смарта. Или же [smart_terrains] none = true Тогда непись должен выполнять персональную логику. Она тоже, конечно же, должна существовать - со всеми путями, определенными в логике. В таком случае движок не будет перекидывать непися ни в какой в смарт "по собственной инициативе" и НПС будет оставаться на локации так долго, как это нужно разработчику ( если нигде каким=нибудь хитрым образом этому нпс не переписывают потом кастомдату, отпуская в "свободное плавание" ) Да - все вышеперечисленное верно, если скрипты, обрабатывающие логику неписей, не были модифицированы специальным образом, чтоб учитывать всякие нюансы. 1 1 След от кругов на воде - это тоже след (с) Ссылка на комментарий
AndrewMor 517 Опубликовано 18 Ноября 2020 Поделиться Опубликовано 18 Ноября 2020 4 часа назад, dsh сказал: это никак не зависит от движка. Эту секцию только скрипты используют. Т.ч. все зависит от этих скриптов. Я имел в виду не сам движок, конечно, а набор скриптов к нему в комплекте. Может там нечтение секции смарта из файла логики пофиксили... Сталкер - наше всё! Ссылка на комментарий
mole venomous 2 995 Опубликовано 18 Ноября 2020 Поделиться Опубликовано 18 Ноября 2020 4 часа назад, dsh сказал: непись выполнял логику из custom_data, а потом его посылали в смарт Похоже на мой случай... Здесь могла быть ваша реклама. Ссылка на комментарий
AndrewMor 517 Опубликовано 18 Ноября 2020 Поделиться Опубликовано 18 Ноября 2020 7 часов назад, dsh сказал: Я сталкивался с чудными схемами, когда непись выполнял логику из custom_data, а потом его посылали в смарт А вот вопрос тогда: получается, что "посылали в смарт" - это хотелка мододела, не? Если НПС не приписан к смарту и есть логика Волкера, не должен он никуда идти, разве нет? Сталкер - наше всё! Ссылка на комментарий
dsh 3 820 Опубликовано 18 Ноября 2020 Поделиться Опубликовано 18 Ноября 2020 39 minutes ago, AndrewMor said: это хотелка мододела, не? Это кривые руки мододела. 39 minutes ago, AndrewMor said: Если НПС не приписан к смарту и есть логика Волкера, не должен он никуда идти, разве нет? Кому должен? Одно с другим никак не связано. Не, если у тебя в скриптах сделано, что бы волкеров в смарт не принимали, тогда не должен. А если нет, то что должно этому помешать? dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
mole venomous 2 995 Опубликовано 18 Ноября 2020 Поделиться Опубликовано 18 Ноября 2020 8 минут назад, dsh сказал: в скриптах сделано, что бы волкеров в смарт не принимали, тогда не должен. А если нет, то что должно этому помешать? 8 минут назад, dsh сказал: Это кривые руки мододела. Вот здесь до меня доходит по тихой грусти. Заодно вопросик. Если гулагу потребовалось население, он дёргает непися. Если подходящих на этой локации нет, придут с другой. И вот вопрос - НПС выберет ближайший к себе переход из возможных, что бы добраться на локу с гулагом? Здесь могла быть ваша реклама. Ссылка на комментарий
AndrewMor 517 Опубликовано 18 Ноября 2020 Поделиться Опубликовано 18 Ноября 2020 11 минут назад, dsh сказал: Кому должен? Я может неправильно объяснил. Есть непись, у него в кастом-дате смарт_террейн = ноне, и логика - стоять на точке ( или идти по пути, если конечно, нет на этом пути рестров, в которые заходить нельзя). В таком разе он должен тупо выполнять свою работу и никуда от нее не убегать (тем более, на другую локацию). Или я что-то не так понимаю?. Коль так, проясни тонкости, плз. 1 Сталкер - наше всё! Ссылка на комментарий
mole venomous 2 995 Опубликовано 18 Ноября 2020 Поделиться Опубликовано 18 Ноября 2020 (изменено) 29 минут назад, AndrewMor сказал: в кастом-дате смарт_террейн = ноне Я уже склоняюсь к тому, что это не желательный, а обязательный пар-тр для чела с персональной логикой при работе с двиглом ОГСР. На ванили этот параметр работает, только если указан в оллспаун и в то же время я не замечал, что бы мобы, заспавненые скриптом с записью в кастомдату, дислоцировались в гулаги Изменено 18 Ноября 2020 пользователем mole venomous Здесь могла быть ваша реклама. Ссылка на комментарий
dsh 3 820 Опубликовано 18 Ноября 2020 Поделиться Опубликовано 18 Ноября 2020 38 minutes ago, mole venomous said: Если гулагу потребовалось население, он дёргает непися. Гулаг ничего не дергает. Движок периодически предлается каждого моба со smart_terrain_id == 65535 каждому смарту. Если смарт ответил согласием, движок меняет у этого моба smart_terrain_id на id этого смарта. На этом работа движка закончена. А дальше уже смарт и гулаг работаются с тем, что им предложено. 40 minutes ago, mole venomous said: НПС выберет ближайший к себе переход из возможных, что бы добраться на локу с гулагом? НПС ничего не выбирает. Как движок ему путь построит, так и пойдет. Эмпирически у меня сложилось мнение, что движок строит максимально короткий путь. 40 minutes ago, AndrewMor said: у него в кастом-дате смарт_террейн = ноне В этом случае смарты таких не принимают, поэтому и убегать ему некуда. Правда наличие в кастомной дате [smart_terrain] none = true этого не гарантирует, т.к. имеет значение, когда это появилось в кастомной дате. Если позже определенного момента, то не сработает. 29 minutes ago, mole venomous said: а обязательный пар-тр для чела с персональной логикой при работе с двиглом ОГСР Двигатель не имеет значение. Оригинальный движок работает точно так же. 30 minutes ago, mole venomous said: На ванили этот параметр работает, только если указан в оллспаун Это не так. Работает всегда. Но см. мое замечание выше. Никаких отличий между оригинальным движком и OGSR в этом плане нет. 2 2 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
mole venomous 2 995 Опубликовано 18 Ноября 2020 Поделиться Опубликовано 18 Ноября 2020 (изменено) @dsh, Благодарю, всё понятно расписал и три вопроса разом закрылись. А то часто много противоречивой инфы или размазано всё на сорок страниц... Изменено 18 Ноября 2020 пользователем mole venomous 1 Здесь могла быть ваша реклама. Ссылка на комментарий
Colder 12 Опубликовано 18 Ноября 2020 Поделиться Опубликовано 18 Ноября 2020 Скрытый текст ---Скрипт--- local kits = { [1] = "sewing_weaplinght_", [2] = "sewing_weapweight_", [4] = "sewing_weapnew_", [6] = "sewing_outfit_" } function patch_repair(obj) if obj then local sect = obj:section() local num for k,v in pairs(kits) do if string.find(sect,v) then num = k break end end if num then local cond = math.ceil(obj:condition()*10) start_repair_out(cond,num) end end end function start_repair_out(cond,num) local itm = db.actor:item_in_slot(num) local kit = kits[num] if itm ~= nil then --// проверта что в слоте есть ITEM alife():release(alife():object(slot:num()), true) --/ удаляем обьект libery_mod.actor_random_devices() --// тут спавним (Ран.кол.запчастей) end local snd_obj = xr_sound.get_safe_sound_object([[interface\inv_repair_kit]]) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) local s = cond-2 local tex_s = "" if s > 0 then tex_s = "Осталось использований: "..s/2 create_repkit(kit..s) else tex_s = "Комплект использован полностью." end local text = "[d_cyan]Разбор окончен!\\n%c[default]"..tex_s send_tip(text) else send_tip("[d_red]Разбор невозможен!\\nОтсутствует объект для разбора!") create_repkit(kit..cond) end end --// ---------------------------------------------- function send_tip(news_text) local snd = xr_sound.get_safe_sound_object([[device\pda\pda_news]]) snd:play(db.actor, 0, sound_object.s2d) local msg = "%c[white]Разбор\\n".."%c"..news_text db.actor:give_game_news(msg, "ui\\ui_iconsTotal", Frect():set(249,940,83,47), 0, 4000) end function create_repkit(section) if system_ini():section_exist(section) then alife():create(section,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end end ----LTX---- [sewing_outfit_10]:conserva visual = new\repair\item_repair.ogf description = 1 inv_name = 1 inv_name_short = 1 inv_weight = 0 cost = 0 inv_grid_width = 1 inv_grid_height = 1 inv_grid_x = 25 inv_grid_y = 39 eat_health = 0 eat_satiety = 0 eat_power = 0 eat_radiation = 0 wounds_heal_perc = 0 eat_portions_num = 1 animation_slot = 4 hud = wpn_vodka_hud [sewing_outfit_8]:sewing_outfit_10 condition = 0.8 inv_name = 2 inv_name_short = 2 [sewing_outfit_6]:sewing_outfit_10 condition = 0.6 inv_name = 3 inv_name_short = 3 [sewing_outfit_4]:sewing_outfit_10 condition = 0.4 inv_name = 4 inv_name_short = 4 [sewing_outfit_2]:sewing_outfit_10 condition = 0.2 inv_name = 5 inv_name_short = 5 ----Вылет---- Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...ü ×åðíîáûëÿ\gamedata\scripts\bind_stalker_ext.script:32: attempt to index global 'axr_repair_out' (a nil value) Парни СОС помогите кто-нибудь. В чем ошибка? Пытаюсь реализовать разбор каждого слота по отдельности на запчасти. Ссылка на комментарий
naxac 2 373 Опубликовано 18 Ноября 2020 Поделиться Опубликовано 18 Ноября 2020 34 минуты назад, Colder сказал: attempt to index global 'axr_repair_out' (a nil value) Синтаксическая ошибка в скрипте. Проверь синтакс-чекером или луа-плагином в notepad++. Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Colder 12 Опубликовано 18 Ноября 2020 Поделиться Опубликовано 18 Ноября 2020 @naxac, да уже сделал. Все работает. Спасибо! @naxac, Хотя нет все равно не то. Теперь анимация перестала проигрываться и не приходит смс о том сколько применений осталось! Скрытый текст local kits = { [1] = "sewing_weaplinght_", [2] = "sewing_weapweight_", [4] = "sewing_weapsuper_", [6] = "sewing_outfit_" } function patch_repair(obj) if obj then local sect = obj:section() local num for k,v in pairs(kits) do if string.find(sect,v) then num = k break end end if num then local cond = math.ceil(obj:condition()*10) start_repair_out(cond,num) end end end function start_repair_out(cond,num) local itm = db.actor:item_in_slot(num) local kit = kits[num] if itm ~= nil then libery_mod.actor_random_devices() alife():release(alife():object(itm:id()), true) local snd_obj = xr_sound.get_safe_sound_object([[item_sounds\inv_repair_sewing]]) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) local s = cond-2 local tex_s = "" if s > 0 then tex_s = "Осталось использований: "..s/2 create_repkit(kit..s) else tex_s = "Комплект использован полностью." end else send_tip("[d_red]Разбор невозможен!\\nОтсутствует объект для разбора!") create_repkit(kit..cond) end end --// ---------------------------------------------- function send_tip(news_text) local snd = xr_sound.get_safe_sound_object([[device\pda\pda_news]]) snd:play(db.actor, 0, sound_object.s2d) local msg = "%c[white]Разбор\\n".."%c"..news_text db.actor:give_game_news(msg, "ui\\ui_iconstotal", Frect():set(332,423,83,47), 0, 4000) end А ческер пишет что все нормально Ссылка на комментарий
AndrewMor 517 Опубликовано 19 Ноября 2020 Поделиться Опубликовано 19 Ноября 2020 11 часов назад, mole venomous сказал: На ванили этот параметр работает, только если указан в оллспаун и в то же время я не замечал, что бы мобы, заспавненые скриптом с записью в кастомдату, дислоцировались в гулаги Да-да-да, именно так. Выходит, и в ОГСР также скриптовая обвязка работает? 11 часов назад, dsh сказал: Если позже определенного момента, то не сработает. Позже какого момента? Если НПС уже назначена работа в гулаге? Сталкер - наше всё! Ссылка на комментарий
Это популярное сообщение. dsh 3 820 Опубликовано 19 Ноября 2020 Это популярное сообщение. Поделиться Опубликовано 19 Ноября 2020 9 hours ago, AndrewMor said: Позже какого момента? Если НПС уже назначена работа в гулаге? Не, раньше. После alife():create() уже поздно. Когда мы выполняем alife():create(), прежде чем выполнится следующая строчка скрипта, движок создает объект и вызывает его on_before_register(), потом on_register() и т.д. Например, для сталкера - это se_stalker:on_before_register() и т.д. Далее я привожу цитаты из скриптов ОП-2 2.09, т.к. под рукой есть. function se_stalker:on_before_register() self:fill_exclusives() end function se_stalker:fill_exclusives() self:get_ini() self.smart_terrain_conditions = smart_terrain.read_smart_terrain_conditions( self ) if self.smart_terrain_conditions then for name, condlist in pairs(self.smart_terrain_conditions) do smart_terrain.exclusives[name] = (smart_terrain.exclusives[name] or 0) + 1 end end end function se_stalker:get_ini() if not self.ini_initialized then self.ini = self:spawn_ini () self.ini_initialized = true if self.ini:section_exist("spawner") then self.spawner = xr_logic.parse_condlist(db.actor, "spawner", "cond", self.ini:r_string("spawner", "cond")) end end end Как видно, из on_before_register() вызывается fill_exclusives(), из которого вызывается get_ini(), который сохраняет spawn_ini(), т.е. кастомную дату, в self.ini. Т.е. мало того, что тут вызывается обработка секции [smart_terrain], так и spawn_ini() запоминается. Вот поэтому, если кастомную дату поменять после alife():create(), записав туда [smart_terrain] none = true это вступит в силу только после следующей загрузки сейва. А в on_register() есть вот такой код if self:alive() and self:smart_terrain_id() == 65535 then self:brain():update() end Т.е. есть большая вероятность, что сразу же после возврата из alife():create(), моб уже будет в каком-то смарте и добавление none = true в кастомную дату вообще уже никакого влияния не окажет. Т.е. менять кастомную дату нужно до возврата из alife():create(), внутри on_before_register(). Вот например function se_stalker:on_before_register() ... event( "se_stalker:on_before_register" ):trigger({ sobj = self }) self:get_ini() smart_terrain.fill_exclusives( self ) end 1 5 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
AndrewMor 517 Опубликовано 19 Ноября 2020 Поделиться Опубликовано 19 Ноября 2020 (изменено) @dsh, Круто!!! Гран мерси за столь подобное разъяснение! Резюмируя: alife():create() создает НПС, и до выполнения следующей строчки скрипта (например, привязка к смарту), НПС уже может быть назначена работа в свободном смарте. Так? Выходит, чтобы спавнить НПС с привязкой к смарту, нужно модифицировать скрипт, так? Это, так понимаю, единственное правильное решение. Или все-таки правка движка разумнее? Изменено 19 Ноября 2020 пользователем AndrewMor Сталкер - наше всё! Ссылка на комментарий
Okichi 859 Опубликовано 19 Ноября 2020 Поделиться Опубликовано 19 Ноября 2020 (изменено) @AndrewMor, 1) да, только не работа - а может быть назначен любой смарт, согласившийся непися принять. И непись туда пойдет - а вот работу там он получит только тогда, когда дойдет. 2) не обязательно ничего модифицировать - можно просто создать для этого НПС отдельную секцию, там прописать путь к файлу кастомдаты ( именно она будет в таком случае использоваться в alife():create()), и уже в этой кастомдате указать либо конкретный смарт для НПС, либо none = true Именно это хотел донести @dsh, - чтобы уже в момент работы alife():create() была задана правильная ( нужная разработчику ) кастомдата 3) тем, про что написал ДиШ - движок не занимается. Это в скриптах. Изменено 19 Ноября 2020 пользователем Okichi 1 След от кругов на воде - это тоже след (с) Ссылка на комментарий
AndrewMor 517 Опубликовано 19 Ноября 2020 Поделиться Опубликовано 19 Ноября 2020 (изменено) 22 минуты назад, Okichi сказал: да, только не работа - а может быть назначен любой смарт, согласившийся непися принять. Согласен. Я и имел в виду не саму работу, а смарт, который берет НПС к себе. 22 минуты назад, Okichi сказал: не обязательно ничего модифицировать - можно просто создать для этого НПС отдельную секцию, там прописать путь к файлу кастомдаты ( именно она будет в таком случае использоваться в alife():create()), и уже в этой кастомдате указать либо конкретный смарт для НПС, либо none = true Из-за того и весь этот разговор. Есть к примеру в АМК такой скрипт. Назначение логики скриптом, но присобачить принадлежность НПС к конкретному смарту не выходит. Вокруг этого не раз дискуссии велись на страницах форума, и многие спрашивали: как скриптом привязать НПС к конкретному смарту (или не привязывать вообще). Вот теперь dsh подробно расписал механизм, а именно этого и не хватало многим для понимания процесса. А в ванили, и похоже, в более продвинутых движках (типа ОГСР), скриптовая обвязка не менялась. Ведь человек-то не просто так спрашивал. В любом случае, теперь понятен механизм!!! Изменено 19 Ноября 2020 пользователем AndrewMor 1 Сталкер - наше всё! Ссылка на комментарий
Muzafir 17 Опубликовано 19 Ноября 2020 Поделиться Опубликовано 19 Ноября 2020 Скажите, а может быть у НПС несколько секций meet? По типу для walker1 - meet1, walker2 - meet2. Пару дней уже мучаюсь с этим конструктором. Не хочет НПС отрабатывать свою логику и все тут... Ссылка на комментарий
Купер 2 299 Опубликовано 20 Ноября 2020 Поделиться Опубликовано 20 Ноября 2020 @Muzafir, ничего не понятно, но жутко интересно Скрытый текст Условно: [walker@1] meet = meet@1 .... [walker@2] meet = meet@2 [meet@1] ... [meet@2] ... Посмотри как Крот на Агропроме сделан, например. 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти