Перейти к контенту
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

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

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

@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

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

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

@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

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