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

Скриптование


Svoboда

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

Кстати, руки чешутся оторвать сохранение/загрузку текущих работ. По тому что в большинстве случаев работа всегда только одна, либо меняется в зависимости от времени суток / событий.

Время суток вычисляется при каждом опросе, состояния - аналогично. Почему бы при запуске гулагов и сами работы не назначать бы заново ?

 

Чем может быть чревато ?

 

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


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

Кто-нибудь разбирался со "злопамятностью" неписей ?

 

Картина следующая:

Например, на кордоне сидят сталкеры у костерка между АТП и насыпью. (Или даже вообе на АТП).

С насыпи в районе креста/гулага кабанов вываливается в онлайн вояка с насыпи, и резво бежит на место. Сталкеры, мельком увидев вояку, поднимаются, и идут на разборки - да хоть под мост.

 

Еще банальнее - ГГ устраивает перестрелку под мостом, сбегает, прячется. Вояки доходят до мета, где видели ГГ последний раз, и минут пять стоят там, уткнувшись в землю стволами. Пока состояние гулага по времени не сменится.

 

Причем эвалюатор в 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

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

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


Ссылка на сообщение
Поделиться на других сайтах

Вес - он и есть вес. В смысле, в общей куче.

типа, 10+90 = 100%.

Когда все по нулям, а у одного параметра много - только он и будет учитываться. Два с одинаковым, остальные по нулям - эти 2 - пополам.

 

 

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


Ссылка на сообщение
Поделиться на других сайтах

Возникло такое странное ощущение, что или я чего-то не понимаю, или set_relation() работает только для актора.

 

Гляньте, кому не лень...

 

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


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

Код, даже не мой - полез разбираться, почему фигня происходит:

    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

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

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


Ссылка на сообщение
Поделиться на других сайтах
malandrinus

Строка: second_speaker:set_relation(game_object.neutral, obj) - и ни чем по результату не отличима от исходной и при любом раскладе похволяет отсечь любые нюансы как парсера движка, так и прочее ...

 

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

 

Если меняем отношения с ГГ - срабатывает мгновенно. Хотя и криво (непись продолжает сколь угодно долгое время воспринимать ГГ как дэнжер-объект с типом enemy_sound).

 

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


Ссылка на сообщение
Поделиться на других сайтах
(изменено)
А при необходимости даже и денжеры сбрасывать ... Не стоит думать, что игра все сама за модмейкера разрулит.

Приводи конкретную ситуацию (желательно применимо к исходной игре) и бум посмотреть ...

 

Сбрасывать - это как ?

 

А ситуацию описывал чуть раньше.

Соль. Конкретно я пытался поправить сцену на входе в Темную Долину. Там бандита можно лечить, после чего ГГ меняется группировка, а бандит выгоняется из под смарта val_escort и захватывается val_lager_bandits. И идет в этот самый лагерь.

 

Было изменено лечение, с попыткой изменять отношения неписей. Изменения отношений я не вижу. Отношение к ГГ меняется, но бандит находится под дэнжером, и выгоняться из смарта - выгоняется, но не захватывается, а вместо этого начинает охотиться на долговцев.

 

Результаты лечения других неписей в других местах - тоже странны. По логу - отношения неписей к ГГ меняются, а вот между собой - нет.

 

P.S. Общегрупповые правила - похоже, да. Попробую посмотреть.

 

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

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


Ссылка на сообщение
Поделиться на других сайтах
Как правильно удалить предмет из тайника? Нужно ли проводить какие нибудь манипуляции перед alife():release?

 

Если в это время из него ни кто ничего не вытаскивает - в любой момент можно.

 

А вот с удалением неписей из онлайна, включая трупы, пронаблюдал забавный эффект: "- Critical: SMapLocation binded to non-existent object id=xxxxx", причем id - внезапно, патроны, и только они, заспавненные через профиль.

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


Ссылка на сообщение
Поделиться на других сайтах
А "твой забавный эффект" происходит от того, что, например, при убийстве НПС и его удалении, нередко бывает что, покойник стрелял из автомата и этот автомат (принадлежащий ему) продолжает неккоторое время еще стрелять

 

Непись АБСОЛЮТНО спокоен. Если только в анимацию смерти даже в спокойном состоянии не входит "пострелять". Но это, как правило, когда ствол в руках. А здесь - даже и за спиной висит.

 

По патронам - тупо, поиском, поставил лог на все release. Не вижу удаления патронов. 8(

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

 

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


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

медитирую на код:

local module, fname = string.match( func, "(.+)[.](.+)" )
func = _G[module][fname]
if func then func() end

 

Это я чего-то не понимаю, или действительно так надо ?

 

KD87, ну, скобка потерялась при копировании. А вот что не так - не работает. И вообще говоря, если в _G оно не вывернуто как-то хитро, то должно таки [fname][module]. Или как ?

 

 

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

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


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

По-хорошему тут, наверное, даже не string.match() надо бы, наверное. Поскольку ну очень сложно представить на входе нечто отличное от строки "myscript.myfunc"

 

А порядок вызова точно правильный ? По тому что при внимательном рассмотрении простыни обнаружено как _G[fname], так и +G[module][fname]...

 

Все. Кажется, дошло... Где-то крепко попутано имя функции, имя файла, и модуль... Надо по шагам разбирать всю простыню. 8(

 

P.S. а отжигов в исходном вообще в количестве. Ну солянка же... Со всего инета все подряд, напихано как попало.

Один разворот

cs:wnd():SetText(string_format("%02d:%02d", time_h, time_m))

на 40 строк с аццкой логикой и десятком регэкспов чего стоит...

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

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


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

Artos,

Но если уж предполагать, то упомянутое Dennis_Chikin напоминает мне ковыряние с xr_logic.script, где у меня, например это

Да, и здесь - тоже. Только гибрид чей-то правки с оригиналом: если нет модуля/функции - идем смотреть xr_effects, а не xr_conditions.

И вообще много где, кроме как в этом фрагменте. Идея везде она и та же. А исполнение - разное. Как размножается код в модах ? В основном, копипастом. Потом где-то что-то меняется немножко. Конструкции получаются порою странные. И кроме того, что получилось, надо еще понять - а чего вообще хотели-то, когда делали.

 

Кстати, по xr_logic - в приведенном куске нил возвращать вообще безопасно ? Или лучше на рабочий стол сразу нафиг ?

 

Как раз применительно к штатному xr_logic.script и иже твоя фраза ...

- некорректна. И тот и иной скрипты штатно прописаны в xr_logic.script, только для разных целей

О, как ! Значит все еще чудесатее, чем казалось сначала. Надо будет сравнить с оригиналом полностью и построчно, пожалуй.

 

 

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

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


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

Получил сейчас вылет с интересной диагностикой, и нашел по нему вот это:

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: Ага, спасибо за "|". Но пока оставим как есть, наверное, и будем ругаться/вылетать тупо по обнаружению отсутствия файла/функции. А то там всего можно ожидать... Пару раз на попытках сделать "защиту" уже обжегся - проблему непосредственно в месте обнаружения проходило, зато потом чудеса начинались.

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

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


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

Запутался...

 

Вручаем неписю в руки что-нибудь. Скажем, 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(): с предметами в руках у неписей в этот момент, наверное, ничего делать не стоит ?

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

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


Ссылка на сообщение
Поделиться на других сайтах

Чаще всего - прилетел game_object туда, где ждали что-нибудь другое. Как правило - строку или number.

 

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


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

Вообще, я вопрос про отношения некотоое время назад поднимал.

Установление отошений непись-непись скорее не работает совсем, чем работает хоть как-нибудь. По крайней мере кодом мне не удавалось поймать момент, когда враги оказывались не врагами. И если даже меняется, то "отработать" где-либо (скажем, при вычислении опасности или наличия/отсутствия врагов) - не успевает.

Можно задать goodwill неписю, или группировке. Причем, к актору - работает в любое время, а вот с прочими неписями опять таки проблемы ( вообще - логично, поскольку хранить неграниченного размера список неписей - это ой).

 

Artos, вообще, в нескольких местах имеет место быть код, подозрительный на переполнение репутации. Все собираюсь посмотреть, но все не до этого.

Upd: да, это вопрос. В смысле, ни у кого аналогичного ощущения не возникало ?

 

Хек, правку по известному сюжету ТД для известного мода выложу на днях - как только разберусь с кривым отображением видимости актора для врагов. Там будут нейтральные после лечения отдельные враги, и отдельно изменение отношений группировок за "заслуги". А группировка неписям меняется только неименным, или на короткое время, чтобы избежать разборок между вылеченным и участниками сцены из враждебной ему группировки.

То есть, работает так: отношение непися к актору дается таким, чтобы в сумме с отношением группировки получилось чуть больше 0, непись загоняется в группировку, нейтральную всем (чтобы не убили эти самые все, и чтобы непись успел уйти под нужный смарт, а не срывался в бой), потом по таймеру возвращается обратно.

Отношение группировок меняется независимо (вычисляем разницу между текущим и нужным, сохраняем, прибавляем. Потом при надобности, вычитаем).

В общем, все красиво, за исключением, что индикатор видимости актора врагами после такого лечения застревает в максимуме, до следующей перезагрузки. Ну, как при исчезновении собакофантомов.

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

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


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

Что делает вызов amk_particle.amk_particle() ?

Скрипт, ну, предположим, стандартный от amk ?

 

Это amk_particle:__init(params) вызывается ? А что он возвращает ?

 

Artos, ага, спасибо. Парочку тривиальных вида nil:add( что попало ) уже вижу.

Ну и, как я понимаю, конструкция вида if p:is_finished() then p:update() применительно к этому "классу" - это, вроде, тоже не совсем здраво ?

 

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

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


Ссылка на сообщение
Поделиться на других сайтах

Странный такой вопрос возник:

local packet = net_packet() 
sobj:STATE_Write(packet)

- в packet ведь полностью наша копия того, что было в момент получения ? Что хотим, то и делаем ?

 

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


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

Artos, какой код - такие и вопросы.

Я, как обычно, пытаюсь понять сакральный смысл перечитывать именно это 100500 раз подряд, и полностью разбирать содержимое ради одного значения (18-я запись из 100500 возможных).

 

upd: Ну, как-бы, есть разница немалая - до нужного, или весь. пара-тройка десятков мс, или аж полсекунды тормозов, и так - 20 раз подряд.

 

Если мы не собираемся его перезаписывать - достаточно один раз прочитать, и один раз разобрать ровно до куда надо. Вроде бы. А вот по тем перекрестным ссылкам из пяти простыней, которые вопрос и вызвали, можно было предположить сколь угодно странное. Типа наличия какого-нибудь внутреннего счетчика, который нужен еще чему-нибудь, и если разобрали не за один раз, и не до конца, то случится страшное. ;)

 

Upd2: да не над чем там смеяться. Все занудно. В первом вопросе информации вполне достаточно, в ответе - тоже. По результатам снесу сотню-другую килобайт. А вот что до времени - с чтением с диска и последующим разбором - не сравнить, но тоже не мало. Специально мерил. Именно что до полусекунды получается иногда. В первый раз когда увидел - офигел.

 

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

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


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

Интересный тут вопрос возник...

Есть некий объект, на который мы сохраняем ссылку. Пусть это будет game_object, как в xr_danger.script:

db.storage[self.object:id()].enemy = best_danger:object()

Затем с объектом по какой-то причине происходит destroy. На что указывает сохраненная ссылка ? nil ?

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

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


Ссылка на сообщение
Поделиться на других сайтах
  • Недавно просматривали   1 пользователь

AMK-Team.ru

×
×
  • Создать...