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

Внимание. На форуме проводятся технические работы с боковым меню.

_Val_ _Val_

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

Тема для обсуждения скриптов всего и всех в серии игр 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/

Виталкер,

level.spawn в игре не работает. Используется в СДК.

А дерется машина из-за того, что погружена немного в землю или в другое препятствие. Когда ты ее касаешься для машины активируется просчет физики и она выпрыгивает из земли, попутно убивая ГГ. При стрельбе просчет физики активируется издалека :) Надо просто чуток скорректировать координаты спавна машины

Я не шибко ковырял ТЧ, но... вот небольшой пример:

 

[remark]
wounded = wounded

[wounded]
hp_state = 35|wounded_heavy@help_heavy
hp_state_see = 35|wounded_heavy@esc_tolik_help
hp_victim = 35|nil
hp_cover = 35|false
hp_fight = 35|false
help_dialog = tutorial_wounded_give_medkit

P.S. Если не понятно, попробуй изучить логику Толика.

⠀

Виталкер

Выше abramcumner уже дал основную информацию для ответа.

Немного дополню упущенное.

Вычислить (без SDK) достаточно точно требуемые координаты для спавна объектов довольно сложно, тем более еще и параметр(ы) 'направление/direction' важны.

Чтобы заспавненная машина стояла как 'вкопанная', в секции спавна объекта (в all.spawn) можно применить 'стопор' типа: '[collide] ignore_static' и/или 'привязку кости' - 'fixed_bones = root'. Конкретные примеры см. в исходных кодах игры, их немало

Однако так машина будет всегда 'вкопаной' и покататься на ней не удасться.

 

Если требуется спавн машины для 'покататься', то самым разумным решеним (которое давно используется в модах и в том же АМК) - заспавнить машину чуть выше требуемой точки и дать ей скриптом после старта игры небольшой импульс (хитом и/или apply_force). Так она опустится на землю и встанет на колеса и не будет 'драться'. Но и 'вкопанной' она не будет - при касаниях может и укатиться ... :-)

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

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

Artos, Раскажи по больше, о том как дать небольшой импульс, нпсу я могу дать, а вот придмету незнаю, как?
ВИТ@/\|{ЕР

Виталкер

В моде АМК в 'bind_physic_object.script' имется функционал для отслеживания 'жизни' БТРов.

Ипользуя уже имеющееся (или заново) следует в 'generic_physics_binder:net_spawn(data)' определить, что объект именно машина, и дать 'пинок', например так:

  if self.object:clsid() == clsid.car_s then
    --/ Опускаем технику на землю (on_the_ground):
    local ph_shell = self.object:get_physics_shell() --/ получаем управление над физикой
    if ph_shell then
      ph_shell:apply_force(0,-1,0) --/ прикладываем небольшую силу (вниз)
    end
    local h = hit()
    h.draftsman = self.object
    h.direction = vector():set(0,-1,0) --/ направление 'вниз'
    h.power     = 0.001
    h.impulse   = 1
    h.type      = hit.strike
    self.object:hit(h) --/ наносим небольшой импульс
  end

 

Для 'нпсов' подобное не применимо, точнее ... по аналогии в соотв. биндере можно также дать хит, но физической оболочки (ph_shell) в отличии от тех же машин у гуманоидов и монстров нет. Т.е. придется обходиться только хитом. Но и это не требуется - неписи сами начитают двигаться (как только окажутся в онлайне) и сами 'опускаются' на землю. :-)

 

Примечание: Для того чтобы машины были забиндены (обрабатывались биндером) требуется у них наличие логики ... или 'ручками' добавить класс машин в биндер (по аналогии с прожекторами).

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

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

Artos, немного можно уменьшить код. Будет достаточно такой функции:

if self.object:clsid()==clsid.car_s then
        local h = hit()
        h.draftsman = db.actor
        h.type = hit.strike
        h.direction = vector():set(0,0,0)
        h.power = 0.0001
        h.impulse = 0.0001
        self.object:hit(h)
    end

 

Давно пользуюсь, проблем не было :)

Telegram-канал RayTwitty Space

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

 

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

Jurok, Написал всё равно не работает....:(

Изменено пользователем Виталкер
ВИТ@/\|{ЕР
Виталкер, возможно ты и прописал логику как у Лиса, но ты не прописал параметры как у Лиса, а именно здоровье. В секции спавна твоего НПС пропиши ему здоровье ниже порогового значения в логике, например, как у Лиса:
health = 0.280000001192093

Shadows

Как правило даю несколько избыточные варианты. Модмейкер сам может решить что применять, а что нет. Выбросить всегда легче, чем добавить (особенно когда нет кода). :-)

И, ИМХО, лучше иметь более полную шпаргалку под рукою, чем ее усеченный вариант. Понадобилось - известно откуда скопипастить. :-)

 

Но могу чуток покритиковать твой вариант. :grin2:

Применение 'толчка' для физических предметов и более действенно и менее ресурсоемко (ну да это копейки) и строк поменьше.

Нанесение хита - все же задействует и саму схему хита с ее колбэками и пр. Если в логике объекта имеется 'обидчивость' (on_hit), то нередко она апприори приписывается актору (хотя и ущерб равен/близок к нулю). Что, кстати, и сделано у тебя намерено (h.draftsman = db.actor <???).

Так что то, что не имеешь проблем - это пока не будешь использовать логику. Ведь не только машинки для покататься спавнятся, но и 'враждебные' БТРы ...

Т.о. если сокращать код, то я бы сокрашал не толчок, а хит.

Но для машин - вполне применимы и полностью приведенные коды.

Тем более начальные пинки даются только при старте игры и оптимизация тут ... призрачна.

 

Примечание: Хитовать то почти все научились, а вот пинать - к сожалению не многие. :crazy:

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

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

А я хотел при спавне присваивать каждому объекту ID и рестрикторе вызывать инфопоршень и удалять каждого нпс отдельно функцией по его иду. Но этот вариант мне кажется более совершенный и меньше будет грузить игру.

А дальше в момент телепортации просто делай перебор по iD\ или по db.storage и ищи через string.finde() те секции персонажей, у которых есть в названии _portal_npc и удаляй их :(

Только я недавно этим занялся и пока работаю только с мануалом а такую функцию конечно пока не напишу. Может кто приведет примерчик этой функции с перебором массива и удалением по имени. Буду очень признателен и добавлю себе в мануал.

for i=1,65535 do
    local obj = alife():object(i)
    if obj then
        if string.find(obj:name(),"_portal_npc") then
            alife():release(se_obj, true)
        end
    end
end

Изменено пользователем _Призрак_

Freedom

Stalkersof,

Кстати, а ты проверил - в твоих неисследованных областях аи-сетка то есть? :) А то НПЦ там не задержатся и убегут туда где аи-сетка есть

Если непись не на АИ сетке сразу, то будет вылет, и никуда он не убежит - не успеет. Так что если там АИ сетки нету придется лезть в СДК и делать ее там, потом Make AI-map и xr-компиляторы (кроме детальных объектов, вроде не надо).

 

Не с целью вставить пять копеек, а с целью довести информацию...

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

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

ТЧ 1.0004. SAP и Trans mod

github

Всем здрасте, у меня возникла проблема при спауне НПС, Нет я его прописал нормально через all.spawn, но я хочю чтоб он сидел и например ел колбасу! :D но какую логику ему надо прописывать?

 

Вот здесь собрана достаточно подробная информация о логиге НПС и не только, почитай. >>Clik Me<< ColR_iT

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

Как спаунить костры?(=

Можно написать логико в аллспавне, а можно в кастом дате... Есть разница?

 

Ты наверно имел ввиду в all.spawn и отдельном файле!? Если да, то конечно есть! Если логика в all.spawn, то чтобы ее подправить, нужно будет перекомпелировать его (all.spawn), а в отдельном файле, у тебя и логика на виду и подправить всегда можно, только не затрагивая путей, их в отдельный файл не перенести. ColR_iT

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

Да конечно не проверял есть там сетка или нет. Я даже и незнаю как посмотреть. Буду методом тыка смотреть. Если где нпс будут себя вести неподобающе. То можно придумать на тех этапах забег на время и наспавнить там предметов разных чтоб дорогу загородить или можно спрятатать телепорт пусть ищут. И еще хотел его заставить пройтись по балке крана и упасть в телепорт. Предметы проверил предметы спавнятца там без вылетов.

 

_Призрак_ спасибо.

 

Чтобы просмотреть присутствие АИ сетки есть программка, называется GraphViewre, вот она: >>Click Me<< ColR_iT

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

Люди, у меня такой вопрос, за что отвечают такие строки в скриптах?

for k, v in pairs(pstor) do

for n, c in pairs(l) do

for inum, infop in pairs(cond.infop_set) do

for inum, infop in pairs(cond.infop_check) do

Если можно, по детальнее, заранее спасибо.

Desertir

С нпс вылета точно не будет, он просто пойдёт к ближаишей точке с АИ.

Stalkersof

Если спавнишь неписей за картой, то почти наверняка там нету АИ сетки, тогда НПС просто сквозь стены по воздуху спустятся туда, где она есть. А чтобы добавить новую сетку, нужно брать СДК, там разбирать уровень, добавлять туда свою сетку и собирать. В принципе вполне выполнимо, но для новичка будет сложно.

 

Ulman

Это "перебор", запускает цикл по кол-ву элементов в таблице. И на каждом цикле присваивает inum и infop какие то значения из таблицы.

Например:

tbl = {

1 = "ops",

2 = "ba",

3 = "gi",

}

 

for k, v in pairs(tbl) do

<будет вызывать этот код 3 раза, по кол-ву элементов в таблице>

<и при каждом вызове k будет равен 1,2,3,а V соответственно ops, ba, gi (по очереди, сперва k=1, v="ops" потом k=2, v="ba")>

end

 

http://www.lua.ru/doc/5.1.html

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

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

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

Artos,

Что, кстати, и сделано у тебя намерено (h.draftsman = db.actor <???).

Так что то, что не имеешь проблем - это пока не будешь использовать логику. Ведь не только машинки для покататься спавнятся, но и 'враждебные' БТРы ...

У меня в моде логика кстати используется (ну те же ключи). Плюс еще много-много чего.

На счет БТРов... Я привел код для чистой игры, если нужно чтобы каким-то тачкам хит не наносился, можно фильтровать по секции: self.object:section()~="секция". Ну понятно, это в условие пихаем.

Telegram-канал RayTwitty Space

Shadows

Перепрочти мой ответ и пойми суть:

1. Нет никакой причины давать хит заспавненной машине от имени актора, делая его 'обидчиком'.

'h.draftsman = self.object' - и логичнее и в последующем при любых раскладах не будет иметь последствий.

2. Тут разговаривают не только о твоем моде иль о чистой игре. Даже более - мы на АМК форуме и немало тех, кто именно его использует в качестве отправной точки. Т.о. есть ли смысл упираться в заведомо в 'твой локальный' случай?

3. Уже дал пояснение, что задавшись целью сократить строки кода - оптимальнее оставить 'пинок', а не хитовать. Это и для чистой игры оптимальнее.

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

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

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

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

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

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

Войти

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

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

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