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

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

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

@Ghilli вроде нет. Наверное получится проверить на присест по позиции камеры относительно модели гг по оси y.

---

Кто нибудь пробовал на один объект повесить два биндера? Они вдвоем будут работать или последний только?

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

@Graff46 мысль, кстати, неплохая. Чет об этом я сразу даже не подумал. Можно попробовать. 

На стоковом движке Зова Припяти dik_to_bind используется только для скриптов связанных с UI? (я сделал предположение на основе того, что нигде более , кроме как в UI скриптах оригинала, это не встречается) 

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

Обнаружил такую недоработку в оригинале ЗП. Если скриптом воспроизводить звуки, то второй (и последующие) не воспроизведутся, пока не пройдёт предыдущий, и какая-то задержка в пару секунд... Это можно как-то пофиксить?

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

Вопрос к знатокам скриптов, сделал систему апгрейда, только вот нижняя ветка не апгрейдится, хоть как нажимай на второй ветке иконки, будет поставлен апгрейд первой ветки, скрипт на 3 скрине

[3 фотографии

DEL

 

 

Изменено пользователем Domestoz
ссылки ВК
Добавлено  Опричник,

Правила форума п.2.7.1 (ссылки на ВК запрещены).

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

https://disk.yandex.ru/i/buSDOiP3EU-O9g Как правильно прочитать параметр fire_modes из секции оружия что бы он показывал -1 или 1 а не как на скриншоте.

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

    local slot = {1,2,4}
        for n = 1,table.getn(slot) do
        local item = db.actor:item_in_slot(slot[n])
        local wpn = db.actor:active_item()
            if item ~= nil and wpn then

            local fm = sys_ini:r_string(wpn:section(), "fire_modes")
            local StatCS = hud:GetCustomStatic("fire_modes_static")
            if (StatCS == nil) and (fm ~= nil) then
                hud:AddCustomStatic("fire_modes_static", true)
                StatCS = hud:GetCustomStatic("fire_modes_static")
                StatCS:wnd():SetText(fm)
            end
        else
            if item then
                hud:RemoveCustomStatic("fire_modes_static")
            end
        end
    end
end

 

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

@Colder, прочитанную из конфигов строку можно разбить на отдельные части функцией parse_nums, например так:

local fm = sys_ini:r_string(wpn:section(), "fire_modes")
local fm_t = parse_nums(fm)

После этого в fm_t будет находиться таблица с отдельными режимами стрельбы.

 

P.S. Только это будут просто считанные из конфигов доступные режимы, а не текущий режим стрельбы.

  • Спасибо 1

S.T.A.L.K.E.R. CoP Objects (upd 15.11.24)

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

Вопрос по ОГСР движку. Пытаюсь прибавить вес ГГ. Вставляю предмет в слот "вес ГГ прибавляеться" убираю из слота "вес ГГ не возвращаеться а остаеться прежнем" как вернуть вес ГГ обратно?

Пробывал так:

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

function on_item_to_slot(obj)
    local st_item = db.actor:item_in_slot(9)
        if st_item and (string.find(st_item:section(), "test_use")) then

        local at = sys_ini:r_float_ex("test_use", "tool_max_weight")
        local curr_max = db.actor:get_actor_max_weight()
        local cur_max_walk = db.actor:get_actor_max_walk_weight()

        db.actor:set_actor_max_weight(curr_max + at)
        db.actor:set_actor_max_walk_weight(cur_max_walk + at)
    else --/ -
        db.actor:set_actor_max_weight(curr_max)
        db.actor:set_actor_max_walk_weight(cur_max_walk)
    end
end

 

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

@WinCap Тоже не работает.

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

function on_item_to_slot(obj)
    local actor_item = db.actor:item_in_slot(9)
    if actor_item and (string.find(actor_item:section(), "test_use")) then

    local at = sys_ini:r_float_ex("test_use", "tool_max_weight")
    local curr_max = db.actor:get_actor_max_weight()
    local cur_max_walk = db.actor:get_actor_max_walk_weight()

    db.actor:set_actor_max_weight(curr_max + at)
    db.actor:set_actor_max_walk_weight(cur_max_walk + at)
else
    local curr_max1 = db.actor:get_actor_max_weight()
    local cur_max_walk1 = db.actor:get_actor_max_walk_weight()

    db.actor:set_actor_max_weight(curr_max1)
    db.actor:set_actor_max_walk_weight(cur_max_walk1)
end
end
 

 

Ссылка на комментарий
3 часа назад, Colder сказал:

db.actor:get_actor_max_weight()

Возвращает текущее значение макс.веса. И get_actor_max_walk_weight аналогично.

Т.е. в блоке else ты читаешь, значения которые у ГГ сейчас. И устанавливаешь их же. Естественно что ничего не меняется.

Базовое значение куда возвращаться, в данном случае лучше из конфига прочитать, из секции actor.

  • Спасибо 1
  • Полезно 2

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

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

(Платформа ОП, rx_kill_wounded.script). 

Может есть какой-то способ сделать так, чтобы раненые враги полностью игнорировались?

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

Вопрос по ТЧ!
Доброго времени суток, товарищи. Я тут понемногу самостоятельно обучаюсь, решил вот сделать смарт-террейн (гулаг). Делал по аналогии уже имеющихся. 
1. В СДК поставил смарт, прицепил к нему шейп, прописал в логике имя, всё как положено: 

[smart_terrain]

type = pseudo_monolit
capacity = 3
groups = 0, 3
2. Поставил трех нпсов, в их кастом дату прописал принадлежность к этому гулагу: 

[smart_terrains]

pseudo_monolit = true
3. Создал для них три точки walk и три точки look. (их назвал правильно - имя_смарта_имя_точки
3ap6UJ2L537CZmMj_B21DE_5Kc2vDxZ7p_4HDkuW

 

в файле gulag_escape.script прописал для них логику и все, что нужно:
 

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

if type == "pseudo_monolit" then
    
    t = { section = "logic@pseudo_monolit_guard1",
        idle = 0,
        prior = 8, state = {0,2},
        position_threshold = 100,
            online = true,
        in_rest = "", out_rest = "",
        predicate = function(obj_info)
                        return obj_info.name == "esc_pseudo_monolit1"
                    end
    }


    table.insert(sj, t)
    
    t = { section = "logic@pseudo_monolit_guard2",
        idle = 0,
        prior = 8, state = {0,2},
        position_threshold = 100,
            online = true,
        in_rest = "", out_rest = "",
        predicate = function(obj_info)
                        return obj_info.name == "esc_pseudo_monolit2"
                    end
    }
    
    
        table.insert(sj, t)
    
    t = { section = "logic@pseudo_monolit_loner",
        idle = 0,
        prior = 8, state = {0,2},
        position_threshold = 100,
            online = true,
        in_rest = "", out_rest = "",
        predicate = function(obj_info)
                        return obj_info.name == "esc_pseudo_loner"
                        
                    end
    }
    
    table.insert(sj, t)
    
end

 

=========

 

        if type == "pseudo_monolit" then
        return function(gulag)
            return 0
        end
    end

 

=======

        if gulag_type == "pseudo_monolit" then
        return npc_community == "stalker"
    end

 

 

В файле gulag_escape.ltx прописал им их логику. 
 

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

[logic@pseudo_monolit_guard1]
active = walker@pseudo_monolit_guard1

[walker@pseudo_monolit_guard1]
path_walk = guard1_walk
path_look = guard1_look
def_state_standing = guard

[logic@pseudo_monolit_guard2]
active = walker@pseudo_monolit_guard2

[walker@pseudo_monolit_guard2]
path_walk = guard2_walk
path_look = guard2_look
def_state_standing = guard

[logic@pseudo_monolit_loner]
active = walker@pseudo_monolit_loner

[walker@pseudo_monolit_loner]
path_walk = loner_walk
path_look = loner_look
def_state_standing = guard

Так вот, сама проблема в том, что эти нпс - стоят на тех местах, где были заспавнены. Их логика почему-то к ним не "цепляется". Если на них нападут (мутант, или сталкер какой) то как всё успокоится, они встанут на том месте, где остановились. Как "заставить" их "увидеть" их логику и действовать, согласно ней? Спасибо!

God save Hatsune Miku!

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

@Colder смотрим сюда, и видим, что для этого параметра есть только метод get_artefact_count. set_artefact_count - отсутствует. Стало быть, одними скриптами это никак не возможно.

Это легко поправить.
 

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

 

CustomOutfit.h

void set_artefact_count (u32 x) { m_artefact_count = x; }

script_game_object.h

void SetArtefactCount(u32 val);

script_game_object.cpp

void CScriptGameObject::SetArtefactCount(u32 val)
{
	CCustomOutfit	*outfit = smart_cast<CCustomOutfit*>(&object());
	if (!outfit) return;
	outfit->set_artefact_count(val);
}

script_game_object_scriptXXX.cpp

		.def("set_artefact_count",			&CScriptGameObject::SetArtefactCount)

Добавить эти строчки, скомпилировать движок, и всё.

 

 

 

  • Спасибо 1
  • Полезно 3
  • Жуть! 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

Ссылка на комментарий
23 часа назад, Labadal сказал:

3. Создал для них три точки walk и три точки look.

Флаги в путях проставил?

Clipboard01.jpg

https://xray-engine.org/index.php?title=Точки_пути_(way_point)

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

Господа, вопрос такой:

 

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

(Можно инфопоршень, неважно).

 

А то по трем гайдам, у меня проблемы, везде вылеты с логом по "g_.script'у" с ошибкой "#2". 

Направьте пожалуйста, и прошу прощения если оффтоп. 

ТЧ. 1.0004

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

@EGER.OVERKILL WF , рестриктор на вход, там при входе актёру выдать инфо, который запустит квест. Прошу прощения, но с телефона не могу привести примеры кодов. 

Здесь могла быть ваша реклама.

Ссылка на комментарий
23 минуты назад, mole venomous сказал:

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

Это понял, делаю по урокам разным, но результат один, при НИ вылет.

 

Как правильнее сделать выдачу поршня в логике?

Я делаю так: 

 

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

custom_data = <<END

[logic]
active = sr_idle

[sr_idle]
on_inside = %+kura%
END 

 

Изменено пользователем EGER.OVERKILL WF
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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