Перейти к контенту

Полтергейст

Опытные
  • Число публикаций

    318
  • Регистрация

  • Последнее посещение

  • AMKoin

    30 [Подарить AMKoin]

Весь контент пользователя Полтергейст

  1. У меня в ТЧ такое было после правки скриптов. Бывает при движковых ошибках при работе с пакетами, могут быть и другие причины. Проблема может быть в этой строке: скорее всего там nil, потому что %s не заменияется тем, чем надо.
  2. Полтергейст

    AI вертолетов

    В смысле? Я свои вертолёты не ставил, этим безобразием занимается вертолёты, патрулирующие ЖД насыпь. На агропроме 2 вертолёта умудрились опуститься под землю - теперь при переходе в подземку исправно ловлю вылет без лога, скорее всего из-за этого...
  3. Полтергейст

    AI вертолетов

    А что делать, если вертолёты, находящиеся под этой схемой, обстреливают ворон? Как отучить их от этого развлечения?
  4. А может смарт ещё не работает. Если у него в секции [smart_terrain] в all.spawn есть строка cond с прописанным условием существования смарта и это условие НЕ выполняется, то это и может быть причиной. Попробуйте указать другой смарт или убрать это условие.
  5. Прочитать параметр ammo_class в секции пушки.
  6. Хех, только что нашёл решение проблемы обхода аномалий. Просто им нужно присваивать restrictor_type = 2 с помощью net_packet'ов при спавне. Тогда они автоматически добавляются движком в рестрикторы ко всем npc. _Призрак_ Перед этой строкой напишите так: if db.storage[zone:id()] == nil then db.storage[zone:id()] = {} end Вылет должен исчезнуть.
  7. Если объект удаляет сам себя (функция удаления вызывается из методов его класса), то вылет будет без лога. Проверено на функциях can_switch_* вчера. Попробуйте в xr_camper заменить строку action:add_precondition (world_property(stalker_ids.property_danger,false)) на action:add_precondition (world_property(stalker_ids.property_danger_grenade,false)) - лога не будет. Ну почему, мне как-то раз понадобилось повесить скрипты на гранаты (на их серверные объекты) и тут как раз глюкнул akelpad в момент сохранения - подрезал конец документа и заполнил его 5-ю копиями одной строки. Результат очевиден P.S. Битые сохранения и попытки использовать функции класса net_packet(), не соответствующие типу данных (к примеру, packet:r_stringZ() для считывания числа или bool) тоже относятся к первому пункту (неправильное использование класса net_packet())
  8. У меня эта функция как раз глобальная из _g.script (перенёс для удобства), вот и написал по привычке. В таблице рестрикторов они тоже есть - в биндере смарта есть вызов db.add_zone()
  9. Это одно и то же. При вызове npc_in_zone(db.actor, zone) zone - клиентский объект restrictor'а, а не его имя. При таком обращении db.zone_by_name[sZoneName] мы как раз получим этот объект из таблицы. Если "слепить", то получится так: local zone = db.zone_by_name[sZoneName] local actor_v_zone = npc_in_zone(db.actor, zone) А если нам нужно имя restrictor'а, в котором находится actor, то local inside_zones = {} for name, zone in pairs(db.zone_by_name) do if npc_in_zone(db.actor, zone) == true then inside_zones[name] = true else inside_zones[name] = false end
  10. Если вы столкунулись с вылетом без лога, постарайтесь вспомнить следующее: 1. Что изменяли в последний раз 2. Во время чего вылет произошёл 3. На какой локации 4. Случайно ли он проявляется или только при приближении к определённому месту/объекту 5. Попробуйте отследить имя последнего перешедшего в онлайн объекта 6. Попробуйте поискать в своих правках ошибки, подходящие под нижеперечисленную классификацию. Известные причины вылетов без лога:
  11. Призрак А в чём проблема? Пишем: где zone - это restrictor, который надо проверить. Если надо узнать, входит ли actor вообще хоть в какой-нибудь restrictor, то для этого надо перешивать class_registrator.script и возиться с биндерами, если надо - напишу готовый вариант, сам только что сделал такое у себя.
  12. Подскажите, как переделать amk_anoms.script, чтобы статус аномалии сохранялся не в customdata, а в специальном поле серверного объекта? А то у меня ерунда какая-то получается...
  13. Помечу-то SChecker ругается на amk_offline_alife, выдаёт "invalid floating point operation". Если убрать из скрипта сравнение с числом 4294967296, то ошибка уходит. Что это значит?
  14. И ещё такой вопрос: как определить, какой класс можно перегрузить, а какой нет? Вот, к примеру, есть такой сет: "CActor", "se_actor.se_actor", "O_ACTOR", "actor", но он (скрипт) не работает. А если я напишу так "CActor", "se_actor.se_actor", "S_ACTOR", "actor_s" это что-нибудь изменит? Или проблема не жёстко прописаном в движке конфиговом имени класса (O_ACTOR), а в самом классе cse_alife_creature_actor?
  15. Сегодня обнаружил, что класса CInfoDocument почему-то нет в lua_help, хотя в xr_game.dll он упоминается. Вот никак не пойму, есть он или нет. То же самое с CAttachableItem, CMedkit, CAntirad, CFoodItem, CBottleItem, CExplosive, CPda и некоторыми другими.
  16. Эта функция отвечает за добавление биндера к неписю. Я просто поставил проверку на npc == nil, чтобы биндер не создался по ошибке "сам по себе". Но вряд ли это поможет, у меня такое было с военными на кордоне. Проблему решил удалением трёх глючных неписей из all.spawn - всё заработало. После этого несколько раз изменял свои правки, попробовал этих неписей вернуть - вернулись без проблем, таких глюков нет. P.S. вычислить глючащего npc можно так: начать новую игру (или перейти на тот уровень, где глючит), сохраниться и попробовать загрузить это сохранение. Если будет ошибка ""SAVE FILE IS CORRUPT", то это хорошо. Далее, в xr_motivator, в функции загрузки, надо найти if reader:r_eof() then abort("SAVE FILE IS CORRUPT") end и заменить на if reader:r_eof() then abort("SAVE FILE IS CORRUPT! NPC: %s", self.object:name()) end При чтении self.object ещё не обнулился и можно отследить имя глючащего.
  17. Да, точно, что-то я туплю. Классы ce_smart_zone и cse_alife_smart_zone остались на месте, значит восстановить можно.
  18. Тогда без ковыряния smart_terrain.script тут никак не обойтись. Я делал как-то, чтобы неписи не прописывались во враждебном гулаге, это не сложно. Но здесь вопрос поставлен немного по-другому - сделать, чтобы они наплевали на счётчик свободного места в смарте и шли всё равно. Надо будет доделать это как-нибудь, вряд ли есть другие способы. Чтобы шли "с оружеем на изготовку", надо, чтобы они заранее заметили врага. Иначе приётся ковырять многострадальный state_mgr.script, чтобы непись всегда был в состоянии "danger", пока не займёт смарт. Скрипт этот перегружает стек. Не знаю как и почему, там дофига evaluator'ов и в связи с этим разбираться с ними нелегко. Бывает, что вылетает без лога. Если перенести state_mgr из ЗП, то вылет пропадает, но полностью перенести его пока не получилось, для этого нужен кто-то, кто хорошо разбирается в evaluator'ах. @"StreloK" Замените функцию xr_motivator.AddToMotivator(npc) на такую: Если не поможет - сносите свои правки, я как-то тоже доправился, что командир военных на кордоне и двое спецназовцев были фактически без биндера (вернее, без self.object'а для него) и глючили.
  19. В скриптах он уже не упоминается - ни в регистраторе классов, ни в lua_help. Так что, скорее всего нет.
  20. Очень просто - в customdata всех нападающих неписей прописать: [smart_terrains] имя смарта, в котором отряд до нападения = {-инфопоршень - сигнал к атаке} имя смарта, на который надо напасть = {+инфопоршень - сигнал к атаке} Кстати, кто-нибудь знает, какой скрипт читает секцию smart_terrains и разбирает всё это дело? А то я что-то кроме xr_wounded ничего не нашёл... P.S. этот метод не пойдёт, если нужен любой состав смарта (т.е. если в нём любые неписи, а не только те, которым всё это дело прописано). Можно сделать и это, но если ответ на вопрос (который чуть выше) не будет найден, то придётся возиться с net_packet(). P.P.S. Кто знает, уменьшатся ли проблемы со стеком, если снизить настройки графики? так и называется: smart_terrain.script. Куфзук
  21. Я имел в виду АМК мод - там всё это реализовано, но обработку инфопоршней не видел. В движке (классы cse_alife_human_stalker, cse_alife_monster_*) есть функция on_death, которая вызывается, если существо (сталкер или зверюшка) сыграло в ящик. Можно было бы сделать что-нибудь вот такое: local infotable = {} --' Формат: infotable[npc:name()] = "info_portion" function on_death(killer) cse_alife_human_stalker.on_death(self, killer) if db.actor ~= nil and infotable[self:name()] ~= nil then db.actor:give_info_portion(infotable[self:name()]) end --' Тут можно вставить вызов других функций, например news_main.on_offline_death(self, killer) ... end Короче говоря, сопоставить имени (или другому критерию) объекта инфопоршень и выдавать его когда надо. То же самое можно сделать для on_spawn() - выдавать инфопоршень при появлении объекта. P.S. кстати, пробовал для этих классов перегружать функции health() и alive() - ругается на pure virtual call
  22. А если его в оффлайне замочат или съедят?
  23. Подскажите, что именно значит такая ошибка: [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: d:\games\stalker\gamedata\scripts\move_mgr.script:250: attempt to call field 'get_anomaly_list_for_pos' (a nil value) Что именно это значит? Он не видит функцию или же она возвращает nil? Если что, функция на месте (скрипт amk_anoms). Может ли какая-то ошибка в синтаксисе LUA до этой функции вызвать такое безобразие? И ещё один вопрос: я сделал так, что вместо аномалий amk_zone* спавнятся просто zone_* (динамические аномалии), так вот, во втором случае из них появляются артефакты. Как-то так само собой получилось, что их появляется много, и в такой ситуации почему-то очень косячат диалоги (просто не отображаются некоторые фразы для ответа, например "До встречи". Как только менаю обратно на amk_zone* - глюк исчезает вместе с большим количеством артов. Как это может быть связано между собой? Добавлено через 22 мин.: И ещё одно наблюдение: динамические рестрикторы у меня снова заработали, правда, только для монстров (людей до этого перевёл на схему anomaly_evader). Теперь я понял, почему они слетают. Похоже, что это первый признак перегрузки стека - функции add_restrictions() и remove_restrictions() из-за этого просто перестают работать. Нашёл в скриптах немало функций, которые попусту перебирают все объекты и тратят на это время. Выглядят они так: for i = 0,65534 do if level_object_by_id(i)~= nil then --' Какое-то действие end end Для этих целей есть таблица db.creatures, было бы логичнее использовать её, т.к. там только онлайн-объекты.
  24. Делаем секцию [known_info] в customdata сталкера и в ней (то есть после этой строки) пишем имена выдаваемых инфопоршней. Делается это через all.spawn. Если NPC заспавнен через скрипт, тогда надо через net_packet'ы записывать ему customdata. Как именно - не знаю.
  25. Это просто заглушка, перенаправляющая на функцию sim_board.create_squad. Нужна для того, чтобы можно было вызывать из логики.
×
×
  • Создать...