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

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


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

Вот интересно стало:  в паке локаций от Кости (вроде) есть лока Болота. Так вот, костры там не горят, а тлеют. Можно ли их сделать, как в чистой ТЧ?

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

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

@AndrewMor, Наверное, ты не закинул спавн, либо в нём просто нету костров.

Для его создания понадобится создать 3 спавн-секции.

1. lights_hanging_lamp

2. zone_flame_small
3. space_restrictor


Для примера, в alife_l01_escape.ltx посмотри секции под номерами [846], [847], [848]. Первая отвечает за свечение, вторая- аномальная зона, обжигает НПС и ГГ, а рестриктор нужен как дополнительная зона, зачем - сам не знаю, но нужен.

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

вопрос: как изменить (замедлить) скорость падения капель дождя?  приписывание пятого значения как у скорости неба ничего не меняет. сталкер тч

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

@Dniwe, что ты вкладываешь в понятие "динамические"? Формулируй вопрос яснее. Если тебе нужен диалог типа "Что интересного?", то тебе в dialog_manager.script, а если тебе нужна рандомная фраза, то нужно просто вызвать перед ветвлением функцию, которая рандомно выберет твои фразы, можешь поглядеть Megadeath Mod, там по моему это было.

 

Я уже разобрался сам. Спасибо. имел ввиду несколько вариантов ответов у НПС.

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

 

 

Продублирую свой вопрос из соседнего топика, там мне отвечать не хотят. Как получить стори айди собеседника?

Нужно правильно ставить условия. Ну как можно сравнивать: if s1:id() == (db.actor or ... - т.е. тип данных 'number' с 'userdata'?!

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

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

@Artos, действительно, поправил, по прежнему никакого результата.

 

ТЧ 1.0006
 

 

 

function sendtip(text) --/ текст
return news_manager.send_tip(db.actor, text, 0, "default", 10000)
end

function test_sid(s1,s2)
if s1:id() == db.actor:id() then
sendtip("S2 sid~~: "..tostring(s2:story_id()))
return s2:story_id()
end
return s1:story_id() --/> номер из game_story_ids
sendtip("S1 sid~~: "..tostring(s1:story_id()))
end
...           
            <phrase id="13">
                <text>carlan_mod_sidor_13</text>
                <action>my_mod.test_sid</action>
            </phrase>
...

 

 

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

@Карлан,

 

return s1:story_id() --/> номер из game_story_ids 

sendtip("S1 sid~~: "..tostring(s1:story_id()))

Попробуй местами эти строки поменять.

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

yl59NI59OeI.jpg

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

@Карлан, говоря "никакого результата" - стОит уточнять, т.к. и отрицательный результат (если таковой есть), несет информацию!

 Исходя из того, что ты пытаешься получить story_id у своего собеседника, то НИКАК не может быть никакого результата. Функция sN:story_id() - обязана вернуть хоть какой-то результат в виде числа (хотя бы 4294967296) или ругнуться в лог.

Если у тебя отсутствует вызов твоей функции test_sid(s1,s2) - то и разбирайся с диалогом...

 

Примечание: параметр 'story_id' не является "номером из game_story_ids". Упомянутая табличка является массивом соответствий собственно выбранного параметра (числа) со строкою, прописываемых "ручками", и используемых, например, для заданий. Не следует это путать.

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

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

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

@Artos, т.о. мы получаем именно непосредственно индентификатор(число)? И story_id() у нас возвращает число соответствующее строке из game_story_ids(типа "000" => 0). И для сидора функция возвращает нам 3(а не 003), а для бармена 500(как и в game_story_ids). Правильно-ли я все понял? Если правильно, тогда поясните на кой черт вообще сдался game_story_ids.ltx со story id(для квестов?)? И как тогда понимать ; Номер SID-а состоит из номера уровня + номер персонажа (2 цифры).?

 

 

P.S. в том случае у меня как раз таки никакого результата не было.

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

@Карлан, (без желания обидеть):

1. СтОит почитать ФАКи и топик "Справочник по функциям и классам".

2. Включить собственную думалку, отбросив шоры...

Метод story_id() для объектов игры возвращает именно число (s32), естественно отбрасывая незначащие нули, которое является значением, присвоенным объекту при его спавне или изменением посредством net-пакетов. Какое значение (число) присваивать кому-то/чему-то и по каким правилам - решает сам разработчик/модмейкер. Главное чтобы оно было уникальным и в диапазоне 0...0x8fffffff (0...4294967295)

Таблица "[story_ids]" - является конфигом и может правиться кем угодно и как ему угодно (с соблюдением отдельных правил). Она вообще может отсутствовать, как в ЧН иль ЗП. В эту таблицу разработчики/модмейкеры заносят нужные им значения story_id своих персонажей иль предметов и сопоставляют им строку, которая может применяться в описаниях/условиях для квестов.

Комментарий разработчиков игры "Номер SID-а состоит из номера уровня + номер персонажа (2 цифры)." - чисто технический и даже уже с первой же строки ими же нарушается: 000 - сид предмета (кейса с доками), а не персонажа. И ничто(!) не мешает этот "порядок" не соблюдать. Все это критично только для квестов и записям для них. Кол-во незначащих нулей можно ставить "по-вкусу"...

 

P.S. В твоем случае (последний тут показанный вариант) обязан был быть отрицательный результат - твой файл (my_mod) имел синтаксическую ошибку в функции (test_sid) и был просто проигнорирован игрою. Однако, при вызове из диалога строки: <action>my_mod.test_sid</action> - обязана была быть ошибка c вылетом и соотв. записью в логе... Т.о. нужно бы заглядывать в лог и показывать его тут, при описании своих действий/кодов/результатов.

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

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

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

La'Rento,     

да, действительно, в алайфе на заспавнены костры: нет ни lights_hanging_lamp, ни zone_flame_small, ни space_restrictor. Буду спавнитьь сам, огромное спасибо.

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

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

Подскажите - какие соотношения или формулы используются движком при обсчете эффектов от артефактов ? К примеру, имеем в actor.ltx параметр health_restore_v, а в секции какого либо арта health_restore_speed - как они будут обсчитываться движком, есть ли формула обсчета ?

И еще - минимальные и максимальные значения для параметров в секции  actor_condition и для health_restore_speed, radiation_restore_speed, satiety_restore_speed, power_restore_speed, bleeding_restore_speed у артефактов ?

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

Подскажите, как можно свести на нет глянцевитость поверхностей при полном динамическом освещении в Сталкер тч или как сделать, чтобы на всей карте лежала тень, как под кустами и деревьями?

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

Возможно-ли как-то получить реальную текущую дату?(16.10.13) Через скрипты, разумеется.  

 

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

@Карлан, можно сохранить какой-нибудь файл на диск и посмотреть время его изменения.

	-- user.ltx
	get_console():execute("cfg_save")
	local f = getFS()
	local flist = f:file_list_open_ex("$app_data_root$",FS.FS_ListFiles,"user.ltx")
	local file = flist:GetAt(0)
	local res = file:Modif()
	get_console():execute(res:gsub(":","."):gsub("%s","_")) -->Thu_Oct_17_00.30.52_2013_
	local res = file:ModifDigitOnly()
	get_console():execute(res:gsub(":","."):gsub("%s","_")) -->17.10.2013_00.30
	
	-- log
	get_console():execute("flush")
	local f = getFS()
	local flist = f:file_list_open_ex("$logs$",FS.FS_ListFiles,"*.log")
	flist:Sort(FS.FS_sort_by_modif_down)
	local file = flist:GetAt(0)
	local res = file:Modif()
	get_console():execute(res:gsub(":","."):gsub("%s","_")) -->Thu_Oct_17_00.30.52_2013_
	local res = file:ModifDigitOnly()
	get_console():execute(res:gsub(":","."):gsub("%s","_")) -->17.10.2013_00.30 

 

 

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

Спасибо, @Charsi.

 

Вот наваял функцию получения номера билда по формуле GSC, без введения циферок ручками. Теперь функция полностью автономна. 

--// by Карлан
function get_build_date()
    get_console():execute("mod loaded")
    local flist = getFS():file_list_open_ex("$logs$",FS.FS_ListFiles,"*.log")
    flist:Sort(FS.FS_sort_by_modif_down)
    local res = flist:GetAt(0):ModifDigitOnly()
    if not (res and res ~= "") then return 0 end
    local days = {0,31,59,90,120,151,181,212,243,273,303,334,365}
    local y = tonumber( res:sub(7,10) or 0 ) 
    local m = tonumber( res:sub(4,5) or 0 ) 
    local d = tonumber( res:sub(1,2) or 0 )
    local bd = (365*(y - 1999) - 31 + days[m] + d ) 
	return "(build: "..bd..")"
end

 

Вариант куда более лучший, от @Charsi

--// by Charsi

function get_build_date()
    get_console():execute("cfg_save")
    local f = getFS()
    local flist = f:file_list_open_ex("$app_data_root$",FS.FS_ListFiles,"user.ltx")
    local file = flist:GetAt(0)
    local res = file:ModifDigitOnly()
    local d,m,y = res:match("(%d+)%d+)%d+)")
    local days = {0,31,59,90,120,151,181,212,243,273,303,334,365}
    local bd = (365*(y - 1999) - 31 + days[tonumber(m)] + d ) 
return "(build: "..bd..")"   
end

 

 

 

Финальная версия:

 

--// -------------------------------------------------------------------------------------------
--// Версия мода в виде (build: 5369) [+171013], где первое - номер билда, второе - номер фикса
--// Работает полностью автономно, вызывать в меню, либо где угодно еще
--// -------------------------------------------------------------------------------------------
function get_build_date()
get_console():execute("cfg_save")
local flist = getFS():file_list_open_ex("$app_data_root$",FS.FS_ListFiles,"user.ltx")
local res = flist:GetAt(0):ModifDigitOnly()
local d,m,y = res:match("(%d+)%d+)%d+)")
local fix = tonumber(res:sub(9,10))
local days = {0,31,59,90,120,151,181,212,243,273,303,334,365}
local bd = (365*(tonumber(y) - 1999) - 31 + days[tonumber(m)] + tonumber(d) )
return "(build: "..bd..") [+"..tonumber(d..m..fix).."]"
end
Изменено пользователем Карлан
Ссылка на комментарий

Хм, что-то смахивает на чесание пяткой уха...

1. В ЧН/ЗП доступно пространство 'os' и не сложно получить реальную дату (и/или время): os.date()

2. В ТЧ несколько посложнее, но также не сложно добавить это пространство имен (см. xrLuaFix и аналогичное).

3. В "финальном" варианте явно ошибочен патерн, вероятно должно быть: 

'(%d+)\%d+)\%d+)\.+'

4. Довольно странные определения билда и фикса... Получается что, когда запустил игру - тогда и билд сделан с фиксом?! Все же 'build' и 'fix' - некие даты, когда были созданы коды или изменения к ним, а не "дата создания запущенной игры"...

5. Насиловать ради некой даты файловую систему с файлом настроек - хм, а ежели взглюкнет? (не каждый знает как восстановить) ;-)

ИМХО, безопаснее насиловать фейковый файл: get_console():execute("cfg_save tmp") --/ запись настроек в файл 'tmp.ltx'

или вообще использовать готовый файл-лог из соотв.папки: 

getFS():update_path("$logs$", "xray_"..user_name()..".log")

P.S.

xrLuaFix - расширитель Lua для S.T.A.L.K.E.R SHoC|CS|CoP (ТЧ/ЧН/ЗП) 

xrLuaFix базируются на исходниках: http://code.google.com/p/xrluafix/ (by RvP)
и совместима со всеми официальными версиями S.T.A.L.K.E.R : ТЧ, ЧН и ЗП (соответственно).
 
Краткое описание:
-----------------
Добавляемые в игру функции:
глобальное пространство имен:
void logf(string1 [, string2, string3, ...]) -- вывод в лог аргументов, каждый аргумент в новой строке.
void LuaFix([arg]) -- открывает доп. пространства имен io, os, package и debug.
void LuaExt() -- расширяет пространства имен math, string, table и добавляет функции куйлоггера.
set_vKeyCB() -- запуск обработчика нажатия клавиш
get_vKeyCB() -- запрос из обработчика о нажатых клавишах. out: table[vk] = true
vKeyPressed(vk1[,vk2]) -- запрос о нажатой клавише (двух славишах)
 
Дополнительные/возвращенные пространства имен:
os -- для ТЧ
io -- для ТЧ
package -- для ТЧ (добавляет и глобальную функцию require)
debug -- опционально
 
Расширители пространств:
math.random([a[, b]]) -- замена стандартной функции, более быстрая. Использование прежнее
math.randomseed(x)    -- замена стандартной функции генератора псевдослучайных чисел
 
string.trim(str) -- обрезка строки
string.trim_l(str) -- обрезка строки слева
string.trim_r(str) -- обрезка строки справа
string.trim_w(str) -- обрезка строки по первому слову
 
table.keys(t) -- возвращает таблицу ключей таблицы
table.values(t) -- возвращает таблицу значений таблицы
table.size(t) -- возвращает реальный размер таблицы
table.random(t) -- возвращает случайный елемент таблицы
 
lfs -- Оригинальная Lua библиотека. Подробное описание и использование: http://keplerproject.github.com/luafilesystem/

 

 

 

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

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

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

4. Довольно странные определения билда и фикса... Получается что, когда запустил игру - тогда и билд сделан с фиксом?! Все же 'build' и 'fix' - некие даты, когда были созданы коды или изменения к ним, а не "дата создания запущенной игры"...

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

 

3. В "финальном" варианте явно ошибочен патерн, вероятно должно быть: 

Форум проглотил патерн, было: 

"(%d+)%d+)%d+)"

 

Расскажите пожалуйста о том, как влияют различные параметры ГГ(репутация/ранг...) на коэффициенты торговли в оригинальном ТЧ? И вообще влияют-ли как-то? Я пока нигде информации о влиянии подобных параметров не нашел, возможно как-то это обрабатывается движком.

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

У меня теперь вопрос конкретно про репутацию встал. 

 

Сейчас начну формулировать, начал я с того, что вывел кастом статиком db.actor:character_reputation(), и она мне стала показывать репутацию ГГ. Ясно, что она в наградах за таски прописывается, и где то в диалогах о помощи и etc., а вот насчет смерти я например не нашел. Искал в xr_motivator.script что-либо что могло бы повлиять на репутацию, но не нашел. Нашел только непонятную функцию:

 

if(actor_stats.remove_from_ranking~=nil)then
local community = self.object:character_community()
if community == "zombied" or
  community == "monolith" or
  community == "arena_enemy"
then
return
end
actor_stats.remove_from_ranking(self.object:id())
end

Итак, собственно вопросы:

 

1 По каким критериям она изменяется?

2 Каков ее диапазон?

3 Как она влияет на отношения разных группировок/торговцев/монстров на ГГ? (н-р убили сталкера, репутация отнялась, как на это отреагируют бандиты?)

 

Еще добавлю подобный вопрос про функцию goodwill, чем отличается от general_goodwill? Как и от чего изменяется? Мне возвращает всегда 0, пострелял, выполнил пару заданий, и по прежнему было 0.

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

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

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

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

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

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

Войти

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

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

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