Скриптование - Страница 176 - Скрипты / конфиги / движок - AMK Team
Перейти к контенту

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

 

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

 

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

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/

Поэтому и указал, что именно в таком (+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

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 патч.

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

 

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

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

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

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

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

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

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

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

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

Войти

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

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

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