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

Полагаю, вообще и в частности, если исходный (ванильный) движок не позволяет сделать что-то конкретное (хотелку), самый правильный вариант - править движок под свои нужды. Ясен пень, изучать исходники, научиться все это дело собирать и все выйдет, как надо. Правда процесс сей муторный и длительный, но результат будет!

 

Не всем сей совет подойдет. Мне вот не подошел :)

  • Согласен 2

Сталкер - наше всё!

10 часов назад, AndrewMor сказал:

Мне вот не подошел

Аналогично, но с советом целиком и полностью согласен. :)
Но я на работе настолько наедаюсь программированием (full stack от БД до фронта), что лезть и в движок Сталкера тупо не хотелось, хотя при нужде могу просто посмотреть, что там в нужном месте написано.

Для меня чистые Lua скрипты на ванильном движке - это редкий отдых. :)


@Zander_driver почему бы просто не выложить куда-нибудь в инструментарий мододела? Кому надо - найдёт и возьмёт не сейчас, так позже. Я вот тоже обязательно полюбопытствую, а может и воспользуюсь однажды.

Изменено пользователем Kirgudu
  • Спасибо 1
  • Нравится 1

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

04.03.2023 в 06:10, Norman Eisenherz сказал:

получить все входящие секции из конфига [weapons.ltx]

Нужно что-то типа этого: сканирование конфигов с помощью FS. Только тут нужно, чтобы конфиги были не в архивах.

Изменено пользователем naxac
  • Согласен 1
  • Полезно 3

Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO

naxac.gif

04.03.2023 в 17:21, Kirgudu сказал:

почему бы просто не выложить куда-нибудь в инструментарий мододела?

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

И выложу в новой теме в инструментарии.

1 час назад, naxac сказал:

что-то типа этого

БД сканировать всяко удобнее :)

  • Нравится 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.

Есть такой код:
 

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

    if obj:section() == "sleepingbag" then
        local can_sleep = true    
        local actor = db.actor
        for id=1,65535 do
            local object = level.object_by_id(id)
            if object ~= nil then
                if (IsStalker(object) and object:relation(actor) == game_object.enemy) or IsMonster(object) then
                    if object:position():distance_to(actor:position()) < ENEMY_RADIUS and object:see(actor) then
                        news_manager.send_tip(actor, "sleep_warning_enemy", nil, "default", 5000)
                        can_sleep = false
                        break
                    end
                end
            end
        end

        -- проверка на радиацию
        if actor.radiation > 0 and can_sleep then
            news_manager.send_tip(actor, "sleep_warning_radiation", nil, "default", 5000)
            can_sleep = false
        end

        if actor.satiety < 0.5 and can_sleep then
            news_manager.send_tip(actor, "satiety_warning_radiation", nil, "default", 5000)
            can_sleep = false
        end
        
        if can_sleep then
        end

    end

 

    -- ATM Sleeping Bag start
    if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then
        jump_level.try_to_jump()
        self.already_jumped = true
        return
    end


Что мне нужно:
Если все проверки проходят, то запускаем окно сна, а если нет, то нет соответственно.

Проблема в чём: если проверка не проходит то окно открывается.

Что не так с кодом?

ищу человека, который смог бы заняться разработкой погоды на OGSR.
кто может помочь - пишите в ЛС.

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

Есть такой код:

Функцию целиком выложи, а то не очень понятно что к чему

 

ну или как-то так:

Скрытый текст
    if obj:section() == "sleepingbag" then
        local can_sleep = true    
        local actor = db.actor
        for id=1,65535 do
            local object = level.object_by_id(id)
            if object ~= nil then
                if (IsStalker(object) and object:relation(actor) == game_object.enemy) or IsMonster(object) then
                    if object:position():distance_to(actor:position()) < ENEMY_RADIUS and object:see(actor) then
                        news_manager.send_tip(actor, "sleep_warning_enemy", nil, "default", 5000)
                        can_sleep = false
                        break
                    end
                end
            end
        end

        -- проверка на радиацию
        if actor.radiation > 0 and can_sleep then
            news_manager.send_tip(actor, "sleep_warning_radiation", nil, "default", 5000)
            can_sleep = false
        end

        if actor.satiety < 0.5 and can_sleep then
            news_manager.send_tip(actor, "satiety_warning_radiation", nil, "default", 5000)
            can_sleep = false
        end
		
         -- ATM Sleeping Bag start
        if can_sleep then
            if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then
                jump_level.try_to_jump()
                self.already_jumped = true
                return
            end		
        end
    end

 

 

Изменено пользователем ted.80
52 минуты назад, ted.80 сказал:

Функцию целиком выложи, а то не очень понятно что к чему

Это вся функция и есть, впихнул в on_use в биндер.
Впрочем вот все скрипты касательно этого сна: тык

То, что ты кинул не помогло.

ищу человека, который смог бы заняться разработкой погоды на OGSR.
кто может помочь - пишите в ЛС.

Для перебора NPC в онлайне лучше использовать for id, v in pairs(db.storage) – так всего пара сотен объектов будет.

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

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

15 часов назад, imcrazyhoudini сказал:

Что не так с кодом?

да там всё "нитак" - все проверки у тебя находятся в bind_stalker.script > actor_binder:use_object(obj)

но и одна из них не запускает "окно сна", а конструкция:

    -- ATM Sleeping Bag start
    if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then
        jump_level.try_to_jump()
        self.already_jumped = true
        return
    end

ни какого отношения к сну вообще не имеет :big_boss:

А нужное тебе окно запускается через - bind_stalker.script > actor_binder:on_item_drop (obj) > atmmain.on_item_drop(obj)

function on_item_drop(obj)
	if obj:section() == "sleepingbag" then
		sleepingbag_id = obj:id();
		ui_sleep_init = true;		
	end
--	atmdebug.abundance(obj);	
end

тут проверяется секция и переменная  ui_sleep_init  становится "тру"

потом эта переменная в функции    atmmain.update()  которая как нистрано висит апдейте актора

в строке 59 запускает нужное или нет окно 

level.start_stop_menu(atmsleep.UISleep(), true);

 

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

@ted.80 выбросил всё лишнее и оставил лишь в on_use такую рабочую конструкцию:
 

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

function update(obj)

    if obj:section() == "sleepingbag" then
        local ui_sleep_init = true    
        local actor = db.actor
        for id, v in pairs(db.storage) do
            local object = level.object_by_id(id)

            if object ~= nil then
                if (IsStalker(object) and object:relation(actor) == game_object.enemy) or IsMonster(object) then
                    if object:position():distance_to(actor:position()) < ENEMY_RADIUS and object:see(actor) then
                        news_manager.send_tip(actor, "sleep_warning_enemy", nil, "default", 5000)
                        ui_sleep_init = false
                        break
                    end
                end
            end
        end

        if actor.radiation > 0 and ui_sleep_init then
            news_manager.send_tip(actor, "sleep_warning_radiation", nil, "default", 5000)
            ui_sleep_init = false
        end


        if actor.satiety < 0.70 and ui_sleep_init then
            news_manager.send_tip(actor, "sleep_warning_satiety", nil, "default", 5000)
            ui_sleep_init = false
        end
        
        if ui_sleep_init == true then
            level.start_stop_menu(atmsleep.UISleep(), true)
        end     
    end
end

Теперь остался такий вопрос: а как можно остановить сон если ГГ проголодается?
Впихнул на апдейт такое:
 

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

        if db.actor.satiety < 0.70 and ui_sleep_init == true then
                news_manager.send_tip(actor, "satiety_sleep", nil, "default", 5000)
                atmsleep.sleep_stop()
        end


Но сон не останавливает.

Что не так?

ищу человека, который смог бы заняться разработкой погоды на OGSR.
кто может помочь - пишите в ЛС.

@imcrazyhoudinidell

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

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

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

Что не так?

 

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

   if db.actor.satiety < 0.70 and ui_sleep_init == true then

Тут    ui_sleep_init    всегда будет "фолс" а не "тру" всегда!!!

потому что в предыдущей функции она объявлена  local   

и живёт она только внутри этой функции :spiteful:, и её значение в другую функцию

а тем более в другой скрипт не передаётся

  • Спасибо 1

@ted.80 false? Хм, а точно не nil сопровождаемый вылетом с ругонью на эту самую переменную?

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

20 минут назад, UriZzz сказал:

Хм, а точно не nil

	if variable == nil or variable == "nil" or variable == false then
  		variable ~= true
  	end

 

  • Согласен 1

Всем привет!

Имею такой код:

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

function actor_on_update(status)
    local tm = task_manager.get_random_task()
    local active = tm.active_task_by_type
    for k, task_id in pairs(active) do
    local task_status = tm.task_info[task_id].status
        if task_status == "completed" then --// Если завершили таск
            ----
        end
    end
end

Хочу сделать что бы при взятии задания на убиство нпс задание завершалось автоматически а не бежать обратно за наградой. Как завершить принудительно выполненый таск?

Никто случайно не вникал (и соответственно) не правил работу стейт менеджера?

Проблема в том, что НПС отыгрывает анимации лишь с into, a out и idle прекрасно игнорирует.

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

ищу человека, который смог бы заняться разработкой погоды на OGSR.
кто может помочь - пишите в ЛС.

Добрый день.

Как у нпц поменять имя? Для серверного объекта способ нашёл:

local sobj = alife():object( id )	
local pk = m_netpk.get(sobj, 1)
local data = pk:get()
local name = data.checked_characters
--ВОТ ТУТ МЕНЯЕМ
data.checked_characters = "Джек Потрошитель"
pk:set(data)

А как тоже самое сделать для клиентского объекта?

3 часа назад, phalcor сказал:

Для серверного объекта способ нашёл

Не очень понимаю, как такое может сработать, ведь свойства checked_characters нет в оригинальном модуле Артоса для работы с нет-пакетами (который тут, судя по всему, и используется).

3 часа назад, phalcor сказал:

А как тоже самое сделать для клиентского объекта

Воспользоваться аналогичным кодом, но поменять свойство character_name.

Это, однако, не поможет, поскольку имя персонажа в журнале, диалогах и при наведении курсора берётся из профиля.

Можно, конечно, и профиль на лету поменять - для этого в нетпакете есть свойства specific_character и character_profile, но и они не охватывают всё, к тому же сие чревато другими последствиями, такими как замена визуала и т. п.

Имхо, без редактирования движка на все 100 задачу не выполнить.

  • Спасибо 1
  • Согласен 1

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

19 минут назад, Kirgudu сказал:

ведь свойства checked_characters нет в оригинальном модуле Артоса

У меня от ОП 2.2, там есть, и работает.

20 минут назад, Kirgudu сказал:

Воспользоваться аналогичным кодом, но поменять свойство character_name.

Не соображу, как именно это провернуть с клиентским объектом? Если можно, поясни в двух словах.

p.s. Я пока пытаюсь схитрить - увожу нпц в оффлайн, меняю имя и снова вывожу в онлайн, но что-то не все хотят уходить в оффлайн, при том, что sobj.can_switch_offline = true. Видимо, есть ещё какой-то ограничитель.

@phalcor можно попробовать воспользоваться встроенной в модуль функцией автоматического перевода объекта онлайн-оффлайн-онлайн:

m_netpk.do_switchings(id)

Она в публичный интерфейс автором не выведена, поскольку предназначена в первую очередь для изменения абстрактной части из коллбэка, но дёрнуть её напрямую ничто не мешает.

  • Спасибо 1
  • Нравится 1
  • Полезно 1

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

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

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

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

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

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

Войти

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

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

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