Artos 99 Опубликовано 19 Апреля 2011 (изменено) kamikazze Привнесу немного сумбура с целью получения достаточно надежной и логичной схемы менеждера оружия. В своеей сборке давно использую данную схему Bak'а (но модифицированную). Устранял и ошибки с 'e_parent && e_entity' и также натолкнулся на проблему перехода онлайн<->оффлайн. Предложенные тобою правки дадут конечно эффект, но(!) и не уберут полностью проблему 'перехода' и добавят сложностей для неопытных с адаптациями к другим модам (тот же массив перевода объектов он/офф-лайн из АМК, задействованный и в se_stalker). К сути: Менеджер оружия использует фейковый ящик, в котором находится невостребованное неписями оружие. Ситуация конечно дурацкая, когда непись успевает уйти в оффлайн, а оружие ему не успевает вернуться. Твой вариант, основанный на предсказании перехода и опережающем возвращении возможно и даст некоторый запас прочности по стабильности и исчезновении ошибок, но привнесет и нелогичность (ИМХО). Не буду расписывать их, достаточно одного момента, когда непись будет на границе предсказанного перехода в оффлайн (условно ~100м), но не собирается переходить. Гистерезиса (триггерного эффекта) в твоем варианте нет (хотя несложно сделать), но не это основной минус. Слишком дистанция по меркам Зоны маловата (<100м) для принудительного отправления в оффлайн, поэтому игрок будет периодически наблюдать (и без оптики) исчезновение неписей. Собственно, а так ли нужно предсказывать уход в оффлайн? Мысли: 1. Если NPC ушел и не вернулся - то и фик с ним и с оружием в фейк-ящике ... Сделать периодическую чистку ящика, если напрягать будет. 2. Если NPC вернулся в онлайн (в запущенной уже игре!), то и заберет штатно свое оружие (если сторадж менеджера оружия не сбрасывать). 3. Если возврат в онлайн происходит из сэйва - вот тут то и нужно бы доработать, чтобы непись и/или фейк-ящик помнили где/чье. У себя в сборке сделал давно так, что фейк-ящик на локации всегда один и тотже с положенным в него барахлом и нужно только вернуть владельцу. 4. Остается последний момент - переход непися на другую локацию. В этой ситуации фейк ящик или таскать за Меченым по локациям (вот откуда наработка для компаньонов) или делать дубли ящика на локациях и перемещать востребованное оружие. Т.о. для более логичной работы схемы требуется (ИМХО): а) Постоянный фейк-ящик на локации в котором при сэйвах сохраняется барахло. (реализуемо/реализовано) б) Запоминать паренты (владельцов) оружия, чтобы возвращать после возвратов неписей в онлайн. (реализуемо и не сложно) в) Организовать трансфер между локациями или фейк-ящика или оружия. (уже реализуемо и 1-ое предпочтительнее). Доведем схему до логического и стабильного состояния?! :-) (частности можно и в ЛС обсудить) --- P.S. Вспомнил что резануло в глаза - один флаг (temp_disable), время жизни которого до 0.5 сек на несколько неписей, которые могут и практически единовременно уходить в оффлайн - источник оставшейся нестабильности и нелогисности. СтОит его внутрь менеджера запихнуть для каждого непмся индивидуально. (ИМХО) Изменено 19 Апреля 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Поделиться этим сообщением Ссылка на сообщение
Artos 99 Опубликовано 19 Апреля 2011 (изменено) kamikazze Код сразу и глянул и проанализировал (благо 'полтора десятка' строк в сумме). И даже встроил в свой вариант модифициованного менеджера для 'пощупать/проверить' (пока еще не смотрел). Сам алгоритм доработки и его работа мне ясны, но ... поэтому и пишу. 1. Усложнение адаптации не в том, что сложен алгоритм, а только в том, что неопытным придется самим еще одну ветку 'от АМК' заворачивать на 'can_be_offline'. Несложно (нам), но ... ;-) Ну да ладно, на всех не угодишь ... на то и свои мозги нужны. 2. Собственно сама функция 'to_offline(npc)' нуждается и в оптимизации. Вызовы из 'se_stalker:can_switch_offline()' не так уж и редки и две правки уже стОит внести: а) Заменить параметр вызова 'self' на 'self.id', т.к. все равно только id и требуется. б) Организовать таймер, зависимый от дистанции. По достижении дальней дистанции пауза минимальна, а ближе (~80м) пусть хоть секуды 'тикает', отсекая излишние вычисления. Т.о. разгрузится немного проц. По п.4 "переход непися на другую локацию". Оно то правильно, и гиморно и нечего раскидывать и не забирать, но ... 'забирание по дистанции' далеко не всегда прокатит. При сэйвах часто неписи с оружием поблизости и не запрещенный трансфер из ящика также может вызывать ошибки по парентам при трансфере (серверный объект с проверкой на онлайн порой запаздывает относительно клиентского). (В своей сборке я сделал весь трансфер по сэйву актора, пока все неписи и ящик заведомо в он-лайне). По чистке устаревших записей: При старте игры/сэйва так и так считывать данные, вот и актуализировать их. При правильной организации это совершенно не проблема и 'грязи' не остается. По п.в) "трансфер ящика между локациями". Хм, спавнить ящики в all.spawn'е, да на каждую локацию, да их на каждой искать/инициализировать, ... Спавним один раз (любой нам потребный!) и запоминаем - далее перебрасываем за ГГ при его переходах (благо не часто). Т.к. менеджер оружия работает ТОЛЬКО там где ГГ - то и ящик не проблема иметь 'при себе'. Ну да это дело вкуса. :-) Прим: Сам ящик может быть и стораджем массива парентов и еще чего ..., не загружая ни актора ни самих неписей и будучи при акторе (считай доп.сторадж). По флагу: понятно, согласен что в данном алгоритме не самое насущное. Бум смотреть и проверять ... ;-) Изменено 19 Апреля 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Поделиться этим сообщением Ссылка на сообщение
Artos 99 Опубликовано 19 Апреля 2011 (изменено) kamikazze По таймеру: ты не понял меня, вероятно невнятно пояснил. Если NPC рядом с ГГ, то нет смысла проверять его уход в оффлайн, хотя вызов из 'se_stalker' следует (проверка из поведенческих схем и пр.). При уходе на дистанцию близкую к переключению - вполне можно и убирать (почти) таймаут. Сделав типа: tm_pause = time_global() + math.max( 50, (real_off_dist - dist)*100 ) - можно на ближних дистанциях неписей отсекать проверки секундными паузами. По удалению - таймер перестраивается на сотни/десятки милисекунд. Но мы пошли уже в часности и субъективизмы, отойдя от основной сути. :-) Но все же еще немного позащищаю вариант 'одного ящика': Фейк-ящик создается при спавне ГГ в самом начале игры. Это не инвентарный ящик, а любой иной вариант хоть с невидимой текстурой. Спавнится где угодно, лишь бы с сеткой не глючил. Его id при спавне один раз запоминается и остается только считать его и найти в онлайне (у себя я просто сделал ему биндер и он сам находит себя, заодно и разрешая работу менеджеру оружия). За все время подобного варианта ящик никогда не конфликтовал с графами/вертексами. При телепортации его хоть по Y за облака можно заспавниь, хоть под уровень ... Т.о. не требуется ни резервироваь стори_ид, ни иметь табличку, ни итерировать по ней, сравнивая с текущей локацией, ни прочего, что завязано на кодах конктретного мода. Все динамически и просто, только одна переменная для хранения его игрового идентификатра (можно и без нее обойтись, если сделать уникальной секцию) и простенький биндер фейк-ящика (для ускорения). А при потере (специальной) можно и новый в любое время заделать. Вот к хранению данных в ящике я бы более серьезно отнесся. а) У неписей могут быть и квестовые предметы-оружие. В модах с собирательством эти предметы могут кочевать. Неписи гибнуть (при смерти в аномалии от разрыва ни какой код не вернет оружие). Т.о. зависание оружия в ящиках очень даже непризрачно. Проверка наличия владельца предмета из ящика на присутствие в игре позволит возвращать предметы в игру. б) К сожалению, необхлдимость хранить данные все более возрастает с усложнениями схем/модулей и появлением все новых. Иметь доступное хранилище 'на всякий случай' все проще, чем изворачиваться потом. в) (это уже 'в сторону'). Подобный фейк-ящик можно использовать не только для менеджера оружия. Например в сборке, я заменил постоянный спавн/удаление поясного сепаратоа на трансфер между ГГ и ящиком. Один Ящик, один сепаратор и трансфер. Движок не занят лишними серверными функциями. P.S. В оновном я разбирал исходную схему Bak'а довольно старой версии. Обновленные версии тоже смотрел, но целостной картины не складывал, поэтому возможно повторяю то, что было сделано при модернизации схемы и позже аналогичное в новых версиях исходного мода. В общем прикрутил и твой кусочек - проверим и твой вариант. :-) Изменено 19 Апреля 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Поделиться этим сообщением Ссылка на сообщение
Artos 99 Опубликовано 19 Апреля 2011 (изменено) kamikazze: Ну при этой ситуации оружие в любом случае погибнет вместе с владельцем, тут без вариантов, увы Ну ... я бы не согласился, хотя ... ты прав ... в основном и привычном всем нам. ;-) Скажу крамолу: А если оружие НЕ у владельца?! Если у непися имеется квестовое оружие то: или он его держит в руках или - в рюкзаке (в оригинале игры). При работающем менеджере оружия - оружия в рюкзаке не должно быть(!). Как помним, при попадании в аномалии неписи хотя и гибнут/разрываются/исчезают - оружие(!) остается в игре, хотя и покоцанное и порой парит в облаках. Т.о. или в аномалии (динамические исчезают!) или в фейк-ящике оружие остается в игре и уже задействованные квесты (а они не стори_ид контролируют а игровые идентификаторы!) НЕ будут провалены и есть возможность 'трансфером' из ящика восстановить квест для 'сдачи'. Вот этот момент меня тоже сильно интересует, как и то, что преследует твоя правка менеджера. Жаль пока они в разных фазах, т.к. твой вариант подразумевает возврат из ящика в подобных ситуациях, а сохранение квестов наоборот - по возможности держать оружие 'или в руках или в ящике'. На этом пока наверное закончим, дабы и дела не стояли на месте. :-) Изменено 19 Апреля 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Поделиться этим сообщением Ссылка на сообщение
Artos 99 Опубликовано 29 Декабря 2012 (изменено) dromundus, прекрати, плз, засорять топики своим дабл-флудом. И этот топик и 'AI pack FINAL' к твоим "художествам" не имеют никакого отношения, так какого в них писать о том, что ты там у себя нагородил с использованием этих модов?! Считаешь, что сделал нечто, что заслуживает внимания для других и/или хочешь иненно об этом погордиться иль пофлудить(?) - ну так и создай свою темку, выложи для желающих ознакомиться, и принимай/обсуждай отзывы иль критику. Если же есть вопрос/непонятка, то более уместно по своим же ковыряниям спрашивать в соответствующих темах-ковырялках в 'Школе моддинга'. 1. Патроны в активных стволах, если хотя бы один(!) подходящего типа есть в инвентаре НПС - никогда не заканчиваются! (это давно известно модмейкерам). Т.е. если есть патрон(ы) - при израсходовании очередного магазина/обоймы отыгрывается анимация перезарядки, и в оружие просто напросто спавнится движок пополняет кол-во "новых патронов", соответствующих полной зарядке. А патрон(ы) в инвентаре так и остаются нерасходуемыми. 2. Твое изумление по поводу износа/израсходхования оружия - вызывает улыбку... Если бы ты при совмещении строк еще и алгоритмы совмещал, то возможно бы и заметил: - схема менеджера оружия имеет особенностью периодически и по условиям изымать у НПС неиспользуемое оружие и перемещать это оружие в фейковый ящик (внимание - ящик!). В самой схеме, точнее в ее алгоритме имеются огрехи, приводящие порою к исчезновению из игры оружия, находящегося в ящике. Такое, например, возможно при сэйве и лоаде... - Включенная схема собирательства позволяет неписям на больших дистанциях выгребать барахло из различных ящиков, в том числе и оружие. Т.о. если фейковый ящик (см. выше) ты не "застрахуешь" - и его выгребают периодически, т.е. получаешь очень нехилый кроговорот оружия через этот "обменник". Менеджер оружия изымает у любого, а схема собирательства дарит... Вот только патронов это не касается, и ежели нет подходящего типа у "осчастливленного" стрелка - израсходовав магазин/обойму - и получает очередной баластный ствол. Так что прекращай оффтопить в темах и займись ... делом. Изменено 29 Декабря 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Поделиться этим сообщением Ссылка на сообщение