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

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

@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

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