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

[SoC] Ковыряемся в файлах


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

@юлий мунин, Привет в логе конкретно написано ошибка в bind_stalker.script:192 строка 

скинь свой скрипт и bind_stalker.script будем посмотреть

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

@ted.80

Вот bind_stalker.script:


 

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

 

function init    (obj)
    xr_motivator.AddToMotivator(obj)
end

function actor_init    (npc)
    npc:bind_object(actor_binder(npc))
end

local game_difficulty_by_num = {
    [0] = "gd_novice",
    [1] = "gd_stalker",
    [2] = "gd_veteran",
    [3] = "gd_master"
    }

lasthealth  = 0
lasttime    = 0
post_process = 0
local weapon_hide = false
----------------------------------------------------------------------------------------------------------------------
class "actor_binder" (object_binder)
----------------------------------------------------------------------------------------------------------------------
function actor_binder:__init (obj) super(obj)
    self.bCheckStart = false
    self.weather_manager = level_weathers.WeatherManager()
    self.actor_detector = xr_detector.actor_detector()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_spawn(data)
    printf("actor net spawn")        

    level.show_indicators()

    self.bCheckStart = true
    self.weapon_hide = false -- спрятано или нет оружие при разговоре.
    weapon_hide = false -- устанавливаем глобальный дефолтовый флаг.

    if object_binder.net_spawn(self,data) == false then
        return false
    end

    db.add_actor(self.object)
    
    if self.st.disable_input_time == nil then
        level.enable_input()
    end

    self.weather_manager:reset()
--    game_stats.initialize ()

    if(actor_stats.add_to_ranking~=nil)then
        actor_stats.add_to_ranking(self.object:id())
    end

    --' Загружаем настройки дропа
    death_manager.init_drop_settings()

    return true
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_destroy()
    if(actor_stats.remove_from_ranking~=nil)then
        actor_stats.remove_from_ranking(self.object:id())
    end
--    game_stats.shutdown ()
    db.del_actor(self.object)

    sr_light.clean_up ()

    self.object:set_callback(callback.inventory_info, nil)
    self.object:set_callback(callback.article_info, nil)
    self.object:set_callback(callback.on_item_take, nil)
    self.object:set_callback(callback.on_item_drop, nil)
    self.object:set_callback(callback.use_object, nil)
    --self.object:set_callback(callback.actor_sleep, nil)
    self.object:set_callback(callback.task_state, nil)
    self.object:set_callback(callback.level_border_enter, nil)
    self.object:set_callback(callback.level_border_exit, nil)
    self.object:set_callback(callback.take_item_from_box, nil)

    if sr_psy_antenna.psy_antenna then
        sr_psy_antenna.psy_antenna:destroy()
        sr_psy_antenna.psy_antenna = false
    end

    xr_sound.stop_all_sound_object()

    object_binder.net_destroy(self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:reinit()
    object_binder.reinit(self)
    
    local npc_id = self.object:id()

    db.storage[npc_id] = { }

    self.st = db.storage[npc_id]
    self.st.pstor = nil

    self.next_restrictors_update_time = -10000

    self.object:set_callback(callback.inventory_info, self.info_callback, self)
    self.object:set_callback(callback.article_info, self.article_callback, self)
    self.object:set_callback(callback.on_item_take, self.on_item_take, self)
    self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
      self.object:set_callback(callback.use_object, self.use_object, self)
    self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
    --self.object:set_callback(callback.actor_sleep, self.sleep_callback, self)
    self.object:set_callback(callback.task_state, self.task_callback, self)
    --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self)
    self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)
    self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)
    self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:take_item_from_box(box, item)
    local story_id = box:story_id()
    if story_id == nil then
        return
    end

    treasure_manager.take_item_from_box(box, story_id)
--[[    
    local respawner = se_respawn.get_respawner_by_parent(story_id)
    if respawner == nil then
        return
    end
    
    --' Необходимо уменьшить счетчик в респавнере
    respawner:remove_spawned(item:id())

    local smart_terrain = db.strn_by_respawn[respawner:name()]
    if smart_terrain == nil then
        return
    end

    local npc = smart_terrain.gulag:get_nearest_online_obj(db.actor:position())
    if npc ~= nil then
        xr_sound.set_sound_play(npc, "reac_box")
        xr_gulag.setGulagEnemy(smart_terrain:name() , db.actor)        
    end
]]
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_enter(npc, info_id)
    self.actor_detector:actor_enter()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_exit(npc, info_id)
    self.actor_detector:actor_exit()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:info_callback(npc, info_id)
    printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
    --' Сюжет
    level_tasks.proceed(self.object)
    -- Отметки на карте
    level_tasks.process_info_portion(info_id)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_trade (item, sell_bye, money)
    if sell_bye == true then
       game_stats.money_trade_update (money)
    else       
       game_stats.money_trade_update (-money) 
    end   
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:article_callback(npc, group, name)
    --printf("article_callback [%s][%s]", group, name)
    if device().precache_frame >1 then return end
    
    if group == "Diary" then
        news_manager.send_encyclopedy("diary", group)
    else
        news_manager.send_encyclopedy("encyclopedy", group)
    end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_take (obj)
    level_tasks.proceed(self.object)
    --game_stats.update_take_item (obj, self.object)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_drop (obj)
    level_tasks.proceed(self.object)
    --game_stats.update_drop_item (obj, self.object)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:use_object (obj)
sound.use_snd (obj)
end
-----------------------------------------------------------------------------------------------------------------------

function actor_binder:task_callback(_task, _objective, _state)
    task_manager.task_callback(_task:get_id(), _objective:get_idx(), _state)
    if _objective:get_idx() == 0 then
        if _state == task.fail then
            news_manager.send_task(db.actor, "fail", _task, _objective)
        elseif _state == task.completed then
            task_manager.reward_by_task(_task)
            news_manager.send_task(db.actor, "complete", _task, _objective)
        else
            news_manager.send_task(db.actor, "new", _task, _objective)
        end
    else
        if _task:get_objective(0):get_state() == task.in_progress then
            news_manager.send_task(db.actor, "update", _task, _objective)
        end
    end
end

----------------------------------------------------------------------------------------------------------------------
function actor_binder:map_location_added_callback(spot_type_str, object_id)
    if (false==app_ready()) or (device().precache_frame>1) then return end
    --'news_manager.send_task(db.actor, "new")
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:update(delta)
    object_binder.update(self, delta)

    -- DEBUG slowdown
--    slowdown.update()

    local time = time_global()
    
    game_stats.update (delta, self.object)

    -- апдейт погоды
    self.weather_manager:update()
    
    -- апдейт схемы детектора
    self.actor_detector:update()

    -- апдейт звуковой схемы актера
    xr_sound.update_actor()
    
    --' Проверка потери жизни
--[[
    if self.object.health - lasthealth > 0.001 or
       self.object.health - lasthealth < -0.001 then
        printf("%f | %f", self.object.health, self.object.health - lasthealth, game.time() - lasttime)
        lasthealth = self.object.health
        lasttime = game.time()
    end
]]    
    -- Обновление отключения ввода с клавиатуры.
    if self.st.disable_input_time ~= nil and
       game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle 
    then
        level.enable_input()
        self.st.disable_input_time = nil
    end
    -- Обновление сна с переносом чувака в указанную позицию
    if self.st.sleep_relocate_time ~= nil and
       game.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idle 
    then
        self.object:set_actor_position(self.st.sleep_relocate_point)
        local dir = self.st.sleep_relocate_point:sub(self.st.sleep_relocate_look)
        self.object:set_actor_direction(dir:getH())
        self.st.sleep_relocate_time = nil
    end

    -- Апдейт прятание оружия игрока во время диалога
    if weapon_hide == true or self.object:is_talking() then
        if self.weapon_hide == false then
            self.object:hide_weapon()
            self.weapon_hide = true
        end
    else
        if self.weapon_hide == true then
            self.object:restore_weapon()
            self.weapon_hide = false
        end
    end    

    -- обновление рестрикторов, которые под логикой, срабатывает через интервалы времени
    if self.next_restrictors_update_time < time then
        bind_restrictor.actor_update(delta)

        self.next_restrictors_update_time = time + 200

        task_manager.actor_update()
    end

    -- обновление постпроцессов
    if post_process ~= 0 then
        if post_process:update () == true then
           post_process = 0
        end
    end

    -- обновление пси-антенны
    if sr_psy_antenna.psy_antenna then
        sr_psy_antenna.psy_antenna:update(delta)
    end

    --' Вывод сообщения о большой радиации
    if self.object.radiation >= 0.7 then
        local hud = get_hud()
        local custom_static = hud:GetCustomStatic("cs_radiation_danger")
        if custom_static == nil then
            hud:AddCustomStatic("cs_radiation_danger", true)
            hud:GetCustomStatic("cs_radiation_danger"):wnd():SetTextST("st_radiation_danger")
        end
    else
        local hud = get_hud()
        local custom_static = hud:GetCustomStatic("cs_radiation_danger")
        if custom_static ~= nil then
            hud:RemoveCustomStatic("cs_radiation_danger")
        end
    end

     if self.bCheckStart then
        printf("SET DEFAULT INFOS")        

        if not has_alife_info("storyline_actor_start") and
           (level.name() == "l01_escape")
        then
            self.object:give_info_portion("storyline_actor_start")
            _G.g_start_avi = true
            printf("*AVI* RUN START AVI")            
        end

--        if not has_alife_info("encyclopedy") then
--            self.object:give_info_portion("encyclopedy")
--        end

        if not has_alife_info("global_dialogs") then
            self.object:give_info_portion("global_dialogs")
        end

        if not has_alife_info("level_changer_icons") then
            self.object:give_info_portion("level_changer_icons")
        end

        level_tasks.add_lchanger_location()

        self.bCheckStart = false        
    end        
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:save(packet)
    
    local save_treasure_manager = true
    
    printf("actor_binder:save(): self.object:name()='%s'", self.object:name())
    object_binder.save(self, packet)

    --' Сохраняем уровень сложности
    if save_treasure_manager == true then
        packet:w_u8(level.get_game_difficulty() + 128)
    else
        packet:w_u8(level.get_game_difficulty())
    end


    --' Сохраняем данные об отключенном вводе
    if self.st.disable_input_time == nil then
        packet:w_bool(false)
    else
        packer:w_bool(true)
        utils.w_CTime(packet, self.st.disable_input_time)
    end

    xr_logic.pstor_save_all(self.object, packet)
    self.weather_manager:save(packet)

    sr_psy_antenna.save( packet )
    
    if save_treasure_manager == true then
        treasure_manager.save(packet)      
    end                                  

    task_manager.save(packet)
    self.actor_detector:save(packet)    
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:load(reader)
    printf("actor_binder:load(): self.object:name()='%s'", self.object:name())
    object_binder.load(self, reader)
    printf("actor_binder:object_binder.load(): self.object:name()='%s'", self.object:name())

    --' Загружаем уровень сложности
    local game_difficulty = reader:r_u8()
    
    local load_treasure_manager = false      
    if game_difficulty >= 128 then           
        game_difficulty = game_difficulty - 128
        load_treasure_manager = true           
    end                                      

    
    get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])

    if reader:r_eof() then
        abort("SAVE FILE IS CORRUPT")
    end

    local stored_input_time = reader:r_u8()
    if stored_input_time == true then
        self.st.disable_input_time = utils.r_CTime(reader)
    end

    xr_logic.pstor_load_all(self.object, reader)
    self.weather_manager:load(reader)

    sr_psy_antenna.load(reader)
    
    if load_treasure_manager == true then
        treasure_manager.load(reader)      
    end                                  

    
    task_manager.load(reader)
    self.actor_detector:load(reader)    
end
----------------------------------------------------------------------------------------------------------------------

--старт префетча звуков
--if string.find(command_line(), "-noprefetch") == nil then
--    sound_prefetch.prefetch_sounds()
--end


-- Weapon functions
function hide_weapon()
    weapon_hide = true
end
function restore_weapon()
    weapon_hide = false
end

// this is test for section iteration
/**
local function test_section_iteration(file_name, section_name)
    printf            ("file    : %s",file_name)
    printf            ("section : %s",section_name)
    
    local            file = ini_file(file_name)
    local            n = file:line_count(section_name)
    printf            ("lines   : %d",n)
    
    local            id, value = "", "", result
    for i=0,n-1 do
        result, id, value    = file:r_line(section_name,i,"","")
        printf        ("line %d : %s = %s",i,id,value)
    end
end

test_section_iteration("system.ltx","space_restrictor")
/**/

 

А вот sound.script

 

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

function use_snd(obj)
 
local obj_sect = obj:section()
 
local snd
 
if obj_sect == 'synth' then snd = [[mus\sinth]]
 
elseif obj_sect == 'rock_guitar' then snd = [[mus\git]]
 
elseif obj_sect == 'tamal' then snd = [[mus\new]]
  
end
 
if snd then
 
local snd_obj = xr_sound.get_safe_sound_object(snd)
 
snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
 
end
 
end

   

 

 

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

@юлий мунин, замени код в sound 

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

function use_snd(obj)
local obj_sect = obj:section()
local snd
	if obj_sect == "synth" then snd = [[mus\sinth]]
	elseif obj_sect == "rock_guitar" then snd = [[mus\git]]
	elseif obj_sect == "tamal" then snd = [[mus\new]]
	end

	if snd then
		local snd_obj = xr_sound.get_safe_sound_object(snd)
		snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
	end
end

 

когда сравниваешь секцию     if obj_sect == "synth"   саму секцию пиши через "двойной апостроф"  чтобы игра понимала что это строка

 

 

эту функцию перенеси в низ файла перед  "-- Weapon functions"

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

----------------------------------------------------------------------------------------------------------------------
function actor_binder:use_object(obj)
	if sound then
		sound.use_snd(obj)
	else
		db.actor:give_game_news("В файле Sound ошибка или он отсутствует!!!", "ui\\ui_iconsTotal", Frect():set(913,235,83,47), 0, 30000)
	end
end
----------------------------------------------------------------------------------------------------------------------

 

 

И пробуй  :hm:

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

@юлий мунин вот тебе рабочая функция

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

-- Звуки юза шамовки, медикоментов, напитков, by Nazgool, гопыч
function use_snd(obj)
local obj_sect = obj:section()
local snd
-- Медикоменты
if obj_sect == 'medkit' then snd = [[interface\inv_medkit]]
elseif obj_sect == 'medkit_army' then snd = [[interface\inv_medkit]]
elseif obj_sect == 'medkit_scientic' then snd = [[interface\inv_medkit]]
elseif obj_sect == 'bandage' then snd = [[interface\inv_bandage]]
elseif obj_sect == 'antirad' then snd = [[interface\inv_pills]]
-- Еда
elseif obj_sect == 'bread' then snd = [[interface\inv_food]]
elseif obj_sect == 'kolbasa' then snd = [[interface\inv_food]]
elseif obj_sect == 'conserva' then snd = [[interface\inv_food]]
-- Напитки
elseif obj_sect == 'vodka' then snd = [[interface\inv_vodka]]
elseif obj_sect == 'energy_drink' then snd = [[interface\inv_softdrink]]

-- elseif obj_sect == 'ваш предмет' then snd = [[Путь_до_звука_относительно_папки_sounds]]
end
if snd then
local snd_obj = xr_sound.get_safe_sound_object(snd)
snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
end
end

Для озвучки юза я её использую, проблем ни каких, измени только итемы и пути к звукам.

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

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

@ted.80,  Сделал всё точно так же, как вы и сказали. Апострофами секции отметил, строку перенёс. Теперь игра воет точно так же, но только другая строка.

Lua error...bind_stalker.script:426: attempt to call field 'use_snd' (a nil value)

Ссылка на комментарий
13 минут назад, юлий мунин сказал:

bind_stalker.script:426

что в этой строке?

погоди, а звуки вообще лежат по нужному пути?

и откуда звуки? 

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

@ted.80, в строке 426 написано: sound.use_snd (obj)

Звуки лежат как положено в директории игры \gamedata\sounds\mus\(звук.ogg)

Звуки свои, отконвертированные в sdk.

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

@юлий мунин, синтаксическая ошибка в коде.

 

Братья - сталкеры, тут проблема возникла, пытаюсь добавить болт на худ на статик патронов, он отображается но почему то постоянно и под статиком патронов а не на нём, как прочие иконки.

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

local bolt = db.actor:active_slot(5)
function bolt_na_hud()
    if bolt then
        get_hud():AddCustomStatic("hud_bolt", true)
    else
        get_hud():RemoveCustomStatic("hud_bolt")
    end
end

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

  <hud_bolt x="921" y="711" width="38" height="38">
    <texture x="850" y="950" width="50" height="50">ui\ui_icon_equipment</texture>
  </hud_bolt>

Блин, что я упускаю?

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

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

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

@ted.80, ого. Представляете: заработало! Возможно, игра сначала не понимала, что от неё хотят, думала, что sound-не имя, а действие. Буду знать теперь. 

@ted.80, а вы случайно не знаете, как присвоить несколько звуков одному предмету, например, рации? Надо отдельный фаил создавать?

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

Есть мод Тайные Тропы 2 на движке OGSR Engine x64. В ём есть проблема - в подземке Агропрома в одном месте идет страшная просадка фпс:

06962670562ce995f49cea78110d2dc4b0336937

Измененные файлы уровня:

level.gct
level.graph
level.spawn
level.gct.raw
level_sectors.ai

 

Я так понимаю, что просадка происходит из-за света. НО совершенно не понимаю, куда копать.....

8a3103782eff1611b8c6a8dcc9edab32b0336937

AMD Athlon II X2 250, NVIDIA GTS 450, RAM 8.0 GB, WIN 7/64  правки Золотой Шар

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

как присвоить несколько звуков одному предмету, например, рации?

 

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


local Radio = {
	[[Radio_1]],
	[[Radio_2]],
	[[Radio_3]],
	[[Radio_4]]
}

if obj_sect == "radio" then snd = Radio[math.random(#Radio)]

 

 

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

@юлий мунин, Замени код в своём скрипте

 

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


local Radio = {
	[[characters_voice\scenario\yantar\ghost_pda]],
	[[characters_voice\scenario\yantar\vasiliev_pda]],
	[[characters_voice\scenario\yantar\professor_to_actor_pda_4]],
	[[characters_voice\scenario\yantar\professor_to_actor_pda_2]],
	[[characters_voice\scenario\yantar\professor_to_actor_pda_3]],
	[[characters_voice\scenario\yantar\professor_to_actor_pda_5]]
}

function use_snd(obj)
local obj_sect = obj:section()
local snd
	if obj_sect == "synth" then snd = [[mus\sinth]]
	elseif obj_sect == "rock_guitar" then snd = [[mus\git]]
	elseif obj_sect == "tamal" then snd = [[mus\new]]
	elseif obj_sect == "СЕКЦИЯ_РАЦИИ" then snd = Radio[math.random(#Radio)]
	end

	if snd then
		local snd_obj = xr_sound.get_safe_sound_object(snd)
		snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
	end
end

 

 

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

Господа, кто мне скажет почему в ванильном аутфит лтх иммунитеты у костюмов прописаны на 0.0001, при этом все костюмы изнашиваются если этот файл не закидывать в папку с игрой. Если закинуть тогда понятно износ пропадает. Почему так происходит и как это всё работает - не могу понять. И ещё, кто нибудь знает каким образом можно у Петрухи убрать бинокль из продажи? У сталкера на свалке на кладбище такой проблемы не наблюдается.

А, и ещё, никто не знает что ли как научить неписей пользоваться автоматическими пистолетами и винтарями? Недавно спрашивал , никто не ответил.

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

Здравствуйте! Будьте добры, подскажите, где можно почитать о формате файла fsgame.ltx - за что отвечает каждый из параметров в строке. А то везде только разрозненную информацию нахожу. 

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

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

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

Камрады, просветите: после сна ГГ не сразу резкость наводит, скажем так, шатает его, короче (типа, он поднимается с кровати). Это в движке прописано, или где-то в конфиге?

Сталкер - наше всё!

Ссылка на комментарий
2 минуты назад, AndrewMor сказал:

после сна ГГ не сразу резкость наводит

Ну в ванили сна нет, значит ты в мод играешь, вопрос - какой?

  • Согласен 1
Ссылка на комментарий
25 минут назад, ted.80 сказал:

Ну в ванили сна нет

А как же обмороки ГГ по сюжету? Я полагаю, это имелось в виду?

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

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

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

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

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

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

Войти

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

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

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