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

[SoC] Ковыряемся в файлах


Halford

Рекомендуемые сообщения

За это время очень много интересного нарыл.

 

Что сделал:

Для 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. Как и почему такое могло произойти - тоже понять не могу.

Изменено пользователем Полтергейст

Поделиться этим сообщением


Ссылка на сообщение

Возьмите restriction_stock из AMK и пропишите точно также. Только желательно вместо таблицы для каждого названия секции сделать подсчёт объёма по ef_weapon_type и ef_outfit_type для оружия и броников. Для еды и аптечек по классу задать объём равным 1.

 

Если не можете - сойдёт и так, как сделано в АМК.

Изменено пользователем Полтергейст

Поделиться этим сообщением


Ссылка на сообщение

Не везёт так не везёт :(

 

С переносом результатов выполнения функции 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 - тот же результат. Что я делаю не так?

Поделиться этим сообщением


Ссылка на сообщение

Хочу избавиться от вылетов из-за переполнения стека, которое иногда возникает, если в онлайне много NPC. На одной из предыдущих страниц мне подсказали, что надо копать в сторону функций can_switch_*() и по возможности заменить их переменными, вроде как количество вылеты из-за переполнения стека должны если не исчезнуть, то хотя бы уменьшиться.

Изменено пользователем Полтергейст

Поделиться этим сообщением


Ссылка на сообщение
переполнение стека происходит тогда, когда функция многократно вызывает сама себя

 

Не обязательно "сама себя". Насколько я понял, достаточно, чтобы функция многократно вызывалась за короткий промежуток времени не важно откуда. Такое я случайно спровоцировал, когда эксперементировал с добавлением restrictor'ов, хотя никакой рекурсии не было.

 

Сначала я думал, что если игра ругалась на state_mgr, то в нём собака и зарыта, но вчера сам видел, как перед вылетом npc начинают то исчезать, то появляться снова - т.е. скакать из онлайна в оффлайн и обратно. Учитывая, что can_switch_* вызывается раз в секунду, то скорее всего такие глюки при большом скоплении npc именно из-за этого. А это уже тянет за собой частый вызов net_spawn() и net_destroy() для биндера, к которому как раз "приделан" state_mgr, вот мы и имеем то, что имеем...

Изменено пользователем Полтергейст

Поделиться этим сообщением


Ссылка на сообщение
Проблема со стеком может быть следствием других сбоев, но каких именно - естественно так просто не скажешь.

Ну вот у меня с 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 не нашёл ни одной функции, которая вызывала бы сама себя, поэтому и подумал насчёт одновременности.

Изменено пользователем Полтергейст

Поделиться этим сообщением


Ссылка на сообщение

o_0 Сейчас без причин стал вылетать с ругнёй на "Error in error handling". Кто знает, что это за ерунда такая? Странно, что без причин.

Такими темпами он скоро напишет, что скрипты заселены аномалиями...

 

// Присылать надо полный лог, а не "огрызок" из него... Министр.

Изменено пользователем Министр

Поделиться этим сообщением


Ссылка на сообщение
И причем тут респавны?

Поймите респауны работают в плотном тандеме с гуагами

А если я убираю респавны вообще и прописываю всем смартам в поле communities нужные группировки - что происходит? Откуда они все спавнятся? Может это в движке зашито?

Поделиться этим сообщением


Ссылка на сообщение
Если ты действительно удаил все респавны никто больше не появится кроме тех кто изначально присутствует в алл спавне.

То ли это у меня глюки, то ли у движка игры, но люди всё равно появляются. Я убрал из all.spawn все секции, у которых

section_name = respawn

, а также ссылки на них (в смартах. Но это не помогло. Сейчас ищу во всех файлах вызовы alife:create(), похоже это единственный вариант :(

 

если я правильно понял то АМК респавн -скриптовый

В том-то и дело, что respawn от АМК (в основном это тушканчики и прочая живность) я не трогал, да и спавнятся в основном люди.

Изменено пользователем Полтергейст

Поделиться этим сообщением


Ссылка на сообщение

Экстренный респавн скорее всего будет работать только если есть серверный объект респавнера, потому что это функция

function se_respawn:spawn()

Я вот думаю, может ли заспавниться объект класса RESPAWN? То есть, могут ли респавны создаваться динамически? Если да, то это и есть причина.

Поделиться этим сообщением


Ссылка на сообщение
Как сделать фонарь ,бинокль ,пда ,нож осязаемыми? Чтобы их было видно в инвентаре ,можно было продать или выкинуть?

Никак. В inventory_sect.ltx осталась возможность это делать (менять true на false и обратно для каждого слота), но её использование приводит к вылету без лога.

 

У меня к вам такой вопросик: кто-нибкдь из читающих этот пост за всё время игры когда-нибудь видел NPC, кидающих болты по аномалиям? А то у меня вдруг обнаружилась такая фича но работает немного коряво. Корявость в том, что у NPC немного руки дрожат и кидают они их не совсем туда, куда надо. А так задумка очень неплохая.

Изменено пользователем Cyclone

Поделиться этим сообщением


Ссылка на сообщение
А как ты это сделал. Расскажи

В 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 мин после написания. Даблпост используй только по прошествии этого времени.
Изменено пользователем Cyclone

Поделиться этим сообщением


Ссылка на сообщение
,но она там до того кривая-нпс стоят и просто десятками эти болты сыплют,гору целую,причем мимо,да еще вдобавок во время боя

Если разобраться, то можно выправить. Итак, по пунктам:

 

1. Нпс стоят и просто десятками эти болты сыплют - скорее всего потому, что мимо кидают. Это из-за каких-то косяков в state_mgr_direction они не могут выбрать направление.

2. Да еще вдобавок во время боя - опять же, в state_mgr во время действия anomaly_planner состояние устанавливается в combat. В оригинале я не видел проверку класса обекта look_object на "аномальность" - только IsStalker и IsMonster.

Поделиться этим сообщением


Ссылка на сообщение
С другой стороны, процесс уклонения начнется, как только NPC будет поражен аномалией впервые

Не верится что-то. У меня бывает, что кто-то из группы Петрухи при штурме АТП стопорится перед аномалией и начинает бросать болты, при этом в аномалию чел не влетал.

Даже если так, я думаю, можно как-то попробовать прописать аномалию в danger_objects неписю либо отключить фильтрацию аномалий как опасностей в xr_danger.script. Займусь этим, когда закончу с неписями, смартами и их переходом в онлайн/оффлайн и обратно.

Поделиться этим сообщением


Ссылка на сообщение
ничего не менялось. Как неписи дохли в аномалиях, так и дохнут
- правильно, 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).

Поделиться этим сообщением


Ссылка на сообщение
Просто ничего не меняется: подхожу к машине без ключей и сажусь в неё

Можно сделать это и без 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 у ножа и бинокля, зашёл, начал НИ, вылетов нет. В инвентарь они не попадают, т.к. в слоте находятся.

А вы найдите где-нибудь второй нож или бинокль, откройте инвентарь и нажмите на него двойным кликом. Будет вылет без лога.

Изменено пользователем Полтергейст

Поделиться этим сообщением


Ссылка на сообщение
вещи, спавнящиеся в тайник,находящийся в онлайне, могут пропасть,если не перевести тайник в офлайн

Скорее всего это баг из-за разницы состояний (онлайн/оффлайн) между тайником и предметом. Надо будет попробовать синхронизировать. Первое, что приходит в голову - сделать поле owner в серверном объекте предмета и по нему определять "владельца" предмета, а заодно и его состояние. То есть, значения функций can_switch_*() для предметов подогнать под значения таких же функций для объекта, указанного в поле owner. Тогда все предметы будут переводиться в онлайн/оффлайн одновременно с тайником.

Поделиться этим сообщением


Ссылка на сообщение
Но в алл.спавн я респавнера для их класса не нашёл

Найдите в all.spawn смарт с именем "esc_lager", там в customdata есть ссылка на этот респавн.

Поделиться этим сообщением


Ссылка на сообщение
Вообщем, как мне сделать так, чтобы мои новые нпс и монстры, после смерти, через время, вновь спавнились? И стоит ли в их кустомдатах прописывать гулаг?

Не надо ничего доспавнивать. Вам нужно просто изменить поле "communities" в большинстве смартов, у которых type = general_lager или general_lair, а именно - дописать в communities как можно больше группировок. В моей версии этого мода, к примеру, долговцы свободно (извиняюсь за каламбур) ходят по кордону. Можно даже встретить военных на АТП, на ферме, на переходе на свалку.

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...