Полтергейст 37 Опубликовано 12 Января 2011 (изменено) За это время очень много интересного нарыл. Что сделал: Для smart_terrain мне удалость сделать состояние тревоги (работы подгонял по предикатам соответсвтенно), как в ЗП, и запретить прописку NPC из враждующих группировок в один смарт. Со smart_terrain_id() для NPC и "потерей из виду" функции initialize_if_needed() тоже почти разобрался. Но остался непонятен вопрос - откуда идёт спавн NPC группировок, указанных в поле communities для смарта? Кто знает? А то как-то некрасиво получается, когда в одном смарте спавнятся враждующие НПС, да ещё и в немалом количестве. Респавны я совсем удалял из all.spawn - от них это не зависит. Кстати, насчёт "немалого количества". Именно из-за него у меня стали чаще проявляться вылеты из-за state_mgr как с логами, так и без них. Подозреваю, что проблема в evaluator'ах, но их слишком много, чтобы можно было так просто разобраться. Если кто-нибудь поможет мне доработать state_mgr из ЗП, то мне весной уже можно будет выкладывать свои исправления для AMK + NLC 5.1, если не случится ничего непредвиденного... Dennis_Chikin со стэком - я, кажется, нашел архитектурную проблему в более другом месте. Сейчас осмысливаю. Коротко, если вдруг есть возможность заменить у объектов методы can_switch_*() на переменную - должно ощутимо полегчать во многом разном. Если can_switch_*() вызывается реже, чем update(), то можно попробовать засунуть все вызовы cse_alife_*.can_switch_*() в update() и сохранять в переменную, а в скрипте для функции задать возвращение этой переменной вместо вызова cse_alife_*.can_switch_*(). В противном случае надо принудительно уменьшать частоту вызова этих функций (примерно так, как сделано в обновлении restrictor'ов в биндере игрока) из update(), что тоже реализуемо. P.S. насчёт обхода аномалий: я не знаю, что случилось, но у меня, похоже, ВООБЩЕ перестали работать методы add_restrictions и remove_restrictions. Как и почему такое могло произойти - тоже понять не могу. Изменено 12 Января 2011 пользователем Полтергейст Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 13 Января 2011 Поглядите в xr_danger.script Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 13 Января 2011 (изменено) Возьмите restriction_stock из AMK и пропишите точно также. Только желательно вместо таблицы для каждого названия секции сделать подсчёт объёма по ef_weapon_type и ef_outfit_type для оружия и броников. Для еды и аптечек по классу задать объём равным 1. Если не можете - сойдёт и так, как сделано в АМК. Изменено 13 Января 2011 пользователем Полтергейст Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 13 Января 2011 Не везёт так не везёт С переносом результатов выполнения функции cse_alife_*.can_switch* ничего не получается - вылет без лога. Вот код из se_monster: function se_monster:__init (section) super (section) ... self.can_switch_on = false self.can_switch_off = false self.next_on_sw_upd_time = -1000 self.next_off_sw_upd_time = -1000 ... end ... function se_monster:can_switch_offline () local time = time_global() if self.next_off_sw_upd_time < time then self.can_switch_off = cse_alife_monster_base.can_switch_offline(self) self.next_off_sw_upd_time = time + 2000 end ... end ... Для can_switch_online() сделал аналогичным образом. Вызовы cse_alife_monster_base.can_switch_* в скрипте se_monster заменил на запрос self.can_switch_*. Для сталкеров всё делал точно также. Пробовал засунуть это в update - тот же результат. Что я делаю не так? Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 13 Января 2011 (изменено) Хочу избавиться от вылетов из-за переполнения стека, которое иногда возникает, если в онлайне много NPC. На одной из предыдущих страниц мне подсказали, что надо копать в сторону функций can_switch_*() и по возможности заменить их переменными, вроде как количество вылеты из-за переполнения стека должны если не исчезнуть, то хотя бы уменьшиться. Изменено 13 Января 2011 пользователем Полтергейст Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 14 Января 2011 (изменено) переполнение стека происходит тогда, когда функция многократно вызывает сама себя Не обязательно "сама себя". Насколько я понял, достаточно, чтобы функция многократно вызывалась за короткий промежуток времени не важно откуда. Такое я случайно спровоцировал, когда эксперементировал с добавлением restrictor'ов, хотя никакой рекурсии не было. Сначала я думал, что если игра ругалась на state_mgr, то в нём собака и зарыта, но вчера сам видел, как перед вылетом npc начинают то исчезать, то появляться снова - т.е. скакать из онлайна в оффлайн и обратно. Учитывая, что can_switch_* вызывается раз в секунду, то скорее всего такие глюки при большом скоплении npc именно из-за этого. А это уже тянет за собой частый вызов net_spawn() и net_destroy() для биндера, к которому как раз "приделан" state_mgr, вот мы и имеем то, что имеем... Изменено 14 Января 2011 пользователем Полтергейст Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 15 Января 2011 (изменено) Проблема со стеком может быть следствием других сбоев, но каких именно - естественно так просто не скажешь. Ну вот у меня с add_restrictions было так: Пишу в amk_anoms в биндере аномалий в функции net_spawn() вот такой код: for k,v in pairs(db.creactures) do v:add_restrictions("", self.object:name()) end (предварительно сделал, чтобы вертолёты в этот список не добавлялись) После этого в xr_motivator тоже в net_spawn() пишу for k,v in pairs(db.anomaly_by_name) do self.object:add_restrictions("", k) end (при условии, что db.anomaly_by_name[anomaly:name()] = anomaly, т.е там хранятся аномалии, которые в онлайне) Результат - вылет с ругнёй на стек. В state_mgr не нашёл ни одной функции, которая вызывала бы сама себя, поэтому и подумал насчёт одновременности. Изменено 15 Января 2011 пользователем Полтергейст Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 15 Января 2011 (изменено) o_0 Сейчас без причин стал вылетать с ругнёй на "Error in error handling". Кто знает, что это за ерунда такая? Странно, что без причин. Такими темпами он скоро напишет, что скрипты заселены аномалиями... // Присылать надо полный лог, а не "огрызок" из него... Министр. Изменено 15 Января 2011 пользователем Министр Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 19 Января 2011 И причем тут респавны? Поймите респауны работают в плотном тандеме с гуагами А если я убираю респавны вообще и прописываю всем смартам в поле communities нужные группировки - что происходит? Откуда они все спавнятся? Может это в движке зашито? Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 19 Января 2011 (изменено) Если ты действительно удаил все респавны никто больше не появится кроме тех кто изначально присутствует в алл спавне. То ли это у меня глюки, то ли у движка игры, но люди всё равно появляются. Я убрал из all.spawn все секции, у которых section_name = respawn , а также ссылки на них (в смартах. Но это не помогло. Сейчас ищу во всех файлах вызовы alife:create(), похоже это единственный вариант если я правильно понял то АМК респавн -скриптовый В том-то и дело, что respawn от АМК (в основном это тушканчики и прочая живность) я не трогал, да и спавнятся в основном люди. Изменено 19 Января 2011 пользователем Полтергейст Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 20 Января 2011 Экстренный респавн скорее всего будет работать только если есть серверный объект респавнера, потому что это функция function se_respawn:spawn() Я вот думаю, может ли заспавниться объект класса RESPAWN? То есть, могут ли респавны создаваться динамически? Если да, то это и есть причина. Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 22 Января 2011 (изменено) Как сделать фонарь ,бинокль ,пда ,нож осязаемыми? Чтобы их было видно в инвентаре ,можно было продать или выкинуть? Никак. В inventory_sect.ltx осталась возможность это делать (менять true на false и обратно для каждого слота), но её использование приводит к вылету без лога. У меня к вам такой вопросик: кто-нибкдь из читающих этот пост за всё время игры когда-нибудь видел NPC, кидающих болты по аномалиям? А то у меня вдруг обнаружилась такая фича но работает немного коряво. Корявость в том, что у NPC немного руки дрожат и кидают они их не совсем туда, куда надо. А так задумка очень неплохая. Изменено 22 Января 2011 пользователем Cyclone Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 22 Января 2011 (изменено) А как ты это сделал. Расскажи В xr_motivator.script находим и удаляем вот это: --' Для зомбированных чуваков говорим что аномалий не существует -- if self.object:character_community() == "zombied" then local manager = self.object:motivation_action_manager() manager:remove_evaluator (stalker_ids.property_anomaly) manager:add_evaluator (stalker_ids.property_anomaly, property_evaluator_const(false)) -- end Походу это какая-то движковая схема обхода аномалий, которую отключали только для зомби, а потом решили отключить вообще для всех из-за глюков с анимациями. Теоретически корявость рук и выбор направления можно исправить через правку state_mgr.script, практически пока сделал только выбор болта, если look_object - аномалия. Сообщение от модератора Cyclone Посты можно редактировать в течение 15 мин после написания. Даблпост используй только по прошествии этого времени. Изменено 22 Января 2011 пользователем Cyclone Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 23 Января 2011 ,но она там до того кривая-нпс стоят и просто десятками эти болты сыплют,гору целую,причем мимо,да еще вдобавок во время боя Если разобраться, то можно выправить. Итак, по пунктам: 1. Нпс стоят и просто десятками эти болты сыплют - скорее всего потому, что мимо кидают. Это из-за каких-то косяков в state_mgr_direction они не могут выбрать направление. 2. Да еще вдобавок во время боя - опять же, в state_mgr во время действия anomaly_planner состояние устанавливается в combat. В оригинале я не видел проверку класса обекта look_object на "аномальность" - только IsStalker и IsMonster. Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 25 Января 2011 С другой стороны, процесс уклонения начнется, как только NPC будет поражен аномалией впервые Не верится что-то. У меня бывает, что кто-то из группы Петрухи при штурме АТП стопорится перед аномалией и начинает бросать болты, при этом в аномалию чел не влетал. Даже если так, я думаю, можно как-то попробовать прописать аномалию в danger_objects неписю либо отключить фильтрацию аномалий как опасностей в xr_danger.script. Займусь этим, когда закончу с неписями, смартами и их переходом в онлайн/оффлайн и обратно. Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 27 Января 2011 ничего не менялось. Как неписи дохли в аномалиях, так и дохнут - правильно, property_anomaly, насколько я знаю, для обхода используется только посхемно (см. функции add_to_binder в схемах). Если npc идёт независимо от схем (к примеру, переходит из смарта в смарт), то он и не подумает болты кидать. НПС со сбитой логикой, швыряющего болты в собаку Вероятно, версия патча была меньше, чем 1.0004 (там эта схема вроде не вырезана) С другой стороны, процесс уклонения начнется, как только NPC будет поражен аномалией впервые Кажется, я понял, что нужно сделать. Варианта решения проблемы 2: 1. Взять из схемы Red75 нахождение ближайшей к NPC аномалии и с помощью скрипта нанести hit этой аномалией, не нанося повреждений. Тогда NPC воспримет аномалию как опасность и кинет в неё болт. Вроде как это более простое решение. 2. Поглядеть, как в xr_danger к встроенному evaluator'у property_danger добавляется скриптовый (в самом конце это видно) и таким же способом подкорректировать поведение property_anomaly (опять же, с помощью функционала схемы anomaly_evader). Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 13 Февраля 2011 (изменено) Просто ничего не меняется: подхожу к машине без ключей и сажусь в неё Можно сделать это и без customdata. К примеру, сделать в db таблицу соответствия story_id ключей и машин: db.script ... car_keys_by_sid = {} ... --' Формат заполнения: --' car_keys_by_sid[story_id машины] = story_id ключа После этого в bind_physic_object в use_callback прописать if self.object:clsid() == clsid.car_s then local sim = alife() if sim then local key_obj = sim:story_object(db.car_keys_by_sid[car_sid]) if self.object:object(key_obj:section_name()) ~= nil then --' У игрока есть ключ --' !!! Тут дописываем команду, впускающую игрока в машину else --' Ключа нет, игрока в машину не пускаем end Должно заработать, если знать команду, впускающую/не впускающую игрока в машину. и как отследить попадание ГГ в рестриктор, который без логики и не помеченый стори_айди? Без цикла скорее всего не получится... Придётся делать так: в bind_stalker в функции update() пишем for k,v in pairs(db.zone_by_name) do if v:inside(self.object:position()) then --' Тут пишем действия, которые выполняются, если игрок попал в какой-то restrictor end end Не знаю, насколько быстро это выполняется. Вполне возможно, что это вызовет тормоза или даже вылет с ругнёй на стек. Добавлено через 23 мин.: в том то и дело что нет-проверял в game_story_ids.ltx, к томуже вылет появился после добавления последней секции [10001] которая вообще без сида. Уберите customdata в этой (последней) секции Добавлено через 60 мин.: только что попробовал в файлике system.ltx в секции inventory поменять true на false у ножа и бинокля, зашёл, начал НИ, вылетов нет. В инвентарь они не попадают, т.к. в слоте находятся. А вы найдите где-нибудь второй нож или бинокль, откройте инвентарь и нажмите на него двойным кликом. Будет вылет без лога. Изменено 13 Февраля 2011 пользователем Полтергейст Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 16 Февраля 2011 вещи, спавнящиеся в тайник,находящийся в онлайне, могут пропасть,если не перевести тайник в офлайн Скорее всего это баг из-за разницы состояний (онлайн/оффлайн) между тайником и предметом. Надо будет попробовать синхронизировать. Первое, что приходит в голову - сделать поле owner в серверном объекте предмета и по нему определять "владельца" предмета, а заодно и его состояние. То есть, значения функций can_switch_*() для предметов подогнать под значения таких же функций для объекта, указанного в поле owner. Тогда все предметы будут переводиться в онлайн/оффлайн одновременно с тайником. Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 19 Февраля 2011 Но в алл.спавн я респавнера для их класса не нашёл Найдите в all.spawn смарт с именем "esc_lager", там в customdata есть ссылка на этот респавн. Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 23 Февраля 2011 Вообщем, как мне сделать так, чтобы мои новые нпс и монстры, после смерти, через время, вновь спавнились? И стоит ли в их кустомдатах прописывать гулаг? Не надо ничего доспавнивать. Вам нужно просто изменить поле "communities" в большинстве смартов, у которых type = general_lager или general_lair, а именно - дописать в communities как можно больше группировок. В моей версии этого мода, к примеру, долговцы свободно (извиняюсь за каламбур) ходят по кордону. Можно даже встретить военных на АТП, на ферме, на переходе на свалку. Поделиться этим сообщением Ссылка на сообщение