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

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

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

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

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

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

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

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

  local Func = nil
  local module, fname = func:match('(%w+)%.(%w+)')
  if not fname then
    Func = xr_conditions[func]
  elseif module and _G[module] then
    Func = _G[module][fname]
  end
  if not Func then
    abort("...")
    return nil --/>
  end
  ...

что исключает "настоящую потенциальную ошибку", точнее выявляет ее.

Суть же исходного вопроса не в потенциальной ошибке, а ошибке/некорректности патерна ...

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Совершенно верно. И мне непонятно, почему придирание к опечатке пошло и речь о контексте...

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

xStream,

"придирание" кого к чему? Я что-то уже не улавливаю смысл/цель последних наших постов.

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

Дальнейшее, как раз уже мною воспринимается как некая придирка, что мол нечего на это указывать, мол это очепятка, а вот ...

 

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

Если уж так важно полный разбор всего и вся в исходном вопросе, то тогда уж нужно упомянуть и о том, что перед распарсиванием следует проверить и наличие исходной строки (func) и собственно что это тип именно строки, а не нечто иное.

 

 

 

Добавлено через 5 мин.:

TASTAN

Для SHOC и CS (ТЧ/ЧН) имеется функция:

soGulag = xr_gulag.get_npc_gulag(oNPC)

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

 

Для SCoP (ЗП) это get_npc_smart в том же xr_gulag.script

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Для разговора с физическим объектом как я понял нужен невидимка. Можете мне скинуть его!

 

Уже давалась рекомендация не глаголить погадалки.

Потрудись задавать вопросы связанно и информативно, а не некими туманными фразами.

--/Artos

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

Создаю глобальный мод с новыми локациямЭ

Ссылка на комментарий

TASTAN

Расскажи поподробнее, что ты имеешь ввиду "в диалоге проверить"??? Суть задумки в чем?

 

Жизнь следует измерять поступками, а не временем...

Ссылка на комментарий

Artos, А оно выдаст мне название смарта или что-то еще?

 

function precond_guide_npc(npc, actor)
          local smart = xr_gulag.get_npc_gulag(npc)
                if (smart ~= "mar_csky_base") and (level.name() == "marsh") then
                    return true
                else
                    return false
           end
     end

 

Изменено пользователем ColR_iT
Ссылка на комментарий

Artos,

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

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

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

 

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

 

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

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

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

 

 

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

TASTAN, функция тебе возвращает объект гулага/смарта, а не его имя. Соттветствено если требуется проверка по имени то и используй доступное :name():

if smart and (smart:name() ~= "mar_csky_base") and (level.name() == "marsh") then

 

Добавлено через 9 мин.:

Dennis_Chikin, что и когда лучше - у каждого модмейкера свое.

Кто-то замазывает ошибки, кто-то наоборот вытаскивает их наружу, дабы увидеть и пофиксить.

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

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

Dennis_Chikin: ... если нет модуля/функции - идем смотреть xr_effects, а не xr_conditions
- некорректна. И тот и иной скрипты штатно прописаны в xr_logic.script, только для разных целей, а вот возможность указать в логике не только эти два скрипта (дефолтно), а назначить свои сторонние обработчики - как раз и дает смысл таким кускам кодов.

 

Ну и по "кстати", возврат нила (nil) как раз штатно и предусмотрен в xr_logic.pick_section_from_condlist при отсутствии невыполнении условий (секции для переключения). А безопасность определяется тем, как обрабатывают возвращаемый результат вызывающие функции ...

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Читайте тут и далее

http://www.amk-team.ru/forum/index.php?sho...420#entry561168

Там говорится про невидимку

Создаю глобальный мод с новыми локациямЭ

Ссылка на комментарий

strelok200, давай называть вещи своими именами/терминами, а не теми, которые захотелось употребить (часто не понимая их сути).

Вести диалог со "стенкой" - полнейшая чушь.

Если захотелось сделать нечто типа ветвления сюжета в зависимости от некоторых текущах параметров (аля-"Исполнитель Желания"), то и не нужно такой "псевдо-диалог" так упорно отождествлять со стандартными диалогами.

Тебе уже дали ответ, что по какому-либо событию (хотя бы вхождению в рестриктор) создавай свое окно и делай то, что хочется в нем.

Никто, например, не называет меню выбора часов сна - диалогом со спальником/матрацем, так зачем же с любым иным физ.объектом упорно задавать вопрос как про диалог?

Как понимаю, тебе вероятно уже немного знакомо как писать диалоги с неписями, а вот пока по работе с классами окон и написанию своего меню у тебя пробел, вот и цепляешься за призрачного "невидимку", думая это более легкий путь.

Ну подожди ... может кто и скинет тебе этакого собеседника "невидимку". ;-)

Хотя сам бы мог провести аналогию с диалогом с "О-сознанем", где хотя собеседник и "видимка", но визуально - якобы голограмма. Ну так и попробуй сделать по аналогии, только вместо отображения голограммы, показывай свой физобъект, скрывая самого собеседника.

Вот только думаю для тебя это не проще, чем научиться работе с классами окон и просто написать нужное меню.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Добрый вечер!

Возник вопрос относительно скрипта logic переключение схем!

В файле xr_conditions есть 2 функции:

 

-- проверка того что дистанция до обьекта <= заданной
-- параметры: [sid,dist]
function distance_to_obj_le(actor, npc, p)
    local npc1 = level_object_by_sid(p[1])
    if npc1 then
        local res = npc:position():distance_to_sqr(npc1:position()) <= p[2]*p[2]
        --printf("xr_cond<distance_to_obj_le>: %s", if_then_else(res, "TRUE", "FALSE"))
        return res
    end
    return false
end

-- проверка того что дистанция до обьекта >= заданной
-- параметры: [sid,dist]
function distance_to_obj_ge(actor, npc, p)
    local npc1 = level_object_by_sid(p[1])
    if npc1 then
        local res = npc:position():distance_to_sqr(npc1:position()) >= p[2]*p[2]
        --printf("xr_cond<distance_to_obj_ge>: %s", if_then_else(res, "TRUE", "FALSE"))
        return res
    end
    return false
end

 

Возможно ли использовать при переключении схем в логике НПС данные функции???

Пример:

[smart_terrains]
none = true


[logic]
active=walker
danger = danger_ignore

[walker]
path_walk = yan_stalker_walk_8
path_look = yan_stalker_look_8
on_actor_dist_le_nvis = 10 | walker1;--переключение по сигналу проверки нахождения ГГ на определенном расстоянии...

[walker1]
path_walk = yan_stalker_walk_88
path_look = yan_stalker_look_88
????? = 10 | walker2;--переключение при приближении НПС с определенным sidом к другому НПС с этой схемой...
.....
[danger_ignore]
ignore_distance = 0

Просьба использовать тэги [соde] при публикации кодов в сообщении,

дабы и форматирование сохранить и избежать искажений спец.символов парсингом форума. --/Artos

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

Жизнь следует измерять поступками, а не временем...

Ссылка на комментарий

losiara, естественно эти функции можно использовать для переключений между секциями логики, тем более это собственно 'штатные' функции проверок, которыми и оперирует дефолтно xr_logic.script.

Однако:

1. Следует различать в парах:

on_actor_dist_le_nvis и on_actor_dist_le - ближе чем ...

on_actor_dist_ge_nvis и on_actor_dist_ge - дальше чем ...

- которые (в парах) различаются тем, что первое условие (с nvis) срабатывает в любой ситуации когда объект на определенном расстоянии (т.е. без проверки на видимость), а вторая - только когда объект 'видим' актором (в поле его зрения).

Второе условие применимо не ко всем объектам, т.к. метод obj1:see(obj2) работает только для неписей/монстров и еще некоторых (не помню точно каких) классов объектов.

2. Штатных логических условий (функций) для проверки расстояний между различными неписями (а не актором) в кодах xr_logic.script нет, хотя ничего не мешает их или какие потребны добавить.

Но ... твоя формулировка:

переключение при приближении НПС с определенным sidом к другому НПС с этой схемой...
- очень ресурсо-затратна при попытке решить 'в лоб', т.к. чтобы при проверке секции одного текущего НПС знать всех остальных, работающих под этой схемой - нужно еще постараться это сделать ... или итерируя по спискам типа db.storage или по заранее подготовленным. Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

demover123, Все там стоит ! Я раз 10 переделывал и проверял и результат такой же . Потом думал может у меня координаты не правильно снимает прога, и посмотрел какие координаты стоят в чн . А там вообще вот что :

 

[mar_smart_terrain_10_5_kamp_1]

points = p0

p0:name = name00

p0:position = 401.542633056641,3.7787299156189,265.570220947266

p0:game_vertex_id = 54232 ; такого вертекста вообще нет в игре

p0:level_vertex_id = -1

 

Ссылка на комментарий

0023:08074F22 xrGame.dll

0023:08190865 xrGame.dll

0023:00413865 xrEngine.EXE, CCameraManager::operator()

 

Кто нибудь может что то сказать по этому логу? ЧН, 10 патч.

В моде есть схема, заставляющая сталкеров бежать в укрытия. Она работала хорошо на болотах (где я её и тестировал, и на других местах) но вот почему то на Кордоне (и боюсь это может быть не единичный случаи) в районе моста такой вылет в момент включения схемы. Я подозреваю что моя схема конфликтует как то со схемами смарт-кавера (видимо где то в этот момент идёт бой как раз, и когда включается схема с её ограничениями - что то идёт не так)

 

Я щас ещё буду тесты проводить, но может кто уже сталкивался с этим.

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

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

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
Ссылка на комментарий

Dennis_Chikin, не знаю, разобрались ли "тогда", но собственно и проблема то не сложная.

Заготовка для решение (касательно xr_conditions) как раз и была тут упомятута и показана в #3527. Для xr_effects полностью аналогично, только имя в коде иное.

 

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

Мною был выбран именно этот, дабы не искушаться различными извратами в именах модулей/функций при сторонних вызовах (не из штатных скриптов для логики), о чем и указал:

Это допускает наличие в имени модуля/функции только алфавитно-цифровых символов, исключая иные символы, и экранирует точку, давая однозначное разделение на модуль-функция.
Если же хочется расширить ассортимент для имен - просто подбирается соответствующий патерн.

В том исходном виде (тобою упомянутом: "(.+)[.](.+)") патерн никак не защищает от ошибок/описок при употреблении специальных символов иль пробелов, а ловить такие ошибки из логики не так уж порою и легко ...

Если хочешь и нижнее подчеркивание (это не алфавитно-цифровой символ!) использовать в именах, то патерн для этого может быть таким:

'([%w|_]+)%.([%w|_]+)' - в именах модулей/функций разрешены в любых комбинациях (от 1-го и более) алфавитно-цифровые символы и символ '_'

 

Примечание: К сожалению многие не догадываются, что бездумное использование логики и "универсальных" кодов для нее - чревато ... Ведь для каждого онлайнового (и не только, вспомним смарты/респавны) текущие секции логики постоянно сканируются апдейтами объектов и многочисленными схемами и каждая такая проверка (хотя бы и по излишне свободным патернам) забирает процессорные такты. Так что в этом как раз нужно знать меру и не транжирить даже коротенькие строки в конфигах логики понапрасну.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Имею такой скрипт:

 

function precond_guide_npc(actor, npc)
          local smart = xr_gulag.get_npc_gulag(npc)
                if smart and (smart:name() ~= "mar_csky_base") and (level.name() == "marsh") then
                    return true
                else
                    return false
           end
     end

 

 

При его использовании получаю вылет:

FATAL ERROR

 

[error]Expression : fatal error

[error]Function : CScriptEngine::lua_error

[error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp

[error]Line : 73

[error]Description : <no expression>

[error]Arguments : LUA error: ...game\s.t.a.l.k.e.r\gamedata\scripts\quest_script.script:22: attempt to call method 'name' (a string value)

 

 

stack trace:

 

 

Вылет указывает на строку:

if smart and (smart:name() ~= "mar_csky_base") and (level.name() == "marsh") then

Но что тут нетак я немогу понять... Помогите кто знает!

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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