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

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


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

Artos, :(:) ...

 

Метод чтения глобальной таблицы, признан менее затратным, лоадстринг - не совсем ясно, но вроде то-же приемлемо. В общем: вопрос - закрыли, уверенность - обрели :)

Спасибо.

Всем.

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

всё легко

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

(чтобы другие все же не наступали на грабли ...)

Использование глобальной метатаблицы '_G' для проверки наличия как самого скрипт-файла, так и функции в нем по указателям на них - не просто менее затратен, но и полностью безопасен и позволяет дать полный ответ: "имеется и это функция", не прибегая к попыткам загрузить/вызвать несуществующее ... (по сути при каждой "проверке" наступая 'на грабли', хотя и в 'защищенном' варианте). :)

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

А разве получится использованием метатаблицы _G узнать существует ли функция в скрипте который до этого ни разу не использовался? Он же по идее отсутствует в _G

Freedom

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

_Призрак_

Хороший вопрос! :-) Тоже ранее ломал голову ...

Могу дать только свои 'толковалки':

'_G' - глобальная метатаблица окружения. Естественно, при запуске игры движек формирует из 'штатных' файлов/функций и пр. некое 'начальное окружение'.

Существует 2 варианта дозагрузки в это 'начальное' окружение дополнений (своих файлов):

а) Принудительная (ручками) загрузка. Т.е. применение методов 'setfenv' и подобных.

б) Первое обращение к 'неизвестному' пока скрипт-файлу.

Т.е. _G["script_name"] - это и есть поиск, чтение кода и внесение в глобальную метатаблицу указателей на прочитанный код. Очевидно, переменная '$game_scripts$' из 'fsgame.ltx' указывает и ограничивает область поиска новой таблицы с именем "script_name".

На практике, когда заведомо известно имя скрипт-файла, можно 'подключать' более простым вариантом, типа: if script_name then ...

Т.о. при 'прямых' обращениях из скрипт-файлов к файлам, к которым еще не было обращений (еще не использовались) , как раз и происходит 'первичное использование', т.е. внесение их в окружение.

 

Опасение отсутствия в метатаблице окружения (_G) следует учитывать при 'не прямых' попытках вызова функций, т.е. например из веток диалогов или тэгов <action> ... и т.п.

В этом случае отсутствует первичная проверка наличия соответствующей функции в метатаблице огружения, а идет прямой вызов. Естественно, если скрипт-файл еще не был внесен в глобальное окружение - произойдет фатальная ошибка. (=>безлоговый вылет).

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Для принудительной загрузки модуля есть специальная движковая функция prefetch(<имя модуля без расширения>)

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

malandrinus

Ты прав, конечно.

Но т.к. и тема и заморочки у многих малоопытных модмейкеров не в способах подключения - и употребил фразу: ' ... применение методов 'setfenv' и подобных", не углубляясь в 'дебри'.

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

Т.о. в текущем топике более актуальна упрощенная подгрузка, совмещенная и с проверкой: "а загружено ли?", о которой стОит некоторым вспоминать, перед применением в диалогах/тасках и иже ...

 

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

P.S. malandrinus

Подключение через метод 'prefetch' из пак-файлов *.xdb заканчивается ошибкой (в некоторых ситуациях ...).

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Может кто напомнит. Все позабывал. Как на мини-карте:

1. Включить-выключить отображение количетсва неписей (обычно внизу стандартной мини-карты)?

2. Включить-выключить отображение опознавания "свой-чужой"?

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

White Rabbit,

1. в файле maingame.xml найди код

<static_pda_online x="138" y="167" width="35" height="28" light_anim="ui_pda_contacts" la_cyclic="0" la_texture="0" la_text="1" la_alpha="1">
        <texture>ui_hud_map_counter</texture>
        <text y="6" align="c" font="graffiti19" r="238" g="155" b="23" a="255"/>
    </static_pda_online>

и удали ссылку на текстуру ui_hud_map_counter

2. в файле map_spots_relations.xml прописаны "метки" на НПС в зависимости от отношения к ГГ. Здесь тоже удаляешь ссылку на текстуру, в зависимости от того, какую метку ты хочешь "убрать" с карты.

Неважно – сколько у тебя друзей. Важно - сколько из них помогут тебе в трудную минуту и сколько вспомнят о тебе когда им хорошо.

"Худ" и "Умное выпадание частей монстров" для Народной солянки

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

Comador,

удали ссылку на текстуру ui_hud_map_counter
Не понял, как текстура связана с отображаемыми цифрами? Я думал там код, выдающий число на экран.

в файле map_spots_relations.xml прописаны "метки" на НПС в зависимости от отношения к ГГ. Здесь тоже удаляешь ссылку на текстуру, в зависимости от того, какую метку ты хочешь "убрать" с карты.
Гилянем. Сэнкс. Ээээээ.... А цвет метки как здесь завязан?

 

 

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

White Rabbit, если нужно оставить текстуру, а убрать текст в счетчике, то нужно или убрать вот этот код

<text y="6" align="c" font="graffiti19" r="238" g="155" b="23" a="255"/>

или в этом коде вместо a="255" прописать a="0".

По поводу меток: там, где идет ссылка на текстуру, например для врагов

<enemy_mini_spot width="4" height="4" stretch="1" alignment="c" xform_anim="map_spot_rel_xform" xform_anim_cyclic="0">
        <texture r="255" g="0" b="0">ui_minimap_point</texture>
    </enemy_mini_spot>

то r="255" g="0" b="0" отвечает за цвет метки (в данном случае красный).

Неважно – сколько у тебя друзей. Важно - сколько из них помогут тебе в трудную минуту и сколько вспомнят о тебе когда им хорошо.

"Худ" и "Умное выпадание частей монстров" для Народной солянки

Ссылка на комментарий
Comador
то нужно или убрать вот этот код
Исключение пустого элемента <text attributes/> Лишь отключит установку значений параметров, указанных в нём. Соответственно, после его удаления, задействуются значения по умолчанию. Для отключения вывода текста, нужно исключить все попытки его установки методами SeText(...) и SetTextST(...). Ну или, как было предложено в варианте 2, указав нулевое значение непрозрачности текста. Хотя это не лучший вариант, так как текст всё равно будет продолжать отрисовываться, хоть мы его и не будем видеть. Изменено пользователем singapur22

Опаа-а!!! Ливер вылез!

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

С этим согласен, но

нужно исключить все попытки его установки методами SeText(...) и SetTextST(...)

не полезем же мы за этим в движок? :) Именно он отрисовывает все дела на худе, а получает он их (окна, которые будет изображать) из xml.

Так что нужно либо сделать число прозрачным, либо вынести это окно\число за пределы экрана.

ТЧ 1.0004. SAP и Trans mod

github

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

Всем привет , в общем решил совместить AI_Pack_Add_AMKII_Mon с Blowout mod'ом , совмещал все точно , но тут появилась ошибка nil в файле xr_logic связанная со строчкой

_G[schemes[scheme]].add_to_binder(npc, ini, scheme, section, st)

Что это может быть?Помогите пожалуйста.

Я ДатчикХабара со stalker-portal

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

Ясно. Буду экспериментировать. Сэнкс заранее (посты сос спасибками удаляют :D - в личку не очень люблю писать :)). Малость уточню. В принципе я хотел включить, а не выключить, но где это, в каких файлах не знаю. И вхелпах по модостроению не попадалось. А на форумах поиск - нудное занятие (вот если бы все в шапку сносили - было бы проще). И старые моды поудалял. Где худы редактировались. Сравнить не с чем. А в DMX все это отсутствует. Но помню, что было. Вот и решил проконсультироваться.

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

Подскажите пожалуйста,убиваю Борова и игра вылетает, из-за чего может быть данный вылет?

мод OGSM + мои правки,но в скриптах ничего не менял кроме добавления lootmoney мода.

 

Клиент: Синхронизация...

* phase time: 48 ms

* phase cmem: 278858 K

* [win32]: free[2624192 K], reserved[91296 K], committed[1478752 K]

* [ D3D ]: textures[755319 K]

* [x-ray]: crt heap[278856 K], process heap[7991 K], game lua[23243 K], engine lua[245 K], render[0 K]

* [x-ray]: economy: strings[4883 K], smem[28709 K]

[16-9] get_xml_name for[game_tutorials.xml] returns [game_tutorials.xml]

[16-9] get_xml_name for[ui_credits.xml] returns [ui_credits.xml]

[16-9] get_xml_name for[ui_movies.xml] returns [ui_movies.xml]

! Missing ogg-comment, file: d:\games\s.t.a.l.k.e.r. - shadow of chernobyl\gamedata\sounds\weapons\m_reload.ogg

! Missing ogg-comment, file: d:\games\s.t.a.l.k.e.r. - shadow of chernobyl\gamedata\sounds\weapons\groza_shoot.ogg

* MEMORY USAGE: 307338 K

[16-9] get_xml_name for[maingame_pda_msg.xml] returns [maingame_pda_msg.xml]

[16-9] get_xml_name for[maingame_pda_msg.xml] returns [maingame_pda_msg.xml]

 

FATAL ERROR

 

[error]Expression : fatal error

[error]Function : CScriptEngine::lua_error

[error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp

[error]Line : 73

[error]Description : <no expression>

[error]Arguments : LUA error: ...w of chernobyl\gamedata\scripts\death_manager.script:144: attempt to index field '?' (a nil value)

 

 

stack trace:

 

 

Вытащу любой обьект из Battlefield Play 4 Free

Ссылка на комментарий
shpiler, а в character_desc ничего не менял? У меня такое происходило, когда я пытался раскоментировать некоторые строки в этих файлах, например:
            ammo_5.56x45_ap \n
    ;borov_flash \n
            device_torch \n
    ;val_key_to_underground \n

.

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

Лучше спросить глупость, чем её совершить.

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

лнкс,

Изменял, но я не вижу здесь какой-либо ошибки,и ещё такой вопрос из какого файла берётся профиль борова, из character desc darkvalley или character desc bandit.Просто у меня в этих файлах разное содержимое профиля.

                   <specific_character id="val_bandit_borov" team_default="1">
        <name>val_borov_name</name>
        <icon>ui_npc_u_stalker_bandit_borov</icon>
        <map_icon x="0" y="0"></map_icon>
        <bio>val_borov_bio</bio>

        <class>val_bandit_borov</class>
        <community>bandit</community> <terrain_sect>stalker_bandit_terrain</terrain_sect>
        
        <rank>621</rank>
        <hit_probability_factor>1.5</hit_probability_factor>
        <reputation>-147</reputation>

        <visual>actors\bandit\stalker_bandit_borov</visual>
        <snd_config>characters_voice\human_02\bandit\</snd_config>
        <crouch_type>1</crouch_type>
        <supplies>
            [spawn] \n
            wpn_colt_python \n
            ammo_50_ae \n
            wpn_w1200 \n
            ammo_12x70_buck \n
        ;borov_flash \n
            device_torch \n
        ;val_key_to_underground \n
        </supplies>
                
#include "gameplay\character_criticals_4.xml"
                    
#include "gameplay\character_dialogs.xml"
    </specific_character>

 

Вытащу любой обьект из Battlefield Play 4 Free

Ссылка на комментарий
shpiler, из character desc darkvalley. Если раскоментил ему флешку или ключ, то вылет гарантирован. Вылет у тебя разовый или постоянный? И ещё, попробуй убрать:
#include "gameplay\character_dialogs.xml"

. У меня концовка секции:

        </supplies>
                
#include "gameplay\character_criticals_4.xml"
                    
        <start_dialog>hello_dialog</start_dialog>
    </specific_character>

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

Лучше спросить глупость, чем её совершить.

Ссылка на комментарий
.....Что это может быть?Помогите пожалуйста.

Попробуй так, как у меня:

function assign_storage_and_bind(npc, ini, scheme, section)
local npc_id = npc:id()
local st

if not db.storage[npc_id][scheme] then
	db.storage[npc_id][scheme] = {}
	st = db.storage[npc_id][scheme]

	st["npc"] = npc

	-- Схема стартует впервые - прибиндить
	--printf("DEBUG: assign_storage_and_bind: bind scheme: '%s'", scheme)
	_G[schemes[scheme]].add_to_binder(npc, ini, scheme, section, st)
else
	st = db.storage[npc_id][scheme]
end

st["scheme"] = scheme
st["section"] = section
st["ini"] = ini

return st
end

 

Только у меня без AI_Mon Modification.

"...Let the game begin hear the starting gun

Play from the heart today we will overcome
When the game is over all the counting is done
We were born to win number 1..." (с) Manowar
Ссылка на комментарий
Могу дать только свои 'толковалки':

Разреши дать "ДО"толковалки, т.к. не могу гарантировать достоверность всей информации, но не могу не дополнить.

Информация ниже дана не для "профессионалов", а только в качестве разъяснения.

 

То, что нашёл, излагаю ниже (факты с моими комментариями - "ДО"толковалками и пояснениями):

Итак факты :

 

1. Для таблицы _G (т.е. для глобальной таблицы Lua) в СТАЛКЕР-е существует СВОЯ метатаблица.

2. В этой метатаблице есть только одно поле с ключем __index и значением function

3. У каждого, уже ПОДКЛЮЧЁННОГО!, к игре файла-модуля (*.script) тоже существует своя метаблица с единственным полем __index и значением таблица. Этой таблицей является глобальная таблица Lua _G

 

P.S. Всё далее, конечно, опровержимо, но... (...позволю себе умозаключения)

При обращении (например, при вызове "if какой_то_ещё_не_ни_разу_не_запрашиваемый_файл then") в таблице _G происходит поиск поля с ключём "какой_то_ещё_не_ни_разу_не_запрашиваемый_файл".

Естественно, не найдя его в себе (таблице _G), происходит обращение к метатаблице таблицы _G. И поскольку в этой метатаблице только одно поле с ключём __index и значением function, происходит вызов этой функции.

 

Проверки показали, что при подобном вызове в глобальной таблице Lua (_G) сразу же появляется поле с ключём "какой_то_ещё_не_ни_разу_не_запрашиваемый_файл" и значением таблица.

Т.к. не могу заглянуть в движок, могу только предполагать что эта функция зугружает файл как модуль, устанавливает для неё метатаблицу с индексом на таблицу _G.

 

Короче, промоделировал подобный код в SciTE (Плохо, но зато быстро :))

-- Тут вроде как прочитанные данные из 'fsgame.ltx'
game_scripts = 'F:\\Games\\S.T.A.L.K.E.R.\\gamedata\\scripts\\' -- типа путь к папке 'scripts'
package.path = game_scripts.."?.script"                           -- это для Lua-интерпритатора(не обр. внимания)
-- Далее метатаблица для _G
local mt_G = {__index = function(t,k) -- тут вызывается функция
                            local scr_path = game_scripts..k..'.script' -- типа путь к файлу
                            local f = loadfile(scr_path)
                            if f then
                                module(k, package.seeall)               -- объявляем файл как модуль и устанавливаем
                                                                           "видимость" (package.seeall)
                                setfenv(f,_M)                           -- поскольку loadfile "работает" в своём
                                                                           окружении (окружением для неё является _G), то назначим ей окружением загружаемый
                                                                           модуль (т.е. проведём операцию загрузки - содержимого файла в...) новый модуль.
                                f()                                     -- загружаем содержимое файла-модуля
                                setmetatable(_M, {__index = _G}) -- как я уже констатировал факт, для этого модуля 
                                                                  устанавливается метатаблица, ссылкой из которой является таблица _G)
                                return require(k) -- ну и возвращаем подключённый модуль как таблицу
                            end
                        end
            }
-- для глобальной таблицы Lua "_G" устанавливается метатаблица 'mt_G'
setmetatable(_G, mt_G)

 

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

Ну, например, при загрузке новой игры нет поля с индексом xr_effects.

Обратившись :

if xr_effects then
...

Сначала происходит нечто, описанное сначала моего поста. И если файл-модуль с именем "xr_effects" существует и правильно загрузиться, то ...

Дальше что там Вы хотите.

Примерно так, ИМХО.

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

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

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

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

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

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

Войти

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

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

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