Dennis_Chikin 3663 Опубликовано 16 Марта 2011 Кстати, руки чешутся оторвать сохранение/загрузку текущих работ. По тому что в большинстве случаев работа всегда только одна, либо меняется в зависимости от времени суток / событий. Время суток вычисляется при каждом опросе, состояния - аналогично. Почему бы при запуске гулагов и сами работы не назначать бы заново ? Чем может быть чревато ? Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 23 Октября 2011 (изменено) Кто-нибудь разбирался со "злопамятностью" неписей ? Картина следующая: Например, на кордоне сидят сталкеры у костерка между АТП и насыпью. (Или даже вообе на АТП). С насыпи в районе креста/гулага кабанов вываливается в онлайн вояка с насыпи, и резво бежит на место. Сталкеры, мельком увидев вояку, поднимаются, и идут на разборки - да хоть под мост. Еще банальнее - ГГ устраивает перестрелку под мостом, сбегает, прячется. Вояки доходят до мета, где видели ГГ последний раз, и минут пять стоят там, уткнувшись в землю стволами. Пока состояние гулага по времени не сменится. Причем эвалюатор в xr_ganger.script давным-давно возвращает false. Еще: Непись сидит под смартом, где ему запрещено воевать. Рядом - враг. Враг уходит довольно таки далеко (гарантированно за препятствием), отпускаем непися из под смарта, и он бежит за врагом. Хотя и не видит нифига. Где-то по пути он может потерять предмет охоты окончательно, но продолжает находиться в состоянии боя. А самое мерзкое, что в этом состоянии его и под смарт обратно взять нельзя. То есть, пример: Сцена в ТД, с бандитом и долговцем. У бандита [smart_terrains] val_escort = {-val_escort_scene_end -val_bandit_talk} val_lager_bandits = {+val_escort_scene_end}, {+val_bandit_talk} Даем val_bandit_talk - и бандюк побежал охотиться на долговца. Делаем их нейтралами друг к другу - и бандит нормально берется под val_lager_bandits Изменено 23 Октября 2011 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 23 Октября 2011 Вес - он и есть вес. В смысле, в общей куче. типа, 10+90 = 100%. Когда все по нулям, а у одного параметра много - только он и будет учитываться. Два с одинаковым, остальные по нулям - эти 2 - пополам. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 25 Октября 2011 Возникло такое странное ощущение, что или я чего-то не понимаю, или set_relation() работает только для актора. Гляньте, кому не лень... Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 26 Октября 2011 (изменено) Код, даже не мой - полез разбираться, почему фигня происходит: for npcId, npc in pairs(db.storage) do obj = level.object_by_id(npcId) if obj and IAmAStalker[obj:clsid()] and npcId ~= second_speaker:id() and obj:alive() then if obj:see(first_speaker) then obj:change_goodwill(math_floor(25-(5+5*difficulty)), first_speaker) end if obj:relation(second_speaker) == game_object.enemy and obj:relation(first_speaker) ~= game_object.enemy then obj:enable_memory_object(second_speaker, false) obj:set_relation(1--[[obj:relation(first_speaker)]], second_speaker) end if second_speaker:relation(obj) == game_object.enemy then log("info", "transfer_medkit, %s and %s are enemyes", second_speaker:name(), obj:name()) if obj:relation(first_speaker) ~= game_object.enemy then log("info", "transfer_medkit, change relations") second_speaker:set_relation(1--[[first_speaker:relation(obj)]], obj) second_speaker:enable_memory_object(obj, false) log("info", "transfer_medkit, %s and %s now are enemyes: %s", second_speaker:name(), obj:name(), tostring(second_speaker:relation(obj) == game_object.enemy)) end end end end лог: ! Cannot find saved game ~info~: [dialogs] transfer_medkit, val_escort_bandit_halfdead and val_prisoner_captive are enemyes ! Cannot find saved game ~info~: [dialogs] transfer_medkit, change relations ! Cannot find saved game ~info~: [dialogs] transfer_medkit, val_escort_bandit_halfdead and val_prisoner_captive now are enemyes: true ! Cannot find saved game ~info~: [dialogs] transfer_medkit, val_escort_bandit_halfdead and val_escort_nap1 are enemyes ! Cannot find saved game ~info~: [dialogs] transfer_medkit, change relations ! Cannot find saved game ~info~: [dialogs] transfer_medkit, val_escort_bandit_halfdead and val_escort_nap1 now are enemyes: true Изменено 26 Октября 2011 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 26 Октября 2011 malandrinus Строка: second_speaker:set_relation(game_object.neutral, obj) - и ни чем по результату не отличима от исходной и при любом раскладе похволяет отсечь любые нюансы как парсера движка, так и прочее ... Именно, что ни чем не отличима. В обоих случаях один непись в течение нескольких минут бегает за другим, и в итоге они благополучно устраивают разборку. Если меняем отношения с ГГ - срабатывает мгновенно. Хотя и криво (непись продолжает сколь угодно долгое время воспринимать ГГ как дэнжер-объект с типом enemy_sound). Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 26 Октября 2011 (изменено) А при необходимости даже и денжеры сбрасывать ... Не стоит думать, что игра все сама за модмейкера разрулит. Приводи конкретную ситуацию (желательно применимо к исходной игре) и бум посмотреть ... Сбрасывать - это как ? А ситуацию описывал чуть раньше. Соль. Конкретно я пытался поправить сцену на входе в Темную Долину. Там бандита можно лечить, после чего ГГ меняется группировка, а бандит выгоняется из под смарта val_escort и захватывается val_lager_bandits. И идет в этот самый лагерь. Было изменено лечение, с попыткой изменять отношения неписей. Изменения отношений я не вижу. Отношение к ГГ меняется, но бандит находится под дэнжером, и выгоняться из смарта - выгоняется, но не захватывается, а вместо этого начинает охотиться на долговцев. Результаты лечения других неписей в других местах - тоже странны. По логу - отношения неписей к ГГ меняются, а вот между собой - нет. P.S. Общегрупповые правила - похоже, да. Попробую посмотреть. Изменено 26 Октября 2011 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 22 Ноября 2011 Как правильно удалить предмет из тайника? Нужно ли проводить какие нибудь манипуляции перед alife():release? Если в это время из него ни кто ничего не вытаскивает - в любой момент можно. А вот с удалением неписей из онлайна, включая трупы, пронаблюдал забавный эффект: "- Critical: SMapLocation binded to non-existent object id=xxxxx", причем id - внезапно, патроны, и только они, заспавненные через профиль. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 23 Ноября 2011 А "твой забавный эффект" происходит от того, что, например, при убийстве НПС и его удалении, нередко бывает что, покойник стрелял из автомата и этот автомат (принадлежащий ему) продолжает неккоторое время еще стрелять Непись АБСОЛЮТНО спокоен. Если только в анимацию смерти даже в спокойном состоянии не входит "пострелять". Но это, как правило, когда ствол в руках. А здесь - даже и за спиной висит. По патронам - тупо, поиском, поставил лог на все release. Не вижу удаления патронов. 8( Если только какой-то адов механизм зарядки ствола при смерти. Вообще, надо будет попробовать все стволы отобрать, и потом убить. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 31 Декабря 2011 (изменено) медитирую на код: local module, fname = string.match( func, "(.+)[.](.+)" ) func = _G[module][fname] if func then func() end Это я чего-то не понимаю, или действительно так надо ? KD87, ну, скобка потерялась при копировании. А вот что не так - не работает. И вообще говоря, если в _G оно не вывернуто как-то хитро, то должно таки [fname][module]. Или как ? Изменено 1 Января 2012 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 1 Января 2012 (изменено) По-хорошему тут, наверное, даже не string.match() надо бы, наверное. Поскольку ну очень сложно представить на входе нечто отличное от строки "myscript.myfunc" А порядок вызова точно правильный ? По тому что при внимательном рассмотрении простыни обнаружено как _G[fname], так и +G[module][fname]... Все. Кажется, дошло... Где-то крепко попутано имя функции, имя файла, и модуль... Надо по шагам разбирать всю простыню. 8( P.S. а отжигов в исходном вообще в количестве. Ну солянка же... Со всего инета все подряд, напихано как попало. Один разворот cs:wnd():SetText(string_format("%02d:%02d", time_h, time_m)) на 40 строк с аццкой логикой и десятком регэкспов чего стоит... Изменено 1 Января 2012 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 1 Января 2012 (изменено) Artos, Но если уж предполагать, то упомянутое Dennis_Chikin напоминает мне ковыряние с xr_logic.script, где у меня, например это Да, и здесь - тоже. Только гибрид чей-то правки с оригиналом: если нет модуля/функции - идем смотреть xr_effects, а не xr_conditions. И вообще много где, кроме как в этом фрагменте. Идея везде она и та же. А исполнение - разное. Как размножается код в модах ? В основном, копипастом. Потом где-то что-то меняется немножко. Конструкции получаются порою странные. И кроме того, что получилось, надо еще понять - а чего вообще хотели-то, когда делали. Кстати, по xr_logic - в приведенном куске нил возвращать вообще безопасно ? Или лучше на рабочий стол сразу нафиг ? Как раз применительно к штатному xr_logic.script и иже твоя фраза ... - некорректна. И тот и иной скрипты штатно прописаны в xr_logic.script, только для разных целей О, как ! Значит все еще чудесатее, чем казалось сначала. Надо будет сравнить с оригиналом полностью и построчно, пожалуй. Изменено 1 Января 2012 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 2 Января 2012 (изменено) Получил сейчас вылет с интересной диагностикой, и нашел по нему вот это: http://www.amk-team.ru/forum/index.php?sho...25&st=2318# Интересно, тогда как-то разобрались с проблемой ? Чем-то похоже на обсуждавшееся вчера-сегодня ночью с регэкспом и обращением к _G[чего-то-там] Добавлено через 43 мин.: Artos, однако module, fname = string.match(func, '(%w+)%.(%w+)') превращает, например, arhara_dialog.lysyi_sms в dialog.lysyi. Так что тоже не самый удачный вариант. Гм... даже не подумал, что "_" - это разделитель и в смысле регэкспов. Очевидно, надо строки просить. Upd: Ага, спасибо за "|". Но пока оставим как есть, наверное, и будем ругаться/вылетать тупо по обнаружению отсутствия файла/функции. А то там всего можно ожидать... Пару раз на попытках сделать "защиту" уже обжегся - проблему непосредственно в месте обнаружения проходило, зато потом чудеса начинались. Изменено 2 Января 2012 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 7 Января 2012 (изменено) Запутался... Вручаем неписю в руки что-нибудь. Скажем, item:enable_attachable_item( true ). Вручилось. Непись замечательно проигрывает с этим предметом анимации - ест/пьет/на гормошке играет. Вдруг, внезапно, непись умирает. Что будет идеологически правильно: сделать enable_attachable_item( false ), ничего не трогать вообще, удалить итем нафиг, что-то еще(что именно) ? Код, который смотрю, делает первое. Причем, похоже, после того, как по on_death удалил сам предмет. Что странно. Ну, то есть, function action_foo:finalize() item = npc:object( "figovina" ) if item then enable_attachable_item( false ) end end удаление вызывается в on_death() из мотиватора раньше, чем вызовется action_foo:finalize(). P.S. На всякий случай переформулирую: я правильно понял, что в :finalize() схемы предмет можно дисейблить, только если выполнение схемы прервано нештатным образом, но непись при этом жив ? И, кстати, объект, наверное, стоит не получать прямо здесь по секции, а где-то хранить, на случай, если их c такой секцией окажется несколько ? А удалять у мертвого непися можно в любой момент, при условии, что он (предмет, да и непись тоже) ни кем и ни чем больше не трогается ? P.P.S. Аналогичный вопрос для случая с on_net_destroy(): с предметами в руках у неписей в этот момент, наверное, ничего делать не стоит ? Изменено 7 Января 2012 пользователем ColR_iT Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 8 Января 2012 Чаще всего - прилетел game_object туда, где ждали что-нибудь другое. Как правило - строку или number. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 28 Апреля 2012 (изменено) Вообще, я вопрос про отношения некотоое время назад поднимал. Установление отошений непись-непись скорее не работает совсем, чем работает хоть как-нибудь. По крайней мере кодом мне не удавалось поймать момент, когда враги оказывались не врагами. И если даже меняется, то "отработать" где-либо (скажем, при вычислении опасности или наличия/отсутствия врагов) - не успевает. Можно задать goodwill неписю, или группировке. Причем, к актору - работает в любое время, а вот с прочими неписями опять таки проблемы ( вообще - логично, поскольку хранить неграниченного размера список неписей - это ой). Artos, вообще, в нескольких местах имеет место быть код, подозрительный на переполнение репутации. Все собираюсь посмотреть, но все не до этого. Upd: да, это вопрос. В смысле, ни у кого аналогичного ощущения не возникало ? Хек, правку по известному сюжету ТД для известного мода выложу на днях - как только разберусь с кривым отображением видимости актора для врагов. Там будут нейтральные после лечения отдельные враги, и отдельно изменение отношений группировок за "заслуги". А группировка неписям меняется только неименным, или на короткое время, чтобы избежать разборок между вылеченным и участниками сцены из враждебной ему группировки. То есть, работает так: отношение непися к актору дается таким, чтобы в сумме с отношением группировки получилось чуть больше 0, непись загоняется в группировку, нейтральную всем (чтобы не убили эти самые все, и чтобы непись успел уйти под нужный смарт, а не срывался в бой), потом по таймеру возвращается обратно. Отношение группировок меняется независимо (вычисляем разницу между текущим и нужным, сохраняем, прибавляем. Потом при надобности, вычитаем). В общем, все красиво, за исключением, что индикатор видимости актора врагами после такого лечения застревает в максимуме, до следующей перезагрузки. Ну, как при исчезновении собакофантомов. Изменено 29 Апреля 2012 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 26 Мая 2012 (изменено) Что делает вызов amk_particle.amk_particle() ? Скрипт, ну, предположим, стандартный от amk ? Это amk_particle:__init(params) вызывается ? А что он возвращает ? Artos, ага, спасибо. Парочку тривиальных вида nil:add( что попало ) уже вижу. Ну и, как я понимаю, конструкция вида if p:is_finished() then p:update() применительно к этому "классу" - это, вроде, тоже не совсем здраво ? Изменено 26 Мая 2012 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 6 Июня 2012 Странный такой вопрос возник: local packet = net_packet() sobj:STATE_Write(packet) - в packet ведь полностью наша копия того, что было в момент получения ? Что хотим, то и делаем ? Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 6 Июня 2012 (изменено) Artos, какой код - такие и вопросы. Я, как обычно, пытаюсь понять сакральный смысл перечитывать именно это 100500 раз подряд, и полностью разбирать содержимое ради одного значения (18-я запись из 100500 возможных). upd: Ну, как-бы, есть разница немалая - до нужного, или весь. пара-тройка десятков мс, или аж полсекунды тормозов, и так - 20 раз подряд. Если мы не собираемся его перезаписывать - достаточно один раз прочитать, и один раз разобрать ровно до куда надо. Вроде бы. А вот по тем перекрестным ссылкам из пяти простыней, которые вопрос и вызвали, можно было предположить сколь угодно странное. Типа наличия какого-нибудь внутреннего счетчика, который нужен еще чему-нибудь, и если разобрали не за один раз, и не до конца, то случится страшное. Upd2: да не над чем там смеяться. Все занудно. В первом вопросе информации вполне достаточно, в ответе - тоже. По результатам снесу сотню-другую килобайт. А вот что до времени - с чтением с диска и последующим разбором - не сравнить, но тоже не мало. Специально мерил. Именно что до полусекунды получается иногда. В первый раз когда увидел - офигел. Изменено 6 Июня 2012 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3663 Опубликовано 24 Июля 2012 (изменено) Интересный тут вопрос возник... Есть некий объект, на который мы сохраняем ссылку. Пусть это будет game_object, как в xr_danger.script: db.storage[self.object:id()].enemy = best_danger:object() Затем с объектом по какой-то причине происходит destroy. На что указывает сохраненная ссылка ? nil ? Изменено 24 Июля 2012 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение