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

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

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

@mole venomous Спасибо большое! 

Вот только не пойму, то нормально все, то 2 трека играют одновременно, название у каждого разное, проверил все, косяков нет

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

Доброго времени суток!
По идее это должна быть избитая тема, но два дня гуглежа и экспериментов не дали ответа. Как можно "оживить" уникального NPC в стоковом STALKER SoC? Конкретно интересует Петренко из Долга на локации Бар.

Вообще почему я этим озаботился. Вступил в Свободу, используя стандартную в игре оставшуюся для этого возможность (выполнение квестов на Военных Складах в нужной последовательности). Дальше столкнулся с тем, что учёные стали агрессивными для ГГ. Поправил "\gamedata\config\creatures\game_relations.ltx" (между freedom - ecolog, ecolog - freedom и ecolog - act_fre, actor_freedom - ecolog, хотя саму freedom наверное трогать лишнее). Далее выяснил, что возможность получить СВДм-2 на среднем этапе игры есть только у Петренко и после выполнения квеста на Бульдог. А я же вступив в Свободу каждый раз продирался к Бармену с боем... И Петренко видимо в один из моих прорывов вылез на меня. То есть его труп уже давно лежит, и даже к нему в инвентарь заспавнить уже живому СВДм-2, чтобы отыграть, что типа с боем заполучил СВДм-2 (а такое, кстати, вроде возможно и так из-за бага, при котором он меняет старое вооружение на СВДм-2 после выполнения квеста на Бульдог, только не имеет смысла, так как тогда уже проще купить, она в продажу поступает).

 

Нашёл конфиг Петренко в "\gamedata\config\gameplay\character_desc_bar.xml", но там у него какой-то странный синтаксис. По крайней мере в Sublime Text Editor 3 подсветка такая, будто весь блок закомментирован (видимо из-за не валидного использования символов "----" внутри комментария:

 

Скрытый текст
<!---------------------------DOLG PETRENKO---------------------->

 

Сам блок описания Петренко:

 

Скрытый текст
	<specific_character id="bar_dolg_petrenko" team_default = "1">
		<name>bar_petrenko_name</name>
		<icon>ui_npc_u_stalker_do_balon_3</icon>
		<map_icon x="0" y="0"></map_icon>
		<bio>bar_petrenko_bio</bio>

		<class>bar_dolg_petrenko</class>
		<community>dolg</community> <terrain_sect>stalker_dolg_terrain</terrain_sect>
		<money min="100000" max="110000" infinitive="1"></money>
		
		<rank>459</rank>
		<reputation>0</reputation>
 
		<visual>actors\dolg\stalker_do_balon_3</visual>
		<snd_config>characters_voice\human_01\dolg\</snd_config>
		<crouch_type>0</crouch_type>

		<supplies>
			[spawn] \n
			wpn_walther \n
			ammo_9x19_fmj \n			
			wpn_groza \n
			ammo_9x39_ap \n	
#include "gameplay\character_food.xml" \n
#include "gameplay\character_drugs.xml"
		</supplies>
		
#include "gameplay\character_criticals_6.xml"
		
		<start_dialog>bar_dolg_petrenko_start</start_dialog>
		
		<actor_dialog>tm_petrenko_dialog</actor_dialog>
		<actor_dialog>tm_petrenko_reward</actor_dialog>

</specific_character>	

 

 

Я ему там прописать хочу в блок <supplies> wpn_svd и ammo_7.62x54_7h1.

Тут я вижу, что вроде как id уникального персонажа "bar_dolg_petrenko". Он же фигурирует в распакованном all.spawn. Но попытка заспавнить его функцией

 

Скрытый текст
function main_menu:stalker_bar_dolg_petrenko_spawn()

	local obj
	local a = vector()
	local dir = db.actor:direction()

	a.x = 60.0173
	a.y = -0.0025
	a.z = 136.888

	obj = alife():create("bar_dolg_petrenko", a, 27740, 1240)

	display_text_message = "Spawn bar_dolg_petrenko"

	news_manager.send_tip(db.actor, display_text_message, nil, nil, 30000)

end

 

 

приводит к ошибке

 

Скрытый текст
Expression    : fatal error
Function      : CInifile::r_section
File          : E:\stalker\sources\trunk\xrCore\Xr_ini.cpp
Line          : 342
Description   : <no expression>
Arguments     : Can't open section 'bar_dolg_petrenko'

 

 

Не подскажете, как в итоге можно осуществить спавн уникального NPC, если он был убит до этого, без старта новой игры? Спавн обычных сталкеров через alife():create() происходил успешно.

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

@LunInFog , вот кое-что из аналов древности https://disk.yandex.ru/d/EbziGqlJ3TMkVj

Там, ЕМНИП, не всё гладко. Но для твоей конкретной задачи подойдёт. Можешь посмотреть коды или на готовом сделать уникальный арт для воскрешения.

  • Нравится 1
  • Полезно 2

Здесь могла быть ваша реклама.


Подарки

  • 3
  • 5
  • 4
  • 2
  • Ссылка на комментарий

    @LunInFog 

    cse_alife_dynamic_object* create(int <индекс объекта в all.spawn> ) // создание объекта на основе секции в all.spawn

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

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

    @mole venomous , спасибо за ответ! Уже находил этот код на другом сайте с тем же readme, но до конца не понял. Раз тут посоветовали, то сел дальше его изучать и заметил, что он использует методы, которые, если я правильно понял, не являются стандартными для чистого SoC без модов.

    Например в строке "amk.convert_npc[id] = true". Поиск метода convert_npc по файлам gamedata папок, которые я сейчас использую ("config", "scripts", "sounds", "spawns", "textures") не дал результата. То же самое и с методами "read_stalker_params", "write_stalker_params".

     

    Не нашёл в lua_help.script:

    •     updhealth;
    •     killerid;
    •     game_death_time[number];
    •     skeleton_flags;

    Стандартные:

    •  heart:parent() - насколько я понял, возвращает родителя для объекта (артефакта). Если он лежит в трупе, то это мёртвый NPC. class game_object {}.
    •  function id() - class game_object {} по lua_help.script, возвращает id объекта.
    •  level.main_input_receiver() - возвращает текущее активное окно.
    •  alife() - класс alife_simulator - получаем сам объект класса alife_simulator.
    •  function set_switch_online(number, boolean) - class alife_simulator {} - видимо установить статус онлайн объекта с идентификатором id при boolean = true (перевести объект в онлайн).
    •  set_switch_offline(id, boolean) - class alife_simulator {} - установить статус оффлайн объекта с идентификатором id при boolean = true (перевести объект в оффлайн).
    •  level.object_by_id(number) - клиентский объект по его id. Возвращает nil, если объект не в онлайне или не существует. Пространство имён level.
    •  function object() - class entity_action {} - ???
    •  property health - class game_object {} - параметр "здоровье" объекта?..
    •  function log(string) - ?.. (логирование куда-то?)

    @AndreySol понял. all.spawn уже распакованным болтается, но через него манипуляций пока не пробовал проводить, только изучал структуру.

    Получается, мне нужен файл, полученный из all.spawn, с префиксом "alife_", далее номер уровня и имя нужной локации с NPC ("alife_l05_bar.ltx"). В нём я уже находил секцию Петренко. Вот её код.

    Скрытый текст
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    [7212]
    
    ; cse_abstract properties
    section_name = stalker_trader
    name = bar_dolg_petrenko
    position = 207.565994262695, 0.429977655410767, 60.4622344970703
    direction = 0, 1.57078814506531, 0
    id = 65535
    version = 118
    script_version = 6
    spawn_id = 3434
    
    ; cse_alife_trader_abstract properties
    money = 5000
    character_profile = bar_dolg_petrenko
    
    ; cse_alife_object properties
    game_vertex_id = 1203
    distance = 9.8000002
    level_vertex_id = 50435
    object_flags = 0xfffffff7
    custom_data = <<END
    [smart_terrains]
    none = true
    
    [logic]
    cfg = scripts\bar_petrenko.ltx
    END
    story_id = 506
    
    ; cse_visual properties
    visual_name = actors\dolg\stalker_do_balon_3
    
    ; cse_alife_creature_abstract properties
    g_team = 0
    g_squad = 5
    g_group = 4
    dynamic_out_restrictions = 
    dynamic_in_restrictions = 
    
    ; cse_alife_monster_abstract properties
    equipment_preferences = 2, 0, 2, 1, 1
    main_weapon_preferences = 2, 2, 2, 0
    
    ; cse_ph_skeleton properties
    
    ; se_stalker properties
    upd:health = 1
    upd:timestamp = 0
    upd:creature_flags = 0
    upd:position = 207.565994262695, 0.429977655410767, 60.4622344970703
    upd:o_torso = 1.57078814506531, 0, 0
    upd:g_squad = 5
    upd:g_group = 4
    
    ; cse_alife_human_stalker properties
    upd:start_dialog = 
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

     

     

    И в таком случае номером секции будет являться число в квадратных скобках "[]" = 7212? Думал, что это служебный ID, который присваивает перепаковщик, чтобы корректно запаковывать потом all.spawm обратно и сама игра про него не знает. Файл "alife_l05_bar.ltx" нужно куда-то подсовывать игре, или в директории игры вообще может не быть распакованного "all.spawn", и игра уже знает про номер секции, хоть этот ID и не имеет отношения к ID объекта?

     

    И, получается, раз есть функция для спавна по номеру секции, если про него знает игра, то возможно есть функция спавна по имени объекта (name = bar_dolg_petrenko)?

    Как только попробую оба способа, отпишусь.

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

    не являются стандартными для чистого SoC без модов

    Да, тебе нужна скриптовая база АМК, а именно файл amk.script.

    оригинальный

    • Полезно 1

    Здесь могла быть ваша реклама.


    Подарки

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

    @LunInFog 

    В описании из Справочника по ф-циям и классам кажись ошибка - не номер секции нужен, а параметр spawn_id = ххх. Проверь, у меня такой спавн работает без проблем:

    local obj = alife():create(389) -- 389 - spawn_id какой-то псины на кордоне

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

    Подскажите, как в АМК 1.4.1 вернуть выбросы во фриплее? Код ниже в файле amk_mod.script комментировал (по совету ранее в теме), но выбросов так и не появилось. Хотя судя по коду в условии прописаны выбросы когда игрок на территории ЧАЭС.

    if bt==2 and amk.load_variable("freeplay",0)~=2 then return end

     

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

    misfire_probability и misfire_condition_k позволяют настроить конфиг оружия вплоть до осечки при каждом выстреле. 

    • Согласен 1

    Отношения между людьми- главная ценность в человеческом обществе.
    Любая полученная информация- это только повод для размышлений, а не побуждение к действию.
    Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAE
    Накопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt

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

    @killersan6 из того, что помню прямо сейчас: если состояние >= 0.95, то осечка даже не считается. Если меньше, то используется хитрая формула, которую я без поиска по исходниками не скажу.

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

    @aromatizer 
    Да я знаю, меня формула расчета интересует.

    @dsh 
    Если будет в свободное время возможность посмотреть в сурцах - буду крайне признателен!

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

    @killersan6 ,

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


    float CWeapon::GetConditionMisfireProbability() const
    {
        if( GetCondition()>0.95f ) return 0.0f;
        float mis = misfireProbability+powf(1.f-GetCondition(), 3.f)*misfireConditionK;
        clamp(mis,0.0f,0.99f);
        return mis;
    }


     

    Не оно? Weapon.cpp

    И дальше выборка рандом:

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

     

    BOOL CWeapon::CheckForMisfire    ()
    {
        if (OnClient()) return FALSE;

        float rnd = ::Random.randF(0.f,1.f);
        float mp = GetConditionMisfireProbability();
        if(rnd < mp)
        {
            FireEnd();

            bMisfire = true;
            SwitchState(eMisfire);        
            
            return TRUE;
        }
        else
        {
            return FALSE;
        }
    }

     

     

    Изменено пользователем Купер
    Ссылка на комментарий
    2 минуты назад, killersan6 сказал:

    меня формула расчета интересует.

    Какой результат хочешь получить в игре?

    Отношения между людьми- главная ценность в человеческом обществе.
    Любая полученная информация- это только повод для размышлений, а не побуждение к действию.
    Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAE
    Накопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt

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

    Частоту поломок хочу грамотно увеличить.

    Тогда надо еще и condition_shot_dec править.

    Отношения между людьми- главная ценность в человеческом обществе.
    Любая полученная информация- это только повод для размышлений, а не побуждение к действию.
    Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAE
    Накопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt

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

    Влияет на частоту осечек: если количество выстрелов до полного износа велико,  то осечки случаются реже, а если мало, то - чаще. 

    Отношения между людьми- главная ценность в человеческом обществе.
    Любая полученная информация- это только повод для размышлений, а не побуждение к действию.
    Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAE
    Накопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt

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

    @aromatizer 
    О чем ты вообще? 
    Вон выше человек выложил формулу расчета прям из сурцов, там все просто и понятно.

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

    Главное - чтобы тебе нравилось... Даже если изобретаешь велосипед.)

     

    Отношения между людьми- главная ценность в человеческом обществе.
    Любая полученная информация- это только повод для размышлений, а не побуждение к действию.
    Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAE
    Накопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt

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

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

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

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

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

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

    Войти

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

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

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

    AMK-Team.ru

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