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

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

Напшите пожалуйста пример как снять и потом записать характеристики оружия через нет пакет. Т.е. сначала снять хар-ки какого либо оружия затем через некоторое время записать эти хар-ки в другое оружие (модификацию). Хочу сделать чтобы модишикации оружия постепенно превращались в само оружие но где найти полный список хар-к нетпакета для оружия незнаю :(

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

Всем привет. Объясните пожалуйста по пунктам, как заставить НПС встать на путь (который я задал в way) и переходить между локациями по нему? (Если такое возможно).

 

Суть: Спавнится отряд на Янтаре, у всех такая логика

 

[logic]

active = otrad_kamp@perviy_put

 

[otrad_kamp@perviy_put]

home_min_radius = 0

home_max_radius = 0

on_info = {+doyti_do_rostka} otrad_kamp@vtoroy_put

 

[otrad_kamp@vtoroy_put]

path_home = putdva_walk

meet = no_meet

home_min_radius = 0

home_max_radius = 0

on_info = {+tocka_odin_done} remark@postovoy

 

[remark@postovoy]

anim = guard

target = actor

meet = meet

 

 

По пути putdva_walk они должны идти с Янтаря на Росток. Но они почему то не встают на путь, и идут куда попало. или же все дело в том, что они не могут перейти через локации? Объясните пожалуйста.

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

Ребята, помогите написать сткрипт. В функции мне нужно запустить таймер, а через 10 секунд его остановить. И еще нужно, чтоб во время этого запущенного таймера нельзя было использовать продукты питания. Сталкер ЗП.

Жду ли я Сталкер 2? Хм...
Ссылка на комментарий

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

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

speczadanie

function d()

local cnt = db.actor:object_count()

local d = 0

for i=0, cnt-1 do

local Item = db.actor:object(i)

if string.find(Item:section(), "af_") then

d = d + 1

end

end

return d

end

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

TRAMP14, посмотри АМКшные ф-ии для чтения/записи пакетов, в частности get_weapon_data и set_weapon_data.

 

PavelSnork, непонятно, у тебя сам таймер есть или нет?

 

speczadanie,

function rtn_af_cnt()
    local count = 0
    
    db.actor:iterate_inventory(function (dummy, item)
        if string.find(item:section(), "af_") then
            count = count + 1
        end
    end, db.actor)
    
    return count
end

А вообще такие вещи давно пора бы знать, тем более поиск по форуму никто не отменял.

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

Народ, помогите плз. Я хочу заспаунить турель из огсе, но она не спаунится, если место спауна онлайн. Спаун происходит через ф-цию [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

 

 

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

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

кто нибудь.Разьясните понятия в сексиях респавнера файла all.spawn.Просто сделал респавнер,а у меня заместо троих основных появилось 12 человек.Причем сразу.

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

SkyLoader

У меня появилась дурацкая, но идея. А если заспавнить тураль под карту, а потом, когда нужно при помощи логики хели_мув переместить ее на нужное место? Турель ты же говоришь сделана на основе вертолета, а вертушки на агропроме так и сделаны - заспавнены под локацией и когда нужно, они вылетают

Freedom

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

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

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ...w of chernobyl\gamedata\scripts\smart_terrain.script:1137: attempt to index local 'obj' (a nil value)

Я в смарт террейны не лазил только бинд сталкер и мой скрипт спавна. Как исправить?

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

Ну так ты установи скорость полета турели 99999. Да и можно в логике поставить условие на инфопоршень или на выполенение функции

Freedom

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

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

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

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

Ссылка на комментарий
PavelSnork, непонятно, у тебя сам таймер есть или нет?

У меня таймера нету. Ответте, пожалуйста, на мой предыдущий пост.

Жду ли я Сталкер 2? Хм...
Ссылка на комментарий

Есть скрипт. Игра нещадно вылетает при попытке его чтения с логом типа "нет такого файла", то есть, как я понял, тут ошибка синтаксиса... Сам найти не могу. В чём проблема?

 

local nano = 0
local outfit = db.actor:item_in_slot(6)

function update()
    if not outfit then
        nano=0
    end
    if outfit and (outfit="novice_outfit" or outfit="bandit_outfit" or outfit="killer_blue_exoskeleton" or outfit="svoboda_exoskeleton" or outfit="monolit_exoskeleton" or outfit="broken_exoskeleton" or outfit="monolit_scientific_outfit" or outfit="bandit_master_outfit" or outfit="soldier_outfit" or outfit="bandit_veteran_outfit") then
        nano=0
    end
    if outfit and (outfit="killer_outfit" or outfit="monolit_outfit" or outfit="svoboda_light_outfit" or outfit="dolg_outfit" or outfit="dolg_black_exoskeleton" or outfit="merc_scientific_outfit" or outfit="neytral_exo_antigas_outfit" or outfit="military_outfit" or outfit="military_stalker_commander_outfit") then
        nano=1
    end
    if outfit and (outfit="specops_outfit" or outfit="stalker_outfit" or outfit="exo_outfit" or outfit="svoboda_heavy_outfit" or outfit="dolg_scientific_outfit" or outfit="freedom_scientific_outfit" or outfit="vstalker_outfit") then
        nano=3
    end
    if outfit and (outfit="scientific_outfit" or outfit="ecolog_outfit" or outfit="protection_outfit") then
        nano=5
    end
    update_container()
end

function update_af_num()
    local cnt = db.actor:object_count()
    local d = 0
        for i=0, cnt-1 do
        local Item = db.actor:object(i)
            if string.find(Item:section(), "af_") then
                d = d + 1
            end
        end
    return d
end

function update_container()
local af_num = update_af_num()
    local psy_hit = hit()
    psy_hit.direction = vector():set(0,0,0)
    psy_hit.impulse = 0
    psy_hit.draftsman = db.actor

    if nano < af_num then
        psy_hit.power = 0.0005
        psy_hit.type = hit.radiation
        db.actor:hit(psy_hit)
    end
    if nano >= af_num then
        psy_hit.power = 0
        psy_hit.type = hit.radiation
        db.actor:hit(psy_hit)
    end
end

 

Ссылка на комментарий
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.-1-1\gamedata\scripts\my_updating.script:21: attempt to index global 'my_container' (a nil value)

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

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

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

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

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

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

Войти

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

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

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