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

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

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

Здравствуйте, заметил что в повелителе зоны во вкладке "локации" прописаны все смарты сталкеров и их описания написаны как сталкеры в диалоге пишут, захотел сделать так что бы в списке локации были только сами локации: скадовск, янов, внз круг и тд...

нашёл функцию которая за это отвечает

Скрытый текст

-- Локации
if n=="2" then
mode = "level"

local tbl
local name
tbl = god_tbl.god_smart_table

if db.actor~=nil then
for i=1, 65535 do
    local obj = alife():object(i)
          if obj~=nil then
          if obj:section_name()=="smart_terrain" then
             local s_name = game.translate_string("st_stalker_"..obj:name())

             if s_table[s_name]~=nil then s_name = s_table[s_name] end

           self:AddItemToList(s_name, i)
            end
          end
end
end

end

 

путём логических размышлений я понял что эта функция берёт все секции смартов из алайфов и переводит он их соответственно 

изменил строчку перевода 

Скрытый текст

 local s_name = game.translate_string("st_"..obj:name().."_name")

теперь переводит нормально основные места, но в списке есть и другие места которые попросту не переводятся, а ещё заметил что есть таблица с этими основными местами, но как я понял она не используется(точнее их две)

Скрытый текст

god_smart_table = {
["zat_b100"]  =  "st_zat_b100_name",
["zat_b104"]  =  "st_zat_b104_name",
["zat_b38"]  =   "st_zat_b38_name",
["zat_b40"]  =   "st_zat_b40_name",
["zat_b56"]  =   "st_zat_b56_name",
["zat_b5"]  =    "st_zat_b5_name",
["zat_a2"]  =    "st_zat_a2_name",
["zat_b20"]  =   "st_zat_b20_name",
["zat_b53"]  =   "st_zat_b53_name",
["zat_b101"]  =  "st_zat_b101_name",
["zat_b106"]  =  "st_zat_b106_name",
["zat_b7"]  =    "st_zat_b7_name",
["zat_b14"]  =   "st_zat_b14_name",
["zat_b52"]  =   "st_zat_b52_name",
["zat_b39"]  =   "st_zat_b39_name",
["zat_b33"]  =   "st_zat_b33_name",
["zat_b18"]  =   "st_zat_b18_name",
["zat_b54"]  =   "st_zat_b54_name",
["zat_b12"]  =   "st_zat_b12_name",
["zat_b28"]  =   "st_zat_b28_name",
["zat_b103"]  =  "st_zat_b103_name",
["jup_b1"]  =    "st_jup_b1_name",
["jup_b46"]  =   "st_jup_b46_name",
["jup_b202"]  =  "st_jup_b202_name",
["jup_b211"]  =  "st_jup_b211_name",
["jup_b200"]  =  "st_jup_b200_name",
["jup_b19"]  =   "st_jup_b19_name",
["jup_a6"]  =    "st_jup_a6_name",
["jup_b25"]  =   "st_jup_b25_name",
["jup_b6"]  =    "st_jup_b6_name",
["jup_b205"]  =  "st_jup_b205_name",
["jup_b206"]  =  "st_jup_b206_name",
["jup_b32"]  =   "st_jup_b32_name",
["jup_a10"]  =   "st_jup_a10_name",
["jup_b209"]  =  "st_jup_b209_name",
["jup_b208"]  =  "st_jup_b208_name",
["jup_a12"]  =   "st_jup_a12_name",
["jup_b212"]  =  "st_jup_b212_name",
["jup_b9"]  =    "st_jup_b9_name",
["jup_b201"]  =  "st_jup_b201_name",
["jup_a9"]  =    "st_jup_a9_name",
["pri_a28"]  =   "st_pri_a28_name",
["pri_b36"]  =   "st_pri_b36_name",
["pri_b303"]  =  "st_pri_b303_name",
["pri_b301"]  =  "st_pri_b301_name",
["pri_a17"]  =   "st_pri_a17_name",
["pri_b306"]  =  "st_pri_b306_name",
["pri_a16"]  =   "st_pri_a16_name",
["pri_a25"]  =   "st_pri_a25_name",
["pri_b35"]  =   "st_pri_b35_name",
["pri_a21"]  =   "st_pri_a21_name",
["pri_b304"]  =  "st_pri_b304_name",
["pri_a18"]  =   "st_pri_a18_name"
}

 

Скрытый текст


god_smart_table_full = {
{"zat_b55",   "st_zat_b55_name"},
{"zat_b100",  "st_zat_b100_name"},
{"zat_b104",  "st_zat_b104_name"},
{"zat_b38",   "st_zat_b38_name"},
{"zat_b40",   "st_zat_b40_name"},
{"zat_b56",   "st_zat_b56_name"},
{"zat_b5",    "st_zat_b5_name"},
{"zat_a2",    "st_zat_a2_name"},
{"zat_b20",   "st_zat_b20_name"},
{"zat_b53",   "st_zat_b53_name"},
{"zat_b101",  "st_zat_b101_name"},
{"zat_b106",  "st_zat_b106_name"},
{"zat_b7",    "st_zat_b7_name"},
{"zat_b14",   "st_zat_b14_name"},
{"zat_b52",   "st_zat_b52_name"},
{"zat_b39",   "st_zat_b39_name"},
{"zat_b33",   "st_zat_b33_name"},
{"zat_b18",   "st_zat_b18_name"},
{"zat_b54",   "st_zat_b54_name"},
{"zat_b12",   "st_zat_b12_name"},
{"zat_b28",   "st_zat_b28_name"},
{"zat_b103",  "st_zat_b103_name"},
{"jup_b1",    "st_jup_b1_name"},
{"jup_b46",   "st_jup_b46_name"},
{"jup_b202",  "st_jup_b202_name"},
{"jup_b211",  "st_jup_b211_name"},
{"jup_b200",  "st_jup_b200_name"},
{"jup_b19",   "st_jup_b19_name"},
{"jup_a6",    "st_jup_a6_name"},
{"jup_b25",   "st_jup_b25_name"},
{"jup_b6",    "st_jup_b6_name"},
{"jup_b205",  "st_jup_b205_name"},
{"jup_b206",  "st_jup_b206_name"},
{"jup_b32",   "st_jup_b32_name"},
{"jup_a10",   "st_jup_a10_name"},
{"jup_b209",  "st_jup_b209_name"},
{"jup_b208",  "st_jup_b208_name"},
{"jup_a12",   "st_jup_a12_name"},
{"jup_b212",  "st_jup_b212_name"},
{"jup_b9",    "st_jup_b9_name"},
{"jup_b201",  "st_jup_b201_name"},
{"jup_a9",    "st_jup_a9_name"},
{"pri_a28",   "st_pri_a28_name"},
{"pri_b36",   "st_pri_b36_name"},
{"pri_b303",  "st_pri_b303_name"},
{"pri_b301",  "st_pri_b301_name"},
{"pri_a17",   "st_pri_a17_name"},
{"pri_b306",  "st_pri_b306_name"},
{"pri_a16",   "st_pri_a16_name"},
{"pri_a25",   "st_pri_a25_name"},
{"pri_b35",   "st_pri_b35_name"},
{"pri_a21",   "st_pri_a21_name"},
{"pri_b304",  "st_pri_b304_name"},
{"pri_a18",   "st_pri_a18_name"}
}
 

и вот то в чём вопрос как сделать так чтоб этот скрипт использовал эту таблицу?  что бы не было вот этих лишних мест

https://disk.yandex.ru/i/mK-Tbn7hWt_a2A - скрин

Ссылка на комментарий
18.02.2024 в 00:17, kenguru сказал:

Да, это конечно понятно, однако трабла в том, что АФФТары игры в большинстве случаев не предусмотрели очистку от ненужных использованных инфопоршней

Представляю, сколько сюжетных диалогов по новой появятся! Большинство диалогов на инфопорциях завязано.

 

Рус, неужели у тебя все вылеты на переполнение стека завязаны? Битье сейвов четко говорит о переполнении стоража актора.

Изменено пользователем AndrewMor
  • Нравится 1
  • Согласен 1
Ссылка на комментарий
2 часа назад, AndrewMor сказал:

Битье сейвов четко говорит о переполнении стоража актора.

Используйте script_vars_storage OGSR, и будет вам счастье. Оно не переполняется никогда.

А вообще-то смешались в кучу кони, люди... переполнение стека и переполнение "стоража" (нетпакета?) актора - как бы тоже совершенно разные и никак не связанные вещи...

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

8 часов назад, Pavel_2000 сказал:

как сделать так чтоб этот скрипт использовал эту таблицу?

Использовать переменную tbl в коде.

  • Согласен 1
Ссылка на комментарий
8 минут назад, Zander_driver сказал:

Использовать переменную tbl в коде.

я понимаю, но не понимаю как её использовать куда вставить или как, гуглил про таблицы курил lua но так и не понял

в итоге я сам разобрался) 

нашёл в инете функцию проверки есть ли в массиве определенное значение

Скрытый текст
function check_table(arg, table, mode)
    if mode == 1 then -- Если нужен поиск по ключу
        for k, v in pairs(table) do
            if k == arg then
                return true
            end
        end
    else -- Если нужен поиск по значению
        for k, v in pairs(table) do
            if v == arg then
                return true
            end
        end
    end
    return false
end

ну и сами проверки

Скрытый текст
-- Проверка ключа:
if check_table('First', red, 1) then -- 1 аргумент - Слово для поиска, 2 аргумент - Твоя таблица, 3 аргумент - режим.
    print('Найден ключ!')
end

-- Проверка значения:
if check_table('Hello', blue, 2) then -- 1 аргумент - Слово для поиска, 2 аргумент - Твоя таблица, 3 аргумент - Режим.
    print('Найдено значение!')
end

ну и сделал вот так

Скрытый текст

if obj:section_name()=="smart_terrain" and check_table(obj:name(), tbl, 1) then

и всё получилось. 

https://disk.yandex.ru/i/92E8xUoaHDYU9w - скрин

 

  • Нравится 1
Ссылка на комментарий

Привет всем!

 

12 часов назад, Zander_driver сказал:

переполнение стека и переполнение "стоража" (нетпакета?) актора - как бы тоже совершенно разные и никак не связанные вещи...

Да, это я сдуру их в одну кучу валю. Конечно речь всё время шла о pstor

Звиняйте - мы академиев не кончали :biggrin:

12 часов назад, Zander_driver сказал:

script_vars_storage

вот с этого места можно немного поподробней? А то ни сном, ни духом..:unknw:

Изменено пользователем kenguru
Ссылка на комментарий
2 часа назад, kenguru сказал:

pstor

В OGSR вообще не надо использовать.

2 часа назад, kenguru сказал:

А то ни сном, ни духом

А как же вы мод на движок OGSR пересаживали, OGSR-Wiki не читая? И, если не читали - то зачем пересаживали? :) (Там же в вики все реальные резоны и причины для этого написаны...)

Всегда, когда я даю подсказки людям в виде пары слов, то это именно ключевые слова, по которым уже можно найти то что надо. Т.е. заходим в OGSR-Wiki, там вводим в поиск то самое, заветное слово script_vars_storage, и радуемся :)

2 часа назад, kenguru сказал:

поподробней

Скрытый текст


function get(var_name, default) -- чтение
	local s = get_stored_vars()
	if s[var_name] ~= nil then return s[var_name] end
	return default
end
function set(var_name, value) -- запись
	local s = get_stored_vars()
	s[var_name] = value
end

 

И ничего не переполнится никогда. Я сотни тысяч var_name так храню.

 

 

  • Нравится 1
  • Согласен 3
  • Полезно 1
Ссылка на комментарий

Согласно этой вот статье:

https://stalker.fandom.com/ru/wiki/Ранг

Есть баг с точностью НПС... И вот вопрос - этот баг в формуле в движке править надо? Или оно зарыто где-то в скриптах? Можно, конечно, порезать всем ранг в 10 раз в конфигах, но проблему полностью это не решит...

  • Полезно 2
Ссылка на комментарий

@Капрал Хикс , в движке, похоже. ai_stalker.cpp:

Скрытый текст
    static float novice_rank_dispersion            = pSettings->r_float("ranks_properties", "dispersion_novice_k");
    static float expirienced_rank_dispersion    = pSettings->r_float("ranks_properties", "dispersion_experienced_k");

    CHARACTER_RANK_VALUE rank = Rank();
    clamp(rank, 0, 100);
    float rank_k = float(rank)/100.f;
    m_fRankImmunity = novice_rank_immunity + (expirienced_rank_immunity - novice_rank_immunity) * rank_k;
    m_fRankVisibility = novice_rank_visibility + (expirienced_rank_visibility - novice_rank_visibility) * rank_k;
    m_fRankDisperison = expirienced_rank_dispersion + (expirienced_rank_dispersion - novice_rank_dispersion) * (1-rank_k);

 

 

  • Полезно 2
Ссылка на комментарий

потихоньку изучаю модинг

появилась идея заставить эту штуку выстрелить при опускании рычага(типо чтоб последовательно появились например эффекты элекрты ну и звук)

https://disk.yandex.ru/i/6bf1M-KjrKliQQ

но появилась загвоздка я даже понятия не имею куда лезть что бы посмотреть как это можно реализовать и возможно ли это вообще

если есть кто знает где смотреть и что курить, подскажите пожалуйста

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

Ищу скрипт, позволяющий НПС игнорировать определённые виды мутантов. Наверняка есть где подсмотреть. Нужно для целого гулага вояк на Кордоне.

Ссылка на комментарий
22 hours ago, Капрал Хикс said:

Нужно для целого гулага вояк на Кордоне.

Ну угадай с одного раза - где:

https://github.com/dsh2dsh/op2ogse/blob/5a01f59d220b7808dbb68cce0af42ce333bb85d4/gamedata/scripts/dsh/dsh_enemies.script#L50

 

И вот прямо таки как раз для целого гулага вояк на Кордоне.

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

Интересно, а есть проверка на наличие определённого предмета в inventory box? Пытался гуглить ничего не нашёл.

Может какие то костыли есть?

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

@Pavel_2000 можно в bind_stalker.script в actor_binder:take_item_from_box:

    if box:story_id() == 47 and item:section() == "af_ice" then
        db.actor:give_info_portion("yan_have_snezhinka")
    end

Как пример. Правда, надо стори ид назначать.

  • Не согласен 1
Ссылка на комментарий

@Pavel_2000 зависит от версии игры.
В ЧН и ЗП есть вполне себе работающий итератор iterate_inventory_box, аналогичный по действию итератору iterate_inventory, но предназначенный, как можно догадаться, как раз для ящиков.
В ТЧ - см. совет выше по перебору серверных объектов.

  • Согласен 1
  • Полезно 1
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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