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

@АuReN, где-то я видел этот скрипт...  Вот: http://www.amk-team.ru/forum/index.php?showtopic=6458&page=3#entry609001

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

А проверьте меня кто-нибудь, правильно ли я понимаю:

 

1. Если непись в гулаге вдруг помирает, его работа на какое-то время становится недоступной.

2. Гулаг меняет state, и в нем появляются доступные работы.

3. В гулаг засасывается новый непись.

4. Гулаг меняет состояние на то, в котором работа недоступна.

Что при этом происходит с неписем ?

 

Аналогично с выгнанным из гулага неписем.

  • Нравится 1

 

 


Что при этом происходит с неписем ?

 

С работы в любом случае уйдёт при вызове gulag:prepare_jobs_for_new_state(), то есть сразу же после смены состояния гулага. После этого на следующем обновлении планировщика (brain) NPC должен уйти из гулага/смарта, потому что вызов se_smart_terrain:enabled() вернет false.
 

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

 

Сам скрипт модели:

local scheme_status={}
local property_need_to_trade = 1821327

class "evaluator_need_to_trade" (property_evaluator)
function evaluator_need_to_trade:__init(name, storage) super (nil, name)
    self.st = storage
end

function evaluator_need_to_trade:evaluate()
    amk.ls_send_tip(self.object:character_name().." evaluate()")
    if self.st==nil or self.st.enabled~=true then
        -- модель поведения запрещена
        return false
    end

    if not db.actor then
        -- ГГ ещё не заспаунился
        return false
    end
    if self.object:best_enemy() then
         return false -- Блокирование во время боя
    end
    local npc = self.object
    --нет ни одной аптечки, нет всего набора хавчика, при том, что деньги ещё остались
    if npc:money() < 100 then return false end -- денег нет - и суда нет
    local vertex = get_nearest_trader_vertex()
    if npc:level_vertex_id() == vertex then disable_scheme(npc,"npc_want_trade") end --дошёл до торговца
    if (npc:object("medkit")==nil
        and npc:object("medkit_army")== nil
        and npc:object("medkit_scientic")==nil) then return true
    end

    if npc:object("bread") == nil or
        npc:object("kolbasa") == nil or
        npc:object("conserva") == nil then return true
    end

    return false
end

class "action_go_to_trader" (action_base)
function action_go_to_trader:__init(name, storage) super (nil, name)
    self.st=storage
end
function action_go_to_trader:initialize()
    action_base.initialize(self)
    local npc=self.object
    npc:set_desired_position()
    npc:set_desired_direction()
    npc:clear_animations()
    npc:set_detail_path_type(move.line)
    npc:set_body_state(move.standing)
    npc:set_movement_type(move.run)
    npc:set_path_type(game_object.level_path)
    npc:set_mental_state(anim.danger)
    npc:set_sight(look.danger, nil, 0)
    npc:remove_all_restrictions()
    self.offset=vector():set(math.random()*6-3,0,math.random()*6-3)
    self.offset:normalize()
end

function action_go_to_trader:execute()
    action_base.execute(self)
    amk.ls_send_tip(self.object:character_name().." execute()")
    if not actor then
        -- Хм, что-то не так. Может быть ГГ перешёл на другой уровень? Запрещаем схему поведения
        self.st.enabled=false
    end
    if self.delay and self.delay>time_global() then
        return
    end
    self.delay=time_global()+1000
    local npc=self.object
    local actor=db.actor
    local vertex_id = get_nearest_trader_vertex()
    if vertex_id then
        npc:set_dest_level_vertex_id(vertex_id)
    end
end

function action_go_to_trader:finalize()
    action_base.finalize (self)
end

function add_to_binder(object, char_ini, scheme, section, st)
    local manager = object:motivation_action_manager()
    local property_wounded = xr_evaluators_id.sidor_wounded_base

    manager:remove_evaluator(property_need_to_trade)
    manager:add_evaluator(property_need_to_trade, evaluator_need_to_trade("npc_want_trade",st))
    local action = this.action_go_to_trader("action_go_to_trader",st)
    action:add_precondition(world_property(stalker_ids.property_alive, true))
    action:add_precondition(world_property(property_wounded, false))
    if anomaly_evader then
        action:add_precondition (world_property(1099,false))
    end
    action:add_precondition(world_property(property_need_to_trade, true))
    action:add_effect (world_property(property_need_to_trade, false))
    xr_motivator.addCommonPrecondition(action)
    manager:add_action (action_go_to_trader, action)
    -- Теперь подкорректируем стандартные операторы, чтобы помощник не отвлекался на всякую ерунду.
    action=manager:action(stalker_ids.action_alife_planner)
    action:add_precondition(world_property(property_need_to_trade, false))
    action=manager:action(stalker_ids.action_combat_planner)
    action:add_precondition(world_property(property_need_to_trade, false))
    action=manager:action(stalker_ids.action_danger_planner)
    action:add_precondition(world_property(property_need_to_trade, false))
end

function set_need_trade(npc,ini)
    local st = xr_logic.assign_storage_and_bind(npc, ini, "npc_want_trade","npc_want_trade")
    st.enabled=true
    scheme_status[npc:id()]=true
end

function disable_scheme(npc,scheme)
    local st = db.storage[npc:id()][scheme]
    if st then
        st.enabled = false
    end
    scheme_status[npc:id()]=nil
end

function get_nearest_trader_vertex()
    return 64955--заглушка временная, для кордона
end

 

Зарегистрировал в modues.script

if npc_trade then -- в этой строке мы проверяем что наш скрипт действительно существует
    load_scheme("npc_trade", "npc_want_trade", stype_stalker)
end

 

Запускаю модель автоматом в xr_logic.script, в функции enable_generic_schemes(ini, npc, stype, section)

if npc_trade then npc_trade.set_need_trade(npc,ini) end

 

Деактивирую так же автоматом в xr_logic.script, в функции disable_generic_schemes(npc, stype)

if npc_trade then npc_trade.disable_scheme(npc,"npc_want_trade") end

 

В xr_motivator.script в функции addCommonPrecondition(action) чтобы заблокировать стандартные схемы поведения:

if npc_trade then
    action:add_precondition (world_property(npc_trade.property_need_to_trade,false))
end

 

Ну и последнее, в функцию xr_motivator.net_spawn()

if npc_trade then
    local manager = self.object:motivation_action_manager()
    manager:add_evaluator(npc_trade.property_need_to_trade, property_evaluator_const(false))
end

 

Где может быть ошибка? Может, ошибка не синтаксическая, а логическая?

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

@dukekan,Скорее всего логическая, так как на синтаксис, движок в лог выпечатывает имя "убитого" скрипта, или функции что довольно редко  

Самая главная ошибка - в xr_motivator.addCommonPrecondition добавляется условие

if npc_trade then
      action:add_precondition (world_property(npc_trade.property_need_to_trade,false))
end

которое применяется к действию созданной схемы. Получается, что к нему добавляются 2 взаимоисключающих условия:

action:add_precondition (world_property(npc_trade.property_need_to_trade,false))
action:add_precondition(world_property(property_need_to_trade, true))

поэтому и вылетает. В фунции add_to_binder надо вместо вызова функции xr_motivator.addCommonPrecondition просто скопировать ее содержимое, за исключением условия, которое приводит к вылету.

Как можно скриптово контролировать/изменять значение определенного канала(ARGB) у кастомстатика в ЗП? В ТЧ/ЧН в классе CUIStatic есть метод SetColor, к сожалению в ЗП такого нет. Просто нужно у кастомстатика менять значение альфа канала, для плавности затухания текстуры...

Изменено пользователем Viнt@rь

 

 


В фунции add_to_binder надо вместо вызова функции xr_motivator.addCommonPrecondition просто скопировать ее содержимое, за исключением условия, которое приводит к вылету.

 

Попробовал, вылетает. Всё также безлогово

@Viнt@rь,В виду того что GSC очень сильно урезали класс CUIStatic, видимо был введен новый класс, CUILines,который расширяет возможности CUIStatic.
Вот как выглядит CUILines:

C++ class CUILines {

function GetText();

function SetTextST(string);

function SetTextColor(number);

function SetText(string);

function SetFont(CGameFont*);

function SetElipsis(boolean);
 

};


Как я понимаю function SetTextColor должен быть записан в виде  wnd:SetTextColor[a,r,g,b] (на самом деле в круглых, но движок сайта думает что это смайлы) и должен служить альтернативой "статиковскому" SetTextColor'у

 

Я сам правда не пробовал еще, (мне бы в мой рюкзак тоже понадобилось изменять цвет при приближении текущего объема к максимальному, переходить  зеленый->желтый->красный), если попробуешь напиши в ЛС о результатах, буду благодарен) 


@Viнt@rь,черт, кажется я понял)) ты только о текстурах) 

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

@Viнt@rь,в ЗП выпилили этот метод.

Когда я ковырял под ЗП, тоже, внезапно столкнулся с фактом его отсутствия и был ошеломлен. Придется плясать с бубном либо лезть в движок и восстанавливать.

, буду при много благодарен, да и не только я, если получиться вернуть его, а то создавать 255 тегов кастом статика с разным альфа каналом в ui_custom_msgs.xml не в прикол)

Замучался я с этой схемой. Жаль, что движок не выдаёт ошибок в действии модели поведения.

Может, у кого ещё есть идеи,  в чём ошибка?  А то я всё больше склоняюсь к мысли не мучаться с "правильными" методами реализации поведения сталкеров, как это делали разработчики, а просто написать код без классов, который будет делать тоже самое. Потому как послать сталкера к торговцу "по простому" у меня заняло 15 минут, а здесь неделю)

К моменту добавления условий соответствующие эвалуаторы уже должны быть добавлены в планировщик. То есть все схемы, условия которых добавляются через add_precondition, должны быть загружены. Поэтому лучше поставить загрузку схемы последней в функции enable_generic_schemes. Кроме того, во всех схемах, загрузка которых вызывается из enable_generic_schemes, надо также заменить вызов addCommonPrecondition (если он там есть) на содержимое этой функции, но без добавления условия схемы npc_trade. Иначе они будут добавлять еще не существующее условие.

Всем привет. Возникла проблема: на n-ном апдейте актора я заполняю таблицу данным, а на следующем апдейте она пустая, почему?

 

А о том, как ты её заполняешь и получаешь из неё данные, мы сами должны придумать!?

Буду удалять подобные вопросы без объяснений - всех касается.

ColR_iT

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

 

Подскажите пожалуйста как добавить свою схему логики. Допустим xr_walker_klon. 

 

1. Грубо говоря копия xr_walker.

 

2. Зарегестрировать в modules:

load_scheme("xr_walker_klon",                        "walker_klon",       stype_stalker)

Нужно что-то еще? Схема как бы работает, вот только "как бы". В основном в схеме меняются состояния передвижения сталкера через "state_mgr.set_state" и "move_mgr", а вот в игре они почти не меняются. Может ли какая-нибудь другая схема препятствовать этим изменениям?

 

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

 

Я в данный момент пытался физикой это сделать, сделал себе модель-болванку и через класс physics_joint пытался указывать направление джоинта через функции типа set_axis_dir_global(number, number, number, number);

В оригинале эти функции никак не используются, примера глянуть негде, в игре на них никакой реакции не было.

Может кто то уже придумал как изменить дирекцию объекта допустим через физику? 

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

@*Shoker*,

менять дирекцию с большой скоростью - это по русски крутить? :) В теории можно приложить 2 антиколлинеарные силы к противоположным точкам тела - оно начнет крутиться на  месте :) Будет ли работать это в ОДЕ - не знаю.

  • Нравится 1

Вариант сделать под объектом джоинт типа "колесо" и крутить его в одну сторону щас тоже наверно буду пробовать :D

P.S. Разобрался - косяк был в том, что забыл занести апдейт таймеров, отвечающих за состояние передвижения, в actor_binder:update(delta)  :blush:

 

Кто-нибудь знает способ сохранения данных в ТЧ? Просто мне нужно при запуске(именно при запуске, т.е. в главном меню) игры узнать результат предыдущей (одну переменную). Пробовал через Lua io.open, но не получается (я так понял, эти функции есть только в ЗП и ЧН). Помог бы конечно amk.save_variable, но ведь она действует только при уже загруженной игре.

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

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

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

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

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

Войти

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

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

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