makdm 37 Опубликовано 4 Июля 2015 Конечно, дико извиняюсь, но, вроде как, бесхозная вещь это s_obj.parent_id = 65535 Поделиться этим сообщением Ссылка на сообщение
makdm 37 Опубликовано 4 Июля 2015 (изменено) Возможно целесообразно сделать drop_item, дальше запустить level.add_call и как только parent_id == 65355, то удалит его. У меня кстати в таком случае проблем не было. Хотя, мне не понятна до конца проблема "рождения" глючных объектов и в чём их "глюк". Изменено 4 Июля 2015 пользователем makdm Поделиться этим сообщением Ссылка на сообщение
makdm 37 Опубликовано 4 Июля 2015 Да, координаты совпадают @macron, а что мешает при спавне объекта проверить координаты спавна и если они в зоне левел-ченджера, то сдвинуть спавн за пределы зоны перехода вглубь локации? Поделиться этим сообщением Ссылка на сообщение
makdm 37 Опубликовано 5 Июля 2015 (изменено) @macron, вот такой скрипт попробуй local parent_id = {} local remove_sobj = {} local i = 1 -- Пробегаем по объектам и айдишники всех level_changer помещаем в талицу while i < 65535 do local sobj = alife():object( i ) if sobj and sobj:clsid() == clsid.level_changer then parent_id[ sobj.id ] = sobj.id end i = i + 1 end -- Пробегаем по объектам и все child level_changer помещаем в талицу for n = 1, 65534 do local sobj = alife():object( n ) if sobj then for k,v in pairs( parent_id ) do if sobj.parent_id == v then remove_sobj[ sobj.id ] = sobj end end end end --Удаляем child level_changer for _k,_v in pairs( remove_sobj ) do alife():release( _v, true ) end Изменено 5 Июля 2015 пользователем makdm 1 Поделиться этим сообщением Ссылка на сообщение
makdm 37 Опубликовано 5 Июля 2015 (изменено) Сам этот момент - ахтунг полнейший. Не надо быть специалистом, чтобы понять бредовость засовывания ссылки на юзердату - в таблицу, и потом в цикле for пытаться еще что то с этой юзердатой делать. @Zander_driver, вот, честное слово, не понял тут ахтунга. Всё работает, как часы. Можешь сам проверить. Хотя можешь и не проверять, а открыть файл bind_smart_terrain.script и в методе net_spawn увидишь db.add_smart_terrain( self.se_smart_terrain ) Затем открой файл db.script. Дальше, надеюсь всё и так ясно. Изменено 5 Июля 2015 пользователем makdm Поделиться этим сообщением Ссылка на сообщение
makdm 37 Опубликовано 6 Июля 2015 @MrGROX, удаляешь на локации убытия и проспавниваешь на локации прибытия. Именно так делали разрабы Сталкера в ЗП все переходы сквадов с локации на локацию. Поделиться этим сообщением Ссылка на сообщение
makdm 37 Опубликовано 23 Июля 2015 (изменено) Всем привет! Не знаю куда написать, поэтому пишу сюда.( В случае чего модераторы меня поправят ) Проблема такая. Установлен билд мода на ЗП. Есть скрипт - gamedata\scripts\ui_mod_elements.script Апдейт происходит в биндере ГГ. В один прекрасный момент ( после нахождение игрока в зоне 28 дней, когда сыграно больше половины игры ) после сейв/лоад практически на "ровном месте" получаем вылет attempt to index global 'ui_mod_elements' (a nil value) Причём никакие правки в мод не вносились. Начинаю проверять в методе апдейт в биндере актора: if _G["ui_mod_elements"] then ui_mod_elements.allspawn_editor_update() else --вывод на экран, что нет такого файла end Результат: Двигало в упор не видит файл ui_mod_elements.script в папке gamedata\scripts Ну не существует для него такого файла, хотя сам файл присутствует. У меня есть даже "прикольная" сохранка. Загрузился - движок обрабатывает файл ui_mod_elements.script Даже лишних движений на клавиатуре не делал, а только сейв\лоад. И всё - нет такого файла для движка. Кто-нибудь сталкивался с таким эпизодом в модинге, когда скрипт, который только что работал, вдруг пропал для движка? Где копать? Изменено 23 Июля 2015 пользователем makdm 1 Поделиться этим сообщением Ссылка на сообщение
makdm 37 Опубликовано 23 Июля 2015 (изменено) Проблема с жестким диском ? Не у меня одного. Ещё у тестера такая же проблема. Движок просто не видит файл в папке scripts Изменено 23 Июля 2015 пользователем makdm Поделиться этим сообщением Ссылка на сообщение
makdm 37 Опубликовано 24 Июля 2015 Раскопал я этот "парадокс". Вообщем дело было так: При сохранении игры происходит спавн объекта и в его STATE часть нет-пакета сохраняются данные. При загрузке, данные считываются из STATE части нет-пакета объекта, а сам объект удаляется. Это я так думал. Но удаление объекта не происходило, т.к. я пытался сделать вот такой финт ушами: function se_store_obj:STATE_Read(packet, size) cse_alife_dynamic_object.STATE_Read(self, packet, size) -- Вынесено в объект из пакета ГГ release_body_manager.get_release_body_manager():load(packet) sr_psy_antenna.load(packet) sim_board.load(packet) xr_sound.actor_load(packet) xr_statistic.load(packet) alife():release( self, true ) end Т.е. пытался удалить сам объект прямо внутри метода STATE_Read Таким образом в игре накопилось 62 объекта, в которые записывались данные при сохранении и считывались 62 раза при загрузке. При 63-м сейв\лоад движок начал терять файл в папке scripts Я удалил вот это безобразие alife():release( self, true ) и всё пошло как по маслу ( за исключением того, что при загрузке и сохранке движок писал/считывал 63 раза одно и то же в пакеты разных объектов ) Ладно это поправимо. Вынес айдишники объектов в таблицу и затем удалил. Но почему движок делал 62 попытки удалить объекты и это "проскакивало", а на 63 объекте "стал запинаться" и терять файл в папке scripts, вот это пока для меня осталось непонятным. 1 Поделиться этим сообщением Ссылка на сообщение
makdm 37 Опубликовано 24 Июля 2015 В том, что нет-пакет ГГ не вмещает в себя все сохраняемые таблицы переменных, используемых в моде. А в чём тут извращение? Есть другой способ? Тогда зачем разрабы Сталкера всё это проделывают в методах save и load в биндере актора? @UnLoaded, если ты про то, что зачем нужен спавн и удаление, то это привычка защиты "от дурака". Вдруг, кому-то ( например мне ), где-то в середине игры придёт в голову добавить скрипт и пройтись по всем объектам и отделить нужное от мусора, а сам мусор отправить "в топку". Вот чтобы объект не оказался в "мусорке" я , таким образом его и защитил. Хотя, можно в начале игры добавить объект и работать с ним постоянно. Возможно перестраховка, но мне так спится лучше. Поделиться этим сообщением Ссылка на сообщение
makdm 37 Опубликовано 24 Июля 2015 Спасибо за ответы! По-ржал от души! Знаете, чем отличаются американские форумы от русских? На американском форуме задаёшь вопрос - все пытаются тебе помочь. На русском - при ответе на вопрос, все начинаются мериться своими .... познаниями. Вообще-то вопросы были не про хранение переменных, а немного о другом: 1.Почему при обработке 62 объектов игра идёт стабильно без вылетов и всё в игре работает так, как задумано разработчиком? 2.Почему при спавне 63-го объекта - движок "не видит" отдельный файл в папке Scripts??? 1 2 Поделиться этим сообщением Ссылка на сообщение
makdm 37 Опубликовано 15 Ноября 2015 (изменено) @Mododel15, так попробуй: snd = sound_object([[interface\inv_food]]) function use_bread_oz( obj ) if obj == nil then return end if obj:section() ~= "bread" then return end local s_obj = alife():create( "baton_b", vector(), 0, 0, db.actor:id() ) snd:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d) local Timer_zrems = time_global() + 3000 local effect_start = function() if s_obj.online and Timer_zrems < time_global() then return true end end local effect_stop = function() if snd:playing () then snd:stop () end alife():release( s_obj, true ) end level.add_call( effect_start, effect_stop ) end Изменено 15 Ноября 2015 пользователем makdm Поделиться этим сообщением Ссылка на сообщение
makdm 37 Опубликовано 15 Ноября 2015 Но функция удаления не работает У меня всё работает. Ищите ошибку у себя. 1 Поделиться этим сообщением Ссылка на сообщение
makdm 37 Опубликовано 29 Апреля 2016 (изменено) Очень просто Мне всегда нравились такие ответы на вопрос. Код ничего не возвращает. Изменено 29 Апреля 2016 пользователем makdm 1 Поделиться этим сообщением Ссылка на сообщение
makdm 37 Опубликовано 30 Апреля 2016 ID того, кто "шлёпнул" НПС хранится в его же нет-пакете. Всегда можно прочитать пакет НПС-трупа и получить ID киллера. Единственное неудобство - это нужно заранее позаботиться о получении серверного класса объекта НПС-трупа удобным для скриптёра способом. Как-то так. 1 Поделиться этим сообщением Ссылка на сообщение
makdm 37 Опубликовано 20 Июня 2016 Так попробуй: function check_barret() local rifle_in_slot=db.actor:item_in_slot(2)if rifle_in_slot and rifle_in_slot:section() == "wpn_vintorez" thendb.actor:give_info_portion("barret_on")news_manager.send_tip(db.actor, "%c[25,240,25,25]wpn_vintorez ON", nil, nil, 20000)elsedb.actor:disable_info_portion("barret_on")news_manager.send_tip(db.actor, "%c[25,240,25,25]wpn_vintorez OFF", nil, nil, 20000)endend 1 Поделиться этим сообщением Ссылка на сообщение
makdm 37 Опубликовано 9 Августа 2016 Доброго времени суток, народ подскажите как скриптом заспавнить машину/бтр ? Бтр поддерживает spawner Что мешает через SDK или acdc поставить БТР на локации, прописать ему логику, и в нужный момент игры по условию перевести его в он-лайн? Поделиться этим сообщением Ссылка на сообщение
makdm 37 Опубликовано 14 Апреля 2017 Неужели бываю NPC без community, или он в offline'е коньки отбросил? Биндер в файле xr_motivator.script обрабатывает только онлайновые объекты. При смерти НПС, который находится оффлайн, метод death_callback не вызывается и соответственно не вызывается метод create_release_item класса drop_manager. Соответственно применить метод character_community() к серверному классу объекта просто не получится ( так как его смерть не обрабатывается скриптом ). По идее NIL не должен быть никогда, если только вы сами не передали nil, как аргумент в функцию. Поделиться этим сообщением Ссылка на сообщение