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

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

@А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, форум АМК съел моё старое имя и не хочет отдавать о_О

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

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

@*Shoker*,

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

Войти

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

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

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