Скриптование - Страница 155 - Скрипты / конфиги / движок - 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/

лог

[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: d:\games\С.Т.А.Л.К.Е.Р\gamedata\scripts\bind_stalker.script:235: attempt to index global 'inventory' (a nil value)

 

inventory - это скрипт

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

Говори, что и где правил в бинд_сталкер и выкладывай все новые скрипты, под спойлер конечно.

Вылет (если я прав) указывает на то, что в скрипте inventory есть синтаксическая ошибка.

ТЧ 1.0004. SAP и Trans mod

github

Вылет (если я прав) указывает на то, что в скрипте inventory есть синтаксическая ошибка.
Это я понял, но вот где она. В бинд-сталкер просто поставил апдейт этой функции

 

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

Все, проблема решена, спасибо

Darkscape, а зачем у тебя проверки разных предметов через elseif идут? Этак получается, колбаса начнет становиться радиоактивной только тогда, когда нерадиоактивный хлеб в инвентаре закончится. А если его много? понадобится немало апдейтов чтобы до колбасы дошла очередь...

Кстати еще один минус такой реализации - за один апдейт из обычного в радиоактивный превратится не более одного предмета...

 

Способ получше - сделать у себя в скрипте список секций продуктов, которые надо проверять, и если радиация поднялась выше 0,3, а перед тем была ниже - перебором предметов в инвентаре сразу обнаруживаем все подходящие предметы (продукты). заносим найденные итемы в таблицу. И при следующем апдейте заменяем их все разом, секцию нового предмета определяя по принципу секция_старогo..rad.

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

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Zander_driver, спасибо за совет, переписал скрипт, получилось:

local items1 = {"bread", "kolbasa", "chocolate"}

function rad_food()
   if db.actor.radiation>0.3 then
      for i=1,table.getn(items1) do
         db.actor:iterate_inventory(function (dummy,item)  
            if item:section()==items1[i] then
               dsm.del_item(item)  
               dsm.spawn_item(tostring(items1[i].."_rad"))
            end
            end, nil)
      end
    end
end

Все работает, вроде правильно написал

 

1. Используем спойлеры ...

2. Перед написанием вопросов проверяем коды чекерами (см. в топике по инструментарию)

--/ Artos

Изменено пользователем Artos
Кивач: Кто знает где прописан спавн ПДА для НПСов?

Прописан в движке.

Каждому(!) спавнящемуся НПС после прописанных ему предметов в конфигах (если таковые есть), движек обязательно доспавнивает "именной" КПК. Т.о., сколько в Зоне людей - столько и КПК у них на руках.

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

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

Ребят подскажите пожалуйста как определить отношение одной группировки к другой ?

В Lua_help нашел функцию.

 

function community_relation(string, string);

 

Предполагаю, что нужно взять id группировок и сравнить.

 

community_relation(id1,id2)

 

Если это то, что я хочу, то какие варианты может вернуть эта функция?

good, friend, enemy и т.д...

 

Как вызвать эту функцию? Она глобальная? Или нет?

 

Сам понимаю, что могу сам проверить, но решил спросить у знающих людей...

Что-то кончается, что-то начинается...

Vano_Santuri

Удивляют подобные вопрошалки-переспрошалки ...

1. Спрашивающий не удосуживается уточнить интересующую его версию игры. Гадать о том, что он "нашел" нужную ему функцию в 'lua_help' именно от ему нужной игры (т.е. ЧН/ЗП)?

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

:-(

 

Функция естественно глобальная и принадлежит пространству 'relation_registry'.

В качестве аргументов должны быть именно строковые значения группировок (community), а не некие id, под которыми которыми чаще понимают/обозначают численные значения.

Возвращаемым результатом является численное значение отношений заданных группировок.

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

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

Vano_Santuri, relation_registry.community_relation(faction, faction_to)

Может возвращать friends и enemies

Пример из игры:

if(relation_registry.community_relation(squad:get_squad_community(), alife():actor():community())>=FRIENDS) then

goodwill = "friend"

 

Поправьте если что

ХОВАН

Ну для чего вводить в заблуждение?

Сам же цитируешь стоку кода от разработчиков:

if(relation_registry.community_relation(squad:get_squad_community(), alife():actor():community())>=FRIENDS) then

Из коей ясно, что сравниваются ЧИСЛЕННЫЕ значения (>=) результата работы функции и константы (ранее заданной как FRIENDS = 1000).

О каких тут возвратах friends иль enemies можно толковать??? Результатом возврата (повторюсь) является численное значение (как минимум в диапазоне: -1000 ... 1000)

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

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

О форматировании строк вопрос. В примере по добавлению часов на худ, пробую к строке времени добавить еще строку:

...............
...............
local str = "вторая строка"
local msg = string.format(" %02d:%02d\n%s", time_h, time_m, str)

if cs ~= nil then
    cs:wnd():SetText(msg)
end

результат получается "07:10вторая строка". Что я не так делаю ?

AndreySol, в конфигах в ui необходимо в секции часов поставить мультистроку

Vita sine libertate, nihil

Vita sine litteris - mors est

http://stalkerin.gameru.net/modules.php?na...tit&lid=290

 

Скачай это, умеет проверять скрипты на синтаксические ошибки. :)

 

Потом, ты сделал чутка не правильно цикл. Сейчас у тебя для КАЖДОГО предмета перебирается ВЕСЬ инвентарь когда достаточно РАЗ перебрать весь инвентарь и сравнивать секцию предмета с той, что в таблице. Плюс такая схема довольно прилично будет нагружать игру. За 1 секунду в среднем выполняется около 4 апдейтов (при норм. ФПС) и терь представь что раз в секунду у тебя столько переборов инвенторя будет :) Игра просто начнёт тормозить, но ты заметишь это тока тогда, когда у тебя будет куча подобного кода ...

 

В итоге лучше будет сделать так:

 

local items1 = {
        bread       = true,
        kolbasa    = true,
        chocolate  = true,
}
local rad_food_interval = 0

function rad_food()
   if db.actor.radiation>0.3 then
    if rad_food_interval < time_global() then
   -------------------------------------
         db.actor:iterate_inventory(function (dummy,item)  
            if items1[item:section()] then
               dsm.del_item(item)  
               dsm.spawn_item(tostring(item:section().."_rad"))
            end
          end, nil)
    -------------------------------------
     rad_food_interval = time_global() + 1000 --\\ заставим нашу функцию выполнятся РАЗ в секунду 
     end
    end
end

 

В итоге основная часть этой функции будет вызывать только раз в секунду при условии что игрок заражён радиацией.

И предметы в инвенторе будут перебираться лишь 1 раз за вызов а не для каждого предмета. :)

 

 

 

> Каждому(!) спавнящемуся НПС после прописанных ему предметов в конфигах (если таковые есть), движек обязательно доспавнивает "именной" КПК. Т.о., сколько в Зоне людей - столько и КПК у них на руках.

 

Правда? Я думал этот рудимент вырезали с билдов, и у них просто обычный PDA спавнится. Тоесть если я напишу npc:object("deivce_pda"), то я в большинстве случаев получу его именной ПДА? (Кстати, а существует ли возможность скриптом изменить имя и описание объекта, как с этими именными ПДА ...)

 

Vano_Santuri

-- Узнаём отношение группировки к другой группировке
function get_faction_relation(f1, f2)
if game_relations.is_factions_friends(f1, f2) then return "friend" end
if game_relations.is_factions_enemies(f1, f2) then return "enemy" end
return "neutral"
end

 

Должно работать, правда на ЗП не проверял.

 

AndreySol

В UI-конфиге объекта CS поставь complex_mode = "1" (кажется так) а в скрипте попробуй cs:wnd():SetText(msg) заменить на cs:wnd():SetTextST(msg)

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

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

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

Может я тоже ошибаюсь, но по моему у тебя тоже есть ошибка:

item:section() возвращает строку следовательно таблица должна быть такая:

local items1 = {
        ["bread"]       = true,
        ["kolbasa"]    = true,
        ["chocolate"]  = true,
}

Если я конечно же тоже не ошибаюсь

 

Прошу помощи. Есть ли такая анимация, которая существовала у всех НПС и Мутантов? Дело в том что я спавню скриптом физический объект и присваиваю ему визуал сталкера или мутанта. Но иногда игра вылетает с логом:

[error]Expression : motion_ID.valid()

[error]Function : CKinematicsAnimated::ID_Cycle

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

[error]Line : 136

[error]Description : ! MODEL: can't find cycle:

[error]Arguments : $editor

 

 

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

t.skeleton_name="idle"

Но некоторые визуалы (например визуал излома или химеры) все равно вылетают. Что нужно написать в t.skeleton_name чтобы не вылетало?

Freedom

_Призрак_, открой в hex редакторе файл модели, в конце прописаны доступные анимации. У сталкеров прописаны все анимации из stalker_animation.omf, а у монстров анимации по отдельности. У той же химеры, например, анимации "idle" нет. Возможно, поэтому у тебя вылет. Изменено пользователем KD87

*Shoker*,

SetTextST

отличается только тем, что транслирует строку. Тоесть если подать идентификатор, то выдаст нормальную текстовую строку, а не сам идентификатор. Аналогично

SetText(game.translate_string(msg))

Vita sine libertate, nihil

Vita sine litteris - mors est

_Призрак_

Не беспокойся, игра и такую таблицу переваривает, проверенно :)

 

RvP

Спс. Буду знать :)

 

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

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

В UI-конфиге объекта CS поставь complex_mode = "1" (кажется так)

Не помогло. Может еще что ?

AndreySol, тогда добавь ещё один "слешь":

local msg = string.format(" %02d:%02d\n%s", time_h, time_m, str)

local msg = string.format(" %02d:%02d\\n%s", time_h, time_m, str)

всё легко

По ТЧ:

1. Как скриптово сделать монстра и непися друзьями?

2. Можно ли реализовать в ТЧ сценку из ЗП, где военный стреляет по сторонам, атакованный контролером?

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

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

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

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

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

Войти

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

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

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