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

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

@trantat, ну если гнаться за "универсальным" приёмом то далеко не уедешь если ты не скриптовый гуру. В любом случае я думаю это ещё кому-нибудь да пригодится. В скриптах увы ничем не могу помочь.

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

@Shkiper2012, Только что попробовал твой код, нажимаю T - cкорость уменьшается, но все равно большая. Я бы хотел добиться скорости приблизительную к скорости ходьбы. Пробовал изменять значение переменной на local distant_step = 0.1 и получаю

, когда ГГ летит не по направлению взгляда. Видать не получится у меня ничего, ну и на том всем спасибо. Изменено пользователем TIGER_VLAD
Ссылка на комментарий

@TIGER_VLAD,

Я тоже пытался реализовать функцию полета через db.actor:set_actor_position() и получил такой же результат как у Вас.

Скорее всего, это происходит из-за того что функция set_actor_position() корректирует передаваемые ей координаты на коллизию с объектами, что при малых значениях delta и дает наблюдаемый нами эффект.

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

Изменено пользователем WinCap
  • Спасибо 1

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

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

Подскажите, почему когда я пишу верные координаты при спавне нпс через allspawn он появляется в другом месте...

пс: упд коорды и просто коорды указаны верно, проверял раз 5...

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

 

 

пишу верные координаты

Может дело в том, откуда Вы получили/взяли эти самые верные координаты? Вдруг они и не такае уж и верные?

Других причин вроде быть не должно.

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

 

 

почему когда я пишу верные координаты при спавне нпс через allspawn он появляется в другом месте
Откуда уверенность, что спавн происходит не по координатам ? И насколько это - в другом месте ? Из вариантов: непись может просто успевает свалить с точки спавна(такое возможно в зависимости от прописанной неписю логики\ее отсутствия), для непися выставлены флаги спавна с привязкой к AI-сетке - движок его подвинет к ближайшей ноде, если точка задана не на сетке.
  • Согласен 1
Ссылка на комментарий

@UnLoaded

Коорды ставил около перехода на свалку а непись появляется за жд насыпью со стороны сидора...


@UnLoaded,

Забыл сказать что непись мертвый.

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

Подскажите для ТЧ скриптовый аналог функции use_ai_locations. Если не ошибаюсь, через нет-пакеты этот флаг можно править.  

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

@hi_flyer, под ТЧ что ты понимаешь? В x-ray extensions есть этот метод. Если тебе нужно именно через нетпакет, то вот код, который я некоторое время использовал

function clear_used_ai_locations( sobj )
  local pk = get_netpk( sobj, 1 )
  if pk and pk:isOk() then
    local data = pk:get()
    data.object_flags = bit_and(
      data.object_flags, bit_not( object_flags.UsedAI_Locations )
    )
    pk:set( data )
  end
end

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

Так, что-то я туплю совсем. Есть два костра, с разными путями. Пути прописаны в секциях логики kamp1 и kamp2.

Между ними гоняется непись.

 

Инициализация непися выглядит так:

 

function add_to_binder( npc, ini, scheme, sect, st )
    local nm = npc:name()
    -- log( "info", "add_to_binder, %s...", nm )

    local kamp_end = xr_evaluators_id.stohe_kamp_base + 1
    local on_pos = xr_evaluators_id.stohe_kamp_base + 2

    local mgr = npc:motivation_action_manager()
    mgr:add_evaluator( kamp_end, evaluator_kamp_end( "kamp_end", st, sect ) )
    mgr:add_evaluator( on_pos, evaluator_on_position( "kamp_on_position", st, sect ) )

    local a = action_wait( nm, "action_kamp_wait", st )
    a:add_precondition( world_property( stalker_ids.property_alive, true ) )
    a:add_precondition( world_property( stalker_ids.property_danger, false ) )
    a:add_precondition( world_property( stalker_ids.property_enemy,    false ) )
    -- a:add_precondition( world_property( stalker_ids.property_anomaly, false ) )
    xr_motivator.addCommonPrecondition( a )

    a:add_precondition( world_property( on_pos, true ) )
    a:add_effect( world_property( kamp_end, true ) )
    mgr:add_action( xr_actions_id.stohe_kamp_base + 3, a )
    subscribe_action( npc, st, a )

    a = action_go_position( nm, "action_go_kamp", st )
    a:add_precondition( world_property( stalker_ids.property_alive, true ) )
    a:add_precondition( world_property( stalker_ids.property_danger, false ) )
    a:add_precondition( world_property( stalker_ids.property_enemy, false ) )
    -- a:add_precondition( world_property( stalker_ids.property_anomaly, false ) )
    xr_motivator.addCommonPrecondition( a )

    a:add_precondition( world_property( on_pos, false ) )
    a:add_effect( world_property( on_pos, true ) )
    mgr:add_action( xr_actions_id.stohe_kamp_base + 1, a )

    a = mgr:action( xr_actions_id.alife )
    a:add_precondition( world_property( kamp_end, true ) )
end

 

 

 

Если случается ивент "disable", неписю делается следующее:

 

    local kamp_end = xr_evaluators_id.stohe_kamp_base + 1
    local on_pos = xr_evaluators_id.stohe_kamp_base + 2

    local mgr = npc:motivation_action_manager()

-- todo: слишком сложно. ПРОСТО оторвать лишние эвалюаторы СОВСЕМ. Оставить все в одном.
    local a = mgr and mgr:action( xr_actions_id.alife )
    if a then a:remove_precondition( kamp_end )
    else log( "warning", "(%s):removeNpc, no action (alife) (%s)", self.center_point, npc:name() )
    end

    a = mgr:action( xr_actions_id.stohe_kamp_base + 3 )
    if a then
        xr_logic.unsubscribe_action_from_events( npc, st, a )
        mgr:remove_action( xr_actions_id.stohe_kamp_base + 3 )
        -- log( "info", "(%s):removeNpc, %s, 2", self.center_point, npc:name() )
    else log( "warning", "(%s):removeNpc, no action (action_kamp_wait) (%s)", self.center_point, npc:name() )
    end

    mgr:remove_action( xr_actions_id.stohe_kamp_base + 1 )
    -- log( "info", "(%s):removeNpc, %s, 3", self.center_point, npc:name() )

    mgr:remove_evaluator( kamp_end )
    -- mgr:add_evaluator( kamp_end, property_evaluator_const( true ) )
    mgr:remove_evaluator( on_pos )
    -- mgr:add_evaluator( on_pos, property_evaluator_const( true ) )

 

 

И, с новым сторейжем, опять дергается function add_to_binder()

 

Вот какого он продолжает выполнять action_go_position:execute(), благополучно пропустив action_go_position:initialize() ?

 

И как ему все-таки сказать, что вообще-то надо бы action_go_position:initialize() все-таки сделать ?
 

p.s. Зачем такие сложности ? По тому что без этого в какой-то момент начинается вообще адова каша: какая схема по какому эвалюатору дергается, и с чьим сторэйжем - черт ногу сломит.

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

В планировщике не предусмотрена возможность замены экшна во время выполнения, соответственно эти твои хаки на него впечатления не производят. Вызов finalize initialize происходит только при переключении на другой экшн, а для этого нет оснований.(идентифицируется он, ясное дело, по id)

p.s. Ну и конечно это вот колдунство с планировщиком для решения банальной задачи реинициализации схемы выглядит, мягко говоря, странно.

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

Адекватное решение - это вообще не плодить экшены, которые можно не плодить, да.

Раз уж оно именно так сделано.

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

Тэкс, граждане... А кто ТОЧНО знает, в чем смысл *:net_save_relevant() ?

Это, часом, не средство сказать, что объект МОЖНО сохранять, а иначе - НИ-НИ ?

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

@Dennis_Chikin, если я ничего не путаю, то true из этого метода говорит движку, что бы он сохранял клиентский объект при его переходе в оффлайн. Иначе, только при сейве в онлайне. Могу напутать, т.к. давно это смотрел.

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

При переходе в офлайн он его не сохраняет совершенно точно В ПРИНЦИПЕ. В смысле, хоть true, хоть false, хоть эпическая поэма.

А вот будет ли объект сохраняться при false при сэйве - если да, то смысл этой шняги как раз в том, чтобы не сохранять в сэйв что-нибудь странное типа имени "" для ltx.

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

@Dennis_Chikin, у меня осталось в памяти впечатление, что оно делалось для того, что бы сохранять/не сохранять при переходе в оффлайн. Ну а то, как оно работает - это уже второй вопрос. Оно не только в этом вопросе работает совсем не так, как задумывалось и декларировалось.

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

Что это может быть, если:

делаю 1: get_hud():AddCustomStatic()
делаю 2: wnd():AttachChild()
здесь ГГ получает хит от собаки ("разрыв")
делаю 3: wnd():DetachChild()

Но "3" уже не работает, скрипт виснет.

Нет хита -- работает.

При других хитах -- работает.

Чем рисование "разрыва" отличается от рисования других хитов?

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

всё легко

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

Господа, никто не поделится функцией перетаскивания всех имеющихся у ГГ предметов в именной ящик с уникальным стори айди? 

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

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

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

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

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

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

Войти

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

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

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