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

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

@Graff46 порядок там не столь важен, так как переменные сохраняются в псторе и читаются из него парами "наименование/значение" (а дальше ты просто обращаешься посредством имеющейся функции к таблице). Однако требования к размеру сохраняют силу, ведь пстор пишется всё в тот же несчастный нет-пакет (см., например, xr_logic.pstor_save_all / xr_logic.pstor_load_all). Кроме того, пстор в оригинальной своей реализации ограничен строчными, числовыми и булевыми типами сохраняемых значений.

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

Гм... pstor_save_all/pstor_load_all() - это дописывание в конец пакета произвольных данных.

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

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

 

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

function my_binder:save( pk )
    object_binder.save( self, pk )
    xr_logic.save_obj( self.object, pk )
    local n = 0    -- корректировка и сохранение времени
    for k, v in pairs( tm_sec ) do n = n + 1 end
    pk:w_u32( n )
    for k, v in pairs( tm_sec ) do pk:w_stringZ( k ); pk:w_float( v - game_time_sec ) end
    n = 0
    for k, v in pairs( tm_ms ) do n = n + 1 end
    pk:w_u32( n )
    for k, v in pairs( tm_ms ) do pk:w_stringZ( k ); pk:w_float( v - game_time_ms ) end
end

 

а мог, к примеру, писать так:

function my_binder:save( pk )
    object_binder.save( self, pk )
    xr_logic.pstor_save_all( obj, pk )
    local n = 0    -- корректировка и сохранение времени

...

end

 

Или, если мне ни какие "стандартные" данные не нужны, просто сразу писать что-то свое, не трогая xr_loigic вообще.

 

Но, нельзя делать так:

function load_obj( npc, pk )
...
    local s = pk:r_stringZ()
    if s == "" then st.loaded_ini_filename = nil
    else st.loaded_ini_filename = s
    end

    s = pk:r_stringZ()
    if s == "" then st.loaded_section_logic = nil
    else st.loaded_section_logic = s
    end

...

end

 

function save_obj( npc, pk )
...
    pk:w_stringZ( st.section_logic or "" )

    pk:w_stringZ( st.ini_filename or "" )

...

end

- будет лапша вместо данных.

 

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

COP. Пропадают ли вещи, заспавненые скриптом? Допустим, если выкинуть пару стволов игроком - они пропадут со временем, а если заспавнить через скрипт те же предметы (или в all.spawn) они будут пропадать?

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

При каких обстоятельствах при вылете, по которому движок не может открыть секцию, не указывается эта секция?

Вот такой непонятный лог:

FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CInifile::r_section
[error]File          : E:\stalker\patch_1_0004\xrCore\Xr_ini.cpp
[error]Line          : 342
[error]Description   : <no expression>
[error]Arguments     : Can't open section ''

P.S.: вылет происходит при подходе к шахте, где нужно спасти Дениса по квесту Клыка в НС 2016. В тех. поддержку писать не буду, т.к. играю со своим оружейным паком. Сам профиль Дениса я вообще не трогал.

Важнейшая задача цивилизации - научить человека мыслить.

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

т.к. играю со своим оружейным паком

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

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

Я фигею с оригинальных скриптов

    -- закешируем айдишник непися
    local npc_id = npc:id()
    -- проверка непися на присутсвие в списке
    if self.npc_list[npc:id ()] == nil then

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

 

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

Да, есть там такие моменты. И печально наблюдать, когда кто-то из начинающих мододелов начинает и у себя использовать подобные "механизмы", до этого набравшись навыков из ванильного кода.

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

Добрый день! У меня вопрос по поводу некоторых функций в SoC 1.004.

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

Вот функция проверки находится ГГ на Кордоне или нет:

function go_to_marsh_complete()
    if level_name == "l01escape" then 
        return true
    else
        return false
    end
end

-------------------------------------------------------

А как нужно написать проверку, что бы при заходе ГГ на Кордон выполнялось какое либо действие? И в каком скрипте ее прописывать, что бы подключить к игре. Заранее большое спасибо за ответ.

 

Pir%40t%40s.gif

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

В любом.

local lv = alife():level_id()

if db.storage[0].pstor.on_level ~= lv then

  db.storage[0].pstor.on_level = lv

  if lv == 1 then ... зашли на Кордон end

end

 

Только прежде, чем это делать, надо понимать, что от "написать", оно "к игре" не подключится. Как и приведенный образец (который - сам по себе из серии "никогда так не делайте"). А также то, что для работы необходимо наличие стартовавшего актора.

Если надо раньше, то вместо db.storage[0].pstor следует использовать, скажем, custom_data актора или, к примеру, сидоровича, и читать/сохранять ее через их нетпакет.

 

Вообще, следовало бы начать со смысла данного действа.

 

10 часов назад, dsh сказал:

Что за криворукие уедятлы

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

Впрочем, перлы типа if obj:id() == id and obj.id and obj then ... регулярно рожаются людьми вполне взрослыми через 10 лет после выхода игры...

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

@Plotnik если использовать X-Ray extensions, то там все просто:

level.get_target_dist() 

Добавлена функция получения расстояния до точки, на которую смотрим (игровой дальномер, который отображается под прицелом)

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

@Marafon6540 Про это мне известно. Я делаю оружие с функцией телепорта в точку прицеливания и хочу чтобы оно шло на любую версию игры. Вот как оно работает на Call Of Chernobyl (если вдруг кому интересно).
https://youtu.be/9aOeplHKpsY

У меня есть вот такая корявая идея:

function get_target_distance()

	local console = get_console()
	console:execute("hud_crosshair_dist on") -- включаем опцию дистанции до цели

	local distance_text = get_hud():GetCustomStatic("ТИП_ТЕКСТА"):wnd():TextControl():GetText() -- получаем дистанцию как текст
	local distance_number = tonumber(distance_text) -- переводим этот текст в число

	console:execute("hud_crosshair_dist off") -- отключаем опцию дистанции до цели

	return distance_number 

end

Только как называется этот тип текста? Он же должен быть прописан в одном из файлов в папке configs/ui. Я никак не могу его найти.
Может есть ещё какой-нибудь способ?
 

 

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

Как подружить ГГ и заагрившуюся группировку? Я делал так:

relation_registry.set_community_goodwill ("dolg", db.actor:id(), 5010)

Долговцы в ГГ не стреляют, но когда видят ГГ, некоторые в панику ударяются и тычат оружием именно в ГГ, но не стреляют!
И еще. Долговцы нейтральны и поговорить с некоторыми можно.

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

Приветствую. Нужна помощь/консультация по вот такому делу - возможно ли через скрипт увеличить/уменьшить k_hit, k_disp, k_pierce, k_dist у патронов из заданного списка при условии наличия на поясе определенного артефакта? Если да, то как это сделать/реализовать? Т.е, когда у ГГ на поясе висит определенный артефакт, у патронов из указанного в функции списка увеличиваются/уменьшаются  k_hit, k_disp, k_pierce, k_dist . Скриптер из меня не ахти какой поэтому и спрашиваю. Буду благодарен за помощь. 

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

возможно ли через скрипт увеличить/уменьшить k_hit, k_disp, k_pierce, k_dist

Нет. Эти параметры читаются движком напрямую из конфигов, соответственно скриптами тут не обойтись.

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

Доброго времени суток! Подскажите как реализовать "Звук при отрезании частей монстров" как в ОП 2

Важнейшая задача цивилизации - научить человека мыслить.

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

Я давненько "общаюсь" со скриптами, не скажу что профи, но что-то могу. Так вот, суть, сидел себе вечером ковырялся в xr_effects.script и повстречал там строку вида:

...
if p[2] and p[2] ~= nil then
...

И как модно сейчас говорить "словил триггер", разве эти два условия не равносильны? Разве не достаточно этого?

if p[2] then

 

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

Предполагается, что кто-нибудь особо одаренный может засунуть туда false, а где-то сильно потом его захотеть.

 

upd: да, оно еще и с  ошибкой.

Изменено пользователем Dennis_Chikin
  • Спасибо 1
Ссылка на комментарий

Прошу помощи. Сам в скриптах не силён.

Есть функция проигрывания звукового файла:

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

function CSurgeManager:play_siren_sound()
	local snd_obj=self.blowout_sounds["siren"]
	local snd_position
	if snd_obj ~= nil and snd_obj:playing() then
		snd_obj:stop()
	end
	if(level.name()=="zaton") then
		snd_position=vector():set(115,8,184)
	elseif(level.name()=="jupiter") then
		snd_position=vector():set(-50,16,198)
	else
		snd_position=vector():set(147,15,-187)
	end
	if snd_obj ~= nil then
		snd_obj:play_at_pos(db.actor, snd_position)
		snd_obj.volume = 1
		--self.debugMessages[12]:SetText("playing: "..tostring(id))
	end
end

 

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

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

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

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

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

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

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

Войти

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

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

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