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

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

@Colder @Zander_driver @mole venomous 

А может проще сделать ребята? У аномалий есть биндер(bind_anomaly.script), как уже выше сказали, и у него есть ф-ция

function anomaly_binder:update(delta)
    object_binder.update(self, delta)
end

Вот в ней и делать проверку на расстояние до актера и выполнять что необходимо.

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

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

@Colder 

Активация биндера в конфигах аномалий, для примера радиоактивных:
[zone_radioactive]
GroupControlSection = spawn_group_zone
$spawn         = "zones\radioactive"
;$prefetch         = 16
class            = Z_RADIO

script_binding        = bind_anomaly.init_radiation    ; <----- это добавить

hit_impulse_scale    = 0.001; 0.01

И сам скрипт-файл биндера. 

  • Спасибо 1
  • Полезно 3
Ссылка на комментарий

Здравствуйте. Есть ли способ держать принудительно в онлайне нпс с указанными story_id и нпс, которые находятся в указанном смарт_террейне?

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

@DibokDibokin 

Конечно есть. Выставить флаг flSwitchOffline в false, что запретит объекту переход в оффлайн.

Для одиночного непися способов два:

 - в all.spawn выставить для object_flags соответствующее значение(в СДК просто, в разобранном ACDC спавне - сложнее);

 - скриптово, с помощью ф-ции set_switch_offline(int id, bool v) класса alife_simulator, вторым параметром false.

Для гулагов, в настройках работ есть такой параметр, который вроде может запрещать офф\он лайн. Но там точно не помню, давно там не ковырялся.

Изменено пользователем AndreySol
  • Спасибо 1
  • Согласен 2
  • Полезно 3
Ссылка на комментарий

@AndreySol Сделал так :

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

function radiation_anomaly_binder:update(delta)
    object_binder.update(self, delta)
    local actor = db.actor
    if actor then
    local dist = actor:position():distance_to(self.object:position())
    if dist <= 10 then

    local hud = get_hud()
    hud:AddCustomStatic("radiation_hud_static", true)
    else
    local hud = get_hud()
    hud:RemoveCustomStatic("radiation_hud_static", false)
end
end
end

Но она почему то не горит а маргает

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

    local actor = db.actor
    if actor then
    local dist = actor:position():distance_to(self.object:position())

    if dist <= 15 then
    local hud = get_hud()
    hud:AddCustomStatic("radiation_hud_static", true)

    elseif dist <= 25 then
    local hud = get_hud()
    hud:RemoveCustomStatic("radiation_hud_static", false)

Вот так нормально, можно даже наверно попроще!


Подарки

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

    @Colder

    Скрытый текст
    
    function radiation_anomaly_binder:update(delta)
      object_binder.update(self, delta)
      local actor = db.actor
      if actor then
        local dist = actor:position():distance_to(self.object:position())
        local st = get_hud():GetCustomStatic("radiation_hud_static")
        if dist <= 10 then
          if not st then
            get_hud():AddCustomStatic("radiation_hud_static"), true)
          end
        else
          if st then
            get_hud():RemoveCustomStatic("radiation_hud_static")
          end
        end
      end
    end

     

     

    • Полезно 1

    Аддон для ОП-2.09.2: Яндекс/Google/GitHub

    naxac.gif


    Подарки

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

    она почему то не горит а маргает

    Наверное, потому что аномалий на локации много?

    Одни ближе 10 метров, другие дальше. Одни статик включают, а другие выключают. По несколько раз за апдейт.

    • Согласен 1

    Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

    Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

    AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

    Спрошу тута: в мультиплеере ЗП, скриптовая подсистема не работает совсем, или работает, но ограниченно? К примеру рестриктор можно поставить и прописать ему логику? Или дверь, соответственно, то же с логикой?

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

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

    function treasure_take_item()
        local veroyatnos_podriva        = 0.2        --// вероятность подрыва по умолчанию
        local location                = level.name()
        local sila_podriva            = 0.3        --// сила подрыва по умолчанию
        local be_or_not_to_be                    --// не трогать
        if location ==  "l01_escape"        then veroyatnos_podriva = 0.1    sila_podriva = 0.4 end
        if location ==     "l02_garbage"         then veroyatnos_podriva = 0.15   sila_podriva = 0.4 end 
        if location ==     "l03_agroprom"         then veroyatnos_podriva = 0.15   sila_podriva = 0.4 end
        if location ==     "l03u_agr_underground"     then veroyatnos_podriva = 0.35   sila_podriva = 0.6 end
        if location ==     "l04_darkvalley"    then veroyatnos_podriva = 0.25   sila_podriva = 0.4 end
        if location ==     "l04u_LabX18"        then veroyatnos_podriva = 0.25   sila_podriva = 0.6 end
        if location ==     "05_bar"         then veroyatnos_podriva = 0.25   sila_podriva = 0.4 end
        if location ==     "l06_rostok"         then veroyatnos_podriva = 0.35   sila_podriva = 0.4 end
        if location ==     "l08_yantar"        then veroyatnos_podriva = 0.35   sila_podriva = 0.4 end
        if location ==     "l08u_brainlab"        then veroyatnos_podriva = 0.3    sila_podriva = 0.5 end
        if location ==     "l07_military"        then veroyatnos_podriva = 0.35   sila_podriva = 0.4 end
        if location ==     "l10_radar"         then veroyatnos_podriva    = 0.3    sila_podriva = 0.4 end
        if location ==     "l11_pripyat"         then veroyatnos_podriva = 0.35   sila_podriva = 0.4 end
        if location ==     "l12_stancia"        then veroyatnos_podriva = 0.1    sila_podriva = 0.4 end
        if location ==     "l12_stancia_2"     then veroyatnos_podriva = 0.1    sila_podriva = 0.4 end
        if location ==     "l12u_control_monolith"    then veroyatnos_podriva = 0.1    sila_podriva = 0.4 end
        if location ==     "l12u_sarcofag"        then veroyatnos_podriva = 0.1    sila_podriva = 0.4 end

    --// Снижаем шанс подрыва если есть кусачки
        if db.actor:object("kysazki") ~= nil then veroyatnos_podriva = veroyatnos_podriva - 0.1 end

        be_or_not_to_be     = math.random(0,100)
        if be_or_not_to_be < veroyatnos_podriva * 100 then
        local lv,gv
        local a         = vector()    
        local radius         = math.random(0,4)
        a             = db.actor:position()
        a.x             = a.x + radius
        a.z             = a.z + radius
        a.y             = a.y + math.random(0,1)
        lv             = db.actor:level_vertex_id()
        gv             = db.actor:game_vertex_id()
        local h2        = hit()
        h2.power        = sila_podriva    
        h2.direction        = vector():set(0,0,0)
        h2.type            = hit.explosion
        h2.impulse        = 1
        h2.draftsman        = db.actor
        db.actor:hit(h2)
        sound_object("weapons\\mine_1"):play_at_pos(db.actor,vector():set(0,0,0),0,sound_object.s2d)
        particles_object("explosions\\explosion_mine"):play_at_pos(vector():set(a.x,a.y,a.z),lv,gv,65535)
    end
    end

    Всем привет! Есть функция на заминирование тайников! Проблема в том что, минируються не только тайники но и РЮКЗАК ДЛЯ ЗАКЛАДКИ СВОЕГО ТАЙНИКА! Можно ли как то заблочить функцию что бы она работала только с уже имеющими тайниками а не которые делает гг сам! Заранее спасибо!


    Подарки

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

    @Colder 

    Смотреть, естественно, надо там, откуда эта ф-ция вызывается, а сама она только хит формирует.

    Ссылка на комментарий
    1 час назад, AndreySol сказал(а):

    там, откуда эта ф-ция вызывается

    Имхо это хит-саллбек. А как сделанно не ведаю. Если есть возможность в виде любой модификации - либо отдельно, дайте ссылку на рабочий файл.  К сожалению,  на данный момент я могу использовать для скачивания майл и ограниченно народ

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

    @AndreySol Вызываеться из treasure_manager

    function take_item_from_box(box, box_story_id)
        printf("!!! take item from box %s", tostring(box:is_inv_box_empty()))
        if box:is_inv_box_empty() == true then
        get_treasure_manager():treasure_empty(box, box_story_id)
    end
        axr_treasure.treasure_take_item()  --// сама функция
    end

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

    function take_item_from_box(box, box_story_id)
        printf("!!! take item from box %s", tostring(box:is_inv_box_empty()))
        if box:is_inv_box_empty() == true then
        get_treasure_manager():treasure_empty(box, box_story_id)

        local box_name = box:name()
        printf("-"..box_name)
        if (math.random() < 0.75) then
        axr_sounds.play_sound([[weapons\generic_checkout]])
        mine_box = box
        mine_timer = time_global()+3000
    end
    end
    end

    function actor_on_update()
        if (mine_timer) and (mine_timer < time_global()) then    
        local blow_particle = particles_object("explosions\\explosion_mine")
        blow_particle:play_at_pos(mine_box:position())

        local h = hit()
        h.type = hit.explosion
        h:bone("bip01_spine")
        h.power = 1
        h.impulse = 2
        h.direction = vector():set(0,0,1)
        h.draftsman = db.actor

        if db.actor:position():distance_to(mine_box:position()) < 3 then
        db.actor:hit(h)
    end
        mine_timer = nil
        mine_box = nil
    end
    end

    Сделал проще! Все это влежит в treasure_manager. Но эффект тот же. Закладываю свой тайник И ОН ТОЖЕ БАХАЕТ!

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

    Подарки

  • Ссылка на комментарий
    40 минут назад, Colder сказал(а):

    function take_item_from_box(box, box_story_id)
        printf("!!! take item from box %s", tostring(box:is_inv_box_empty()))
        if box:is_inv_box_empty() == true then
        get_treasure_manager():treasure_empty(box, box_story_id)

        local box_name = box:name()
        printf("-"..box_name)
        if (math.random() < 0.75) then
        axr_sounds.play_sound([[weapons\generic_checkout]])
        mine_box = box
        mine_timer = time_global()+3000
    end
    end
    end

    function actor_on_update()
        if (mine_timer) and (mine_timer < time_global()) then    
        local blow_particle = particles_object("explosions\\explosion_mine")
        blow_particle:play_at_pos(mine_box:position())

        local h = hit()
        h.type = hit.explosion
        h:bone("bip01_spine")
        h.power = 1
        h.impulse = 2
        h.direction = vector():set(0,0,1)
        h.draftsman = db.actor

        if db.actor:position():distance_to(mine_box:position()) < 3 then
        db.actor:hit(h)
    end
        mine_timer = nil
        mine_box = nil
    end
    end

    Жалкий кусок кода.

     

    Как нить Вашу конверсию плиз.:russian_ru:

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

    @Colder Я попробовал сказать выше. Нет возможности полноценно использовать интернет.

    Поделитесь тем, что Вы использовали в своих наработках.

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

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

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

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

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

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

    Войти

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

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

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

    AMK-Team.ru

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