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

Скриптование


Svoboда

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

Kolmogor, спасибо, но мне это уже говорили, а код написать никто не смог. Я открывал скрипт xStream'a, но он там так все запутал, что не распутать :wacko2:

Вопрос:

Как включить панику у непися не надолго?

Пробовал этими методами - ничего не происходит: set_custom_panic_threshold(float), set_default_panic_threshold()

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

Поделиться этим сообщением


Ссылка на сообщение

Министр, ок

____________________

Вопрос: у меня есть непись-таргет. Я пытаюсь сделать так:

        local panic=target_iter(target)
        get_console():execute(panic)

Если непись имеет какую-либо пушку, то выдает true, иначе false.

function target_iter(target)
            target:iterate_inventory(
            function(dummy,item)
                if string.find(item:section(),"wpn_") then
                    return true
                else
                return false
                end
            end
            , target)
end

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

Поделиться этим сообщением


Ссылка на сообщение

Shadows, если ты про кастом статик, то удалять так:

get_hud():RemoveCustomStatic("название_статика")

______________________

Есть 2 вопроса:

1) Можно ли сделать плавное появление кастом статика?

2) Включается ли какой-либо шейдерный коллбек при "Загрузке шейдеров"?

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

Поделиться этим сообщением


Ссылка на сообщение

Народ, помогите плз. Я хочу заспаунить турель из огсе, но она не спаунится, если место спауна онлайн. Спаун происходит через ф-цию [white]create_turret()[/white].

Вот так создаю турель:

turret_mgun.create_turret("turret_nato", "l06_rostok", vector():set(-84.12,0.9,140.35), "killer", "", 90, 90)

Текст скрипта turret_mgun.script

function bind(obj)
--    printf("turret_mgun.bind")
    local ini = obj:spawn_ini()
    if ini == nil or not ini:section_exist("logic") then
        abort("turret '%s' must have logic", obj:name())
    end
    obj:bind_object(turret_binder(obj, ini))
end

class "turret_binder" (object_binder)

function turret_binder:__init(obj, ini) super(obj)
    self.ini = ini
    self.initialized = false
    self.loaded = false
end

function turret_binder:reinit()
    object_binder.reinit(self)
    db.storage[self.object:id()] = {}
    self.st = db.storage[self.object:id()]
    self.heli = self.object:get_helicopter()
    self.object:set_callback(callback.helicopter_on_hit, self.on_hit, self)
end

function turret_binder:update(delta)
    object_binder.update(self, delta)
    if not self.initialized and db.actor ~= nil then
        xr_logic.initialize_obj(self.object, self.st, self.loaded, db.actor, modules.stype_heli)
        self.initialized = true
    end
    if self.st.active_section ~= nil then
        xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "update", delta)
    end
    self:check_health()
end

function turret_binder:net_spawn(data)
    if not object_binder.net_spawn(self, data) then
        return false
    end
    self.se_obj = alife():object(self.object:id())
    self.heli:SetfHealth(self.se_obj.health)
    self.st.alive = self.se_obj.health > 0.005
    db.add_turret(self.object)
    return true
end

function turret_binder:net_destroy()
    db.del_turret(self.object)
    object_binder.net_destroy(self)
end

function turret_binder:net_save_relevant()
    return true
end

function turret_binder:save(packet)
    object_binder.save(self, packet)
    xr_logic.save_obj(self.object, packet)
end

function turret_binder:load(packet)
    object_binder.load(self, packet)
    xr_logic.load_obj(self.object, packet)
end

function turret_binder:on_hit(power, impulse, hit_type, enemy_id)
    dbglog("hit: power=%f impulse=%f hit_type=%d enemy_id=%d health=%f",
            power, impulse, hit_type, enemy_id, self.heli:GetfHealth())
    self.se_obj.health = self.heli:GetfHealth()
    local enemy = level.object_by_id(enemy_id)
    if enemy ~= nil and self.st.active_section ~= nil then
        xr_logic.issue_event(self.object, self.st[self.st.active_scheme],
                "hit_callback", self.object, power, nil, enemy, nil)
    end
end

function turret_binder:check_health()
    if self.st.alive and self.heli:GetfHealth() <= 0.005 then
        explode_turret(self.object)
    end
end

function explode_turret(turret)
    local heli = turret:get_helicopter()
    heli:ClearEnemy()
    heli:Die()
    local se_obj = alife():object(turret:id())
    se_obj.health = 0
    db.storage[turret:id()].alive = false
    utils2.deferred_release(turret:id(), 5)
end


function is_friendly_turret(npc, turret, position)
    -- сначала выясним, турель ли это вообще.
    local k,v
    if turret == nil then
        -- ссылки на объект нет. что ж, бывает, попробуем
        -- определить по месту расположения.
        for k,v in pairs(db.turret) do
            local test_position = v:position()
            if test_position.x == position.x and
               test_position.z == position.z then
                turret = v
                break
            end
        end
        if turret == nil then
            return false
        end
    elseif (turret:section() ~= "turret_mgun") and (turret:section() ~= "turret_army") and (turret:section() ~= "turret_nato") then
        return false
    end
    local community = db.storage[turret:id()].community
    if community == nil then
        return false
    end
    if utils2.community_relation(community, npc) > -400 then
        return true
    end
    return false
end

function create_turret(turret_section_name, level_name, position, community, owner_gulag, search_dist, hunt_actor_prob, explode_dist, spawner)
    local packet1 = utils2.packet_pool_get()
    local packet2 = utils2.packet_pool_get()

    local level_vertex_id, game_vertex_id = utils2.get_top_graph_ids(level_name)
    local se_obj = alife():create(turret_section_name, position, level_vertex_id, game_vertex_id)
    if se_obj == nil then
        abort("can't create '%s' at (%f,%f,%f)")
    end

    -- лучше через table.concat()
    local custom_data = "[logic]\nactive = turret\n[turret]\n"
    if community ~= nil then
        custom_data = custom_data.."community = "..community.."\n"
    end
    if owner_gulag ~= nil then
        custom_data = custom_data.."owner_gulag = "..owner_gulag.."\n"
    end
    if hunt_actor_prob ~= nil then
        custom_data = custom_data.."hunt_actor_prob = "..tostring(hunt_actor_prob).."\n"
    else
        custom_data = custom_data.."hunt_actor_prob = 50\n"
    end
    if search_dist ~= nil then
        custom_data = custom_data.."search_dist = "..tostring(search_dist).."\n"
    else
        custom_data = custom_data.."search_dist = 90\n"
    end
    if explode_dist ~= nil then
        custom_data = custom_data.."explode_dist = "..tostring(explode_dist).."\n"
    else
        custom_data = custom_data.."explode_dist = 1\n"
    end
    if spawner ~= nil then
        custom_data = custom_data.."[spawner]\ncond = "..spawner.."\n"
    end

    se_obj:STATE_Write(packet1)
    local dead_space = packet2:w_tell()

    -- cse_alife_dynamic_object
    utils2.packet_copy(packet2, packet1, 18)
    packet1:r_stringZ()
    packet2:w_stringZ(custom_data)
    utils2.packet_copy(packet2, packet1, 8)
    -- cse_visual
    packet2:w_stringZ(packet1:r_stringZ())
    utils2.packet_copy(packet2, packet1, 1)
    -- cse_motion
    packet2:w_stringZ(packet1:r_stringZ())
    -- cse_ph_skeleton
    packet2:w_stringZ(packet1:r_stringZ())
    utils2.packet_copy(packet2, packet1, 3)
    -- cse_alife_helicopter
    packet2:w_stringZ("idle")
    packet2:w_stringZ("$no_sound")
    -- se_turret_mgun
    packet2:w_float(1.0)

    se_obj:STATE_Read(packet2, packet2:w_tell() - dead_space)

    utils2.packet_pool_put(packet1)
    utils2.packet_pool_put(packet2)
end

function create_dir_turret(turret_section_name, level_name, position, community, owner_gulag, search_dist, hunt_actor_prob, explode_dist, spawner)
    local packet1 = utils2.packet_pool_get()
    local packet2 = utils2.packet_pool_get()

    local level_vertex_id, game_vertex_id = utils2.get_top_graph_ids(level_name)
    local se_obj = alife():create(turret_section_name, position, level_vertex_id, game_vertex_id)

    if se_obj == nil then
        abort("can't create '%s' at (%f,%f,%f)")
    end
    -- лучше через table.concat()
    local custom_data = "[logic]\nactive = turret\n[turret]\n"
    if community ~= nil then
        custom_data = custom_data.."community = "..community.."\n"
    end
    if owner_gulag ~= nil then
        custom_data = custom_data.."owner_gulag = "..owner_gulag.."\n"
    end
    if hunt_actor_prob ~= nil then
        custom_data = custom_data.."hunt_actor_prob = "..tostring(hunt_actor_prob).."\n"
    else
        custom_data = custom_data.."hunt_actor_prob = 50\n"
    end
    if search_dist ~= nil then
        custom_data = custom_data.."search_dist = "..tostring(search_dist).."\n"
    else
        custom_data = custom_data.."search_dist = 90\n"
    end
    if explode_dist ~= nil then
        custom_data = custom_data.."explode_dist = "..tostring(explode_dist).."\n"
    else
        custom_data = custom_data.."explode_dist = 3\n"
    end
    if spawner ~= nil then
        custom_data = custom_data.."[spawner]\ncond = "..spawner.."\n"
    end

    se_obj:STATE_Write(packet1)

    local dead_space = packet2:w_tell()

    -- cse_alife_dynamic_object
    utils2.packet_copy(packet2, packet1, 18)
    packet1:r_stringZ()
    packet2:w_stringZ(custom_data)
    utils2.packet_copy(packet2, packet1, 8)
    -- cse_visual
    packet2:w_stringZ(packet1:r_stringZ())
    utils2.packet_copy(packet2, packet1, 1)
    -- cse_motion
    packet2:w_stringZ(packet1:r_stringZ())
    -- cse_ph_skeleton
    packet2:w_stringZ(packet1:r_stringZ())
    utils2.packet_copy(packet2, packet1, 3)
    -- cse_alife_helicopter
    packet2:w_stringZ("idle")
    packet2:w_stringZ("$no_sound")
    -- se_turret_mgun
    packet2:w_float(1.0)

    se_obj:STATE_Read(packet2, packet2:w_tell() - dead_space)

    utils2.packet_pool_put(packet1)
    utils2.packet_pool_put(packet2)

---------------direction
    se_obj.direction = vector():set(-1, 0, 0)
---------------
end

-----------------------------------------------------------------------

class "se_turret_mgun" (cse_alife_helicopter)

function se_turret_mgun:__init(section) super(section)
    self.spawner_present = false
    self.health = 1.0
    self.direction = vector():set(0, 0, 0)
end

function se_turret_mgun:can_switch_offline()
    return cse_alife_helicopter.can_switch_offline(self)
end

function se_turret_mgun:can_switch_online()
    if self.health <= 0.005 then
        return false
    end
    if self.spawner_present == nil then
        local ini = self:spawn_ini()
        self.spawner_present = ini:section_exist("spawner")
    end
    if self.spawner_present == true then
        return cse_alife_helicopter.can_switch_online(self)
    end
    return xr_spawner.check_spawn(self)
end    

function se_turret_mgun:STATE_Read(packet, size)
    cse_alife_helicopter.STATE_Read(self, packet, size)
    self.health = packet:r_float()
    self.direction = packet:r_vec3()
end

function se_turret_mgun:STATE_Write(packet)
    cse_alife_helicopter.STATE_Write(self, packet)
    packet:w_float(self.health)
    packet:w_vec3(self.direction)
end

 

 

Как мне вынести турель в онлайн?

Поделиться этим сообщением


Ссылка на сообщение
_Призрак_, а методов смены позиции вроде нет у турелей. Они на классе вертолета.

Поделиться этим сообщением


Ссылка на сообщение
_Призрак_, ну так на это ж требуется время, чтобы турель пролетела. + я хочу сделать динамический спавн, .т.е. в любой момент спавнить турель. А вертолеты летают по точкам в алл.спавне.

Поделиться этим сообщением


Ссылка на сообщение

Ну эту проблему возможно можно решить. Осталась одна: нужно найти метод скриптового назначения точки полета. Ибо через логику не получится сделать, потому что

вертолеты летают по точкам в алл.спавне

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

Поделиться этим сообщением


Ссылка на сообщение

TRAMP14,

if level.name()=="l08_yantar" then

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

Поделиться этим сообщением


Ссылка на сообщение

Приветствую всех. Можно ли убрать разаттачивание предметов при смерти непися? (убрал очистку инвентаря при смерти) Если можно, то как?

Поделиться этим сообщением


Ссылка на сообщение

Скажите плз, как получить забинденную команду? Т.е. по экшену получить забинденную кнопку.

Поделиться этим сообщением


Ссылка на сообщение
Charsi, спасибо. Жаль, что по другому нельзя. (а то парсинг user не очень подходит) Изменено пользователем SkyLoader

Поделиться этим сообщением


Ссылка на сообщение

Такие вопросы появились:

1. Как надо записать ф-ции в таблицу, чтобы можно было их потом вызвать?

Например:

...

[12] = func() spawn(),

...

2. Как можно проверить, что гг зашел в аномалию с определенной секцией? Есть ли у них биндер, чтобы проверить? Или надо его создавать?

 

Поделиться этим сообщением


Ссылка на сообщение

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

 

А, вот еще вспомнил: можно ли из стринговой строки, например, local t = "four_table", сделать такую строку, чтобы можно делать так: for k,v in pairs(t) do? Если да, то как?

 

Artos, я хочу сделать, чтобы функции в значениях выполнялись (например спавн, запуск звука, и тд.), а не что-то возвращали, т.е. если время = ключ, то делаем спавн.

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

Поделиться этим сообщением


Ссылка на сообщение
*Shoker*, а как же get_wpn_shared_str()? Если malandrinus ответит, как заставить этот метод работать, то все получится. Изменено пользователем SkyLoader

Поделиться этим сообщением


Ссылка на сообщение

Такой вопрос, давно его задавал: есть ли возможность изменять направление у физ. объектов через нет-пакеты? Обновленные пакеты позволяют это сделать, или движком не добавлено направление для класса физ. объектов?

Поделиться этим сообщением


Ссылка на сообщение

Такая проблема возникла:

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ...e.r. - life in fear\gamedata\scripts\xr_logic.script:453: attempt to call method 'id' (a nil value)

 

Тут ясно, что вылет происходит при установки схемы. Я сделал вывод в лог текста вызываемой функции printf(), изменив _g.script. В итоге я понял, что во всем виновата схема 'heli_hunter'. Вот более точный лог:

...
! Unknown command:  setup_gulag_and_logic_on_spawn_obj=gar_depo_bandit_st2,_strn_id=253
! Unknown command:  [smart_terrain_gar_depo_bandit]_gulag:_object_setup_online:_obj=gar_depo_bandit_st2_need_setup_logic=true_need_setup_restrictors=true
! Unknown command:  _bp:_enable_scripts:_object_'gar_depo_bandit_st2'_has_NO_external_configuration_file,_using_'misc\gulag_tasks.ltx'
! Unknown command:  DEBUG:_set_scheme:_scheme='heli_hunter'_section='<nil>'
! Unknown command:  DEBUG:_add_to_binder:_scheme='heli_hunter'

FATAL ERROR

[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...e.r. - life in fear\gamedata\scripts\xr_logic.script:453: attempt to call method 'id' (a nil value)

 

 

Но тут не ясно. Схема у меня не изменена. В xr_logic, modules и xr_motivator никаких изменений по поводу этой схемы нет. Добавлены несколько АИ-схем, но в них тоже нет упоминания о 'heli_hunter' (может бы они вызвали какие-то коллизии?). Теперь сижу, гадаю. Отключать схему не хотелось бы, ведь она оригинальная.

Поделиться этим сообщением


Ссылка на сообщение

Artos, ой, извиняюсь, забыл код строки вылета привести :)

 

1. id выводился нормально за пределами ф-ции.

 

В итоге оказалось, что какая-то новая аи-схема портит все. Т.к. я предусмотрел возможные ошибки и перенес все схемы в отдельный файл. Разом отключил все новые схемы и вылет пропал :)

 

Кстати, давно еще писал про зависание биндера, видимо из-за этой же проблемы. Биндер больше не зависает. Теперь буду искать, в какой схеме такой ужас происходит. Спасибо за ответ.

 

P.S. Видимо все-таки я такой невезучий, у которого случаются баги и вылеты, которых ни у кого не было.

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

Поделиться этим сообщением


Ссылка на сообщение

Кто-нибудь использовал для неписей или монстров функцию action()? Рабочая ли она? В ЧН она использовалась, но финальном ТЧ вроде нет.

 

Ты про какую конкретно функцию говоришь? Функция action есть в файле _g.scritp, есть метод класса planner_action, унаследованного от класса action_planner; есть в классах game_object и object.

ColR_iT

 

Добавлено через 53 мин.:

Пример: action(trader, anim("vstuplenie"), cond(cond.anim_end))

 

Эта функция из файла _g.script.

ColR_iT

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

Поделиться этим сообщением


Ссылка на сообщение

malandrinus, к сожалению, твой способ для сталкеров и мутантов не подойдет, чтобы скрывать кости. При скрытии кости, матрицы полигонов кости будут scale в 0, т.е. все координаты полигонов кости будут иметь нулевое значение, поэтому кажется, что кость пропала, а на самом деле она просто смялась в ничего. Для оружия это срабатывает потому что кости глушителей, прицелов и гранатометов являются отдельными мешами и не соединены с другими мешами. В случае с моделью сталкера кости имеют общий меш, и при скрытии кости, между двумя костями (фэйсы) будут тянуться в нулевые координаты, т.е. между ног будет тянуться вниз такая полоска от парента скрываемой кости. Для реализации этого я могу посоветовать создать новую функцию (вместо set_bone_visible) и после того, как полигоны окажутся нулевых координатах, взять позицию из матрицы парента этой кости и назначить позиции матрицы самой кости. Тогда все выглядит нормально, и дырок никаких не будет.


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

Изменено пользователем SkyLoader
  • Не нравится 1

Поделиться этим сообщением


Ссылка на сообщение

malandrinus, я уже пробовал так делать. Если будет мягкая привязка у модели, то все равно будет стяжка фейсов к нулевым координатам. Если же грубая привязка, то будет видна щель между костями. Я много как пробовал, но выход нашел только этот. Хотя он и не до конца хорош, скорее как прототип.

 

LL_SetBoneVisible, к сожалению, действует только на визуальную составляющую, на коллизийный бокс никакого влияния не оказывает.

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   1 пользователь

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