Перейти к содержанию

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

 

61561952a1.png

Тема посвящена моддингу на платформе Зов Припяти.

 

Правила темы:

  • Здесь задают вопросы и получают на них ответы. Прежде чем задать вопрос, воспользуйтесь поиском, ответ на него, вероятно, уже есть.
  • Если у вас произошёл вылет, проверьте лог и поищите информацию об ошибке в справочнике. Также будет полезно посмотреть справочник ошибок. Если у Вас вылетает какой-то мод, то следует написать в тему этого мода.
  • Грамотно оформляйте свой пост, чётко доносите суть своего вопроса (ответа).
  • Благодарность выражаем в личке или же ставим реакцию. Посты с благодарностями в теме будут удаляться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
   

Может кто сможет помочь?

Open X-Ray 221 + AF3 + Анимация использования предметов. Вылетает вот с такой ошибкой в логе:

Спойлер

stack trace:

C:\Windows\system32\KERNELBASE.dll at 000007FEFD35B87D RaiseException() + 61 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\LuaJIT.dll at 000007FEEC8D7E5E lua_gethookcount() + 3342 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\LuaJIT.dll at 000007FEEC8D7EFC lua_gethookcount() + 3500 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\LuaJIT.dll at 000007FEEC901E54 lua_close() + 23652 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\LuaJIT.dll at 000007FEEC8AF012 lua_newuserdata() + 82 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\luabind.dll at 000007FEF13634B0 luabind::detail::push_new_instance() + 32 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrGame.dll at 000007FEBFFDB57F
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrGame.dll at 000007FEC07AC1A3 CxImage::`copy constructor closure'() + 192419 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrGame.dll at 000007FEC07C7FBA CxImage::`copy constructor closure'() + 306618 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrGame.dll at 000007FEC07B5EF1 CxImage::`copy constructor closure'() + 232689 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8ED7F77 CObjectList::Update() + 903 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8E86983 IGame_Level::OnFrame() + 35 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrGame.dll at 000007FEC05B2976
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8E12058 CRenderDevice::CSecondVPParams::IsSVPFrame() + 1076 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8E115C1 CRenderDevice::FrameMove() + 337 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8E10BA3 CRenderDevice::on_idle() + 243 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8E11118 CRenderDevice::message_loop() + 392 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8E1138B CRenderDevice::Run() + 507 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8EDD2A9 Startup() + 521 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8EDD8FD RunApplication() + 1229 byte(s)
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.exe at 000000013F3A14AF
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.exe at 000000013F3A1594
D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.exe at 000000013F3A19A2
C:\Windows\system32\kernel32.dll at 00000000773F556D BaseThreadInitThunk() + 13 byte(s)
C:\Windows\SYSTEM32\ntdll.dll at 000000007755372D RtlUserThreadStart() + 29 byte(s)

Вылетает на Янове или на Скадовске

Заранее Спасибо 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Добро. Как формируется файл сохранения? Как можно добавить новые переменные для сохранения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
1 час назад, Neptun сказал:

Как формируется файл сохранения?

Файл сохранения формируется движком, точнее его серверной частью. В файл попадает информация о каждом объекте в игре вероятнее всего в виде нетпакетов объектов (специальным образом сформированный блок информации с текущем статусом объекта).

1 час назад, Neptun сказал:

Как можно добавить новые переменные для сохранения?

1. Если задан биндер объекта, то движком вызываются две функции - колбеки событий сохранения нетпакета и его загрузки. Например: function door_binder_labx8:save(packet) и function door_binder_labx8:load(packet). В этих функциях имеется возможность напрямую добавить переменные в нетпакет.

Спойлер

-- Saving
function door_binder_labx8:save(packet)
    set_save_marker(packet, "save", false, "door_binder_labx8")
    object_binder.save(self, packet)
    xr_logic.save_obj(self.object, packet)
    packet:w_bool(self.is_idle)
    packet:w_bool(self.is_play_fwd)
--    packet:w_u32(self.idle_end)
    packet:w_float(self.object:get_physics_object():anim_time_get())
    set_save_marker(packet, "save", true, "door_binder_labx8")
end
-- Loading
function door_binder_labx8:load(packet)
    set_save_marker(packet, "load", false, "door_binder_labx8")
    object_binder.load(self, packet)
    xr_logic.load_obj(self.object, packet)
    self.is_idle = packet:r_bool()
    self.is_play_fwd = packet:r_bool()
--    self.idle_end = packet:r_u32()
    self.anim_time = packet:r_float()
    self.loaded = true
    set_save_marker(packet, "load", true, "door_binder_labx8")
end

2. Есть специальная сущность db.storage (хранилище) в которую можно поместить свои переменные для сохранения и восстановления состояния объекта к кторому они привязаны:
 

Спойлер

function pstor_store(obj, varname, val)
    local npc_id = obj:id()

    if db.storage[npc_id].pstor == nil then
        db.storage[npc_id].pstor = {}
    end
    local tv = type(val)
    if val ~= nil and not pstor_is_registered_type(tv) then
        abort("xr_logic: pstor_store: not registered type '%s' encountered", tv)
    end
    db.storage[npc_id].pstor[varname] = val
end

function pstor_retrieve(obj, varname, defval)
    local npc_id = obj:id()

    if db.storage[npc_id].pstor ~= nil then
        local val = db.storage[npc_id].pstor[varname]
        if val ~= nil then
            return val
        end
    end
    if defval ~= nil then
        return defval
    end
    --abort("xr_logic: pstor_retrieve: variable '%s' does not exist", varname)
    return nil
end

function pstor_save_all(obj, packet)
    local npc_id = obj:id()
    local pstor = db.storage[npc_id].pstor
    if not pstor then
        pstor = {}
        db.storage[npc_id].pstor = pstor
    end

    local ctr = 0
    for k, v in pairs(pstor) do
        ctr = ctr + 1
    end
    packet:w_u32(ctr)

    for k, v in pairs(pstor) do
        --printf("_bp: pstor_save_all: saving [%s]='%s'", utils.to_str(k), utils.to_str(v))
         packet:w_stringZ(k)
        local tv = type(v)
        if tv == "number" then
            packet:w_u8(pstor_number)
             packet:w_float(v)
         elseif tv == "string" then
            packet:w_u8(pstor_string)
             packet:w_stringZ(v)
         elseif tv == "boolean" then
            packet:w_u8(pstor_boolean)
             packet:w_bool(v)
        else
            abort("xr_logic: pstor_save_all: not registered type '%s' encountered", tv)
        end
    end
end

function pstor_load_all(obj, reader)
    local npc_id = obj:id()
    local pstor = db.storage[npc_id].pstor
    if not pstor then
        pstor = {}
        db.storage[npc_id].pstor = pstor
    end
    local ctr = reader:r_u32()

    for i = 1, ctr do
        local varname = reader:r_stringZ()
        local tn = reader:r_u8()
        if tn == pstor_number then
            pstor[varname] = reader:r_float()
        elseif tn == pstor_string then
            pstor[varname] = reader:r_stringZ()
        elseif tn == pstor_boolean then
            pstor[varname] = reader:r_bool()
        else
            abort("xr_logic: pstor_load_all: not registered type N %d encountered", tn)
        end
        --printf("_bp: pstor_load_all: loaded [%s]='%s'", varname, utils.to_str(pstor[varname]))
    end
end

Спойлер

xr_logic.pstor_store(db.actor, "zat_b30_days_cnt", 0)

cnt = xr_logic.pstor_retrieve(actor, "zat_b30_days_cnt", 0)

 

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

Путь во мгле.
Связь времен.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
В 20.11.2020 в 03:57, Neptun сказал:

Во-первых, функцию спавна сквада необязательно выносить в отдельную строку логики, она прекрасно смотрится и в начале:
on_actor_inside = {+shakhter_seventh_dialog_end} %+psevdoshakhter_spawn =create_squad(smart_psevdo_squad:smart_psevdo)%
Во-вторых, не пробовал сейв вставить в эту же логику? Сразу после 7 нумера создать отдельную строку:

[sr_idle@7]
on_game_timer = 50 | %=ending_postprocess_cutscene_54 =ending_anim_cutscene_54 =ending_punches =enable_ui% sr_idle@save

[sr_idle@save]
on_info = %=scenario_autosave(save)% sr_idle@nil

Ни в какую, то же самое. Пробовал и то, и то что снизу написал @makdm. Постпроцесс остался после сейвлоада

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
19 минут назад, NewValveCom сказал:

Ни в какую, то же самое.

Чудес не бывает.

Выкладывайте все то, что вы делали и опишите что вы хотите. Подробно....

Возможно вы вообще идете не тем путем....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Kalambur 

%c[default]

насколько я помню.


Путь во мгле.
Связь времен.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

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

Спойлер

Вызов скрипта из xr_motivator.script в hit_callback:     if who_id==actor_id then  hpbar.OnHit(obj,who) end
====================================================================================

Сам скрипт:
local progress = nil
local last_id = nil

function OnHit(obj,who)
local st = db.storage[obj:id()]
if st and obj:alive() then
    if not st then
        return
    end
    local v = obj.health or 0
    
    if last_id and last_id == obj:id() then
        if v <= 0.005 then
            cs_remove()
        end
    end
    
    if (who == nil or who:id() ~= 0) then
        return
    end
    
    local hud = get_hud()
    if not hud then
        return
    end
    
    local cs = hud:GetCustomStatic("cs_enemy_health")
    if cs == nil and obj:alive() then
        flags.timer_health_npc = time_global()+25000
        hud:AddCustomStatic("cs_enemy_health", true)
        local xml = CScriptXmlInit()
        xml:ParseFile("ui_enemy_health.xml")
        cs = hud:GetCustomStatic("cs_enemy_health")
        local w = cs:wnd()
        progress = xml:InitProgressBar("enemy_health", w)
    end

    if v > 0.005 then
        progress:Show(true)
        progress:SetProgressPos(obj.health*100)
        last_id = obj:id()
    else
        cs_remove()
    end
else
cs_remove()
end
end

function cs_remove()
    last_id = nil
    progress = nil
    local hud = get_hud()
    if hud and hud:GetCustomStatic("cs_enemy_health") then
        hud:RemoveCustomStatic("cs_enemy_health")
    end
end

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
5 часов назад, makdm сказал:

Чудес не бывает.

Выкладывайте все то, что вы делали и опишите что вы хотите. Подробно....

Возможно вы вообще идете не тем путем....

(в добавок к предыдущему): Даже если я поставлю совершенно другой постпроцесс (psychic.ppe), вызову функцию stop_postprocess, сохранюсь, и перезагружусь - почему-то вновь проигрывается постпроцесс который я вообще убрал (fire_hit). 

Моя цель: я реализовал после убийства определенного персонажа проигрывается нужный постпроцесс, его я зарегистрировал в xr_effects (ending_cutscene_54) + зарегистрировал и его уборку (ending_postprocess_cutscene_54):

Спойлер

function ending_cutscene_54()
level.add_pp_effector("fire_hit.ppe", 1111, true)
end

function ending_postprocess_cutscene_54()
level.remove_pp_effector(1111)
end

Ввел эти функции в логику рестриктора, чтобы оно проигралось:

Спойлер

[logic]
active = sr_idle@3

[sr_idle@3]
on_actor_inside = {+shakhter_seventh_dialog_end} %+psevdoshakhter_spawn% sr_idle@4

[sr_idle@4]
on_info = %=create_squad(smart_psevdo_squad:smart_psevdo)% sr_idle@5

[sr_idle@5]
on_info = {+psevdodeath} %=give_task(quest_killing_psevdoshakhter) =ending_cutscene_54 =ending_cutscene_54_2 =play_sound(end_cut54)% sr_idle@6

[sr_idle@6]
on_info = {+shakhter_punches} %=ending_postprocess_cutscene_54 =ending_anim_cutscene_54% sr_idle@7

[sr_idle@7]
on_game_timer = 30 | %+shakhter_puncher% sr_idle@nil

[sr_idle@nil]

Вроде как всё хорошо. Проигрывается всё хорошо, после того, как игра получила поршень shakhter_punches - постпроцесс убирается, но стоит после получения поршня сохранится и перезагрузить последнее сохранение - то постпроцесс будто и никуда не пропадал. Пробовал убрать эти фунцкции (что я раньше и упоминал) - и ничего, будто игра после перезагрузки сейва получает какой-то левый поршень, который и запускает этот постпроцесс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
16 часов назад, denis2000 сказал:

xr_logic.pstor_store(db.actor, "zat_b30_days_cnt", 0)

cnt = xr_logic.pstor_retrieve(actor, "zat_b30_days_cnt", 0)

Данный метод кажется перспективным. Если бы его использовать немного по-другому. Например:
 

Спойлер



local news_4 = ReadString("news_messege","news",ini_file("stalker_news_4.ltx"))
xr_logic.pstor_store(db.actor,"pk2_stalker_net_news_4", tostring(news_4))

function ReadString(iSec,sLin,fIni)
	if not fIni then fIni=system_ini() end
	return fIni:r_string(iSec,sLin)
end

По моей задумке, игра сохранит содержимое строки "news", а после вызова сохранённый параметр разметит в файле.


local read_4 = stalker_site_write_news("gamedata\\configs\\stalker_news_4.ltx")
xr_logic.pstor_retrieve(db.actor, "pk2_stalker_net_news_4", tostring(read_4))

Но игра вносит лишь параметр nil, говорящий о том, что, вероятно, никаких данных игра не сохранила.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
13 часов назад, Winzor сказал:

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

В рамках скрипта все работает корректно: после убийства НПС на которого настроена полоска она удаляется, но приходит новый колбек хита на другого НПС из этого же сквада (даже если ГГ не наносил ему хит!) и полоска появляется снова. Распознать это фейковый хит или же ГГ действительно его нанес в рамках этого скрипта НЕВОЗМОЖНО. Полоска удалиться только после полной зачистки сквада.


Neptun Что за действия выполняются этим кодом решительно непонятно:

3 часа назад, Neptun сказал:

local read_4 = stalker_site_write_news("gamedata\\configs\\stalker_news_4.ltx")

xr_logic.pstor_retrieve(db.actor, "pk2_stalker_net_news_4", tostring(read_4))

Поскольку pstor_retrieve никакую перемнную скрипта не устанавливает в считанное из хранилища значение.

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

Путь во мгле.
Связь времен.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
1 час назад, denis2000 сказал:

Что за действия выполняются этим кодом решительно непонятно:

Оно производит запись в указанном файле, с этим функция справляется, но я не понимаю, как записать в файл некую переменную, которая должна сохраниться из предыдущего действия. Переменная содержится в строке news = просто_набор_символов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
43 минуты назад, Neptun сказал:

как записать в файл некую переменную,

Разрабами движка ЗП не предусмотрена писанина в LTX файлы. 

Все переменные, которые меняются во время игры, пишутся в один файл - файл сохранение игры.

Оттуда же и считываются при загрузке.

Хотя разраб SGM мода попытался писать сохранения в отдельный файл, но все это так ...., что если хотите разобраться и повторить можете там подсмотреть.

Поэтому лучше используйте методы SAVE и LOAD для сохранения измененных данных.

З.Ы. Наглядный пример - это файл xr_statistic.script

Там постоянно меняются значения и все они сохраняются и считываются из сохранения.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

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

Expression    : !phrase_dialog->m_PhraseVector.empty()
Function      : CPhraseDialog::SayPhrase
File          : D:\prog_repository\sources\trunk\xrGame\PhraseDialog.cpp
Line          : 146
Description   : No available phrase to say, dialog[hello_dialog]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
5 минут назад, Metil сказал:

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

Expression    : !phrase_dialog->m_PhraseVector.empty()
Function      : CPhraseDialog::SayPhrase
File          : D:\prog_repository\sources\trunk\xrGame\PhraseDialog.cpp
Line          : 146
Description   : No available phrase to say, dialog[hello_dialog]

У НПС не прописан диалог встречи. Надо его (диалог) прописать в файл character_desc_локация, в профиль НПС под </supplies> вот это: <start_dialog>ID диалога</start_dialog>

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Благодорю

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Народ! Поделитесь если есть у кого нормальным распаковщиком  lanims.xr, без установки ActivePerl.


0000.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Добрый день!

Как добавить локацию в Atmosfear 3? Какие файлы надо править?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Приветствую 

Решил вытащить файлы, которые отвечают за смену имени и фото гг, но не знаю какие именно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Xenomorphom level_weathers.script


Pavel xrGame.dll

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

Путь во мгле.
Связь времен.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
1 час назад, Pavel сказал:

Приветствую 

Решил вытащить файлы, которые отвечают за смену имени и фото гг, но не знаю какие именно

Так я же вам скидывал уже готовую библиотеку с этой функцией (смена портрета ГГ, а вот зачем имя менять в скорее всего сюжетном моде, я не понимаю). Там внесена всего одна правка - смена портрета ГГ по скрипту. Вот: https://yadi.sk/d/GHB0HKCA1nUm-g

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
4 часа назад, Winzor сказал:

Так я же вам скидывал уже готовую библиотеку с этой функцией (смена портрета ГГ, а вот зачем имя менять в скорее всего сюжетном моде, я не понимаю). Там внесена всего одна правка - смена портрета ГГ по скрипту. Вот: https://yadi.sk/d/GHB0HKCA1nUm-g

Я помню, ещё раз спасибо, но смена имени также надо(по ходу игры должна произойти смена персонажей). 

Также я не понял при каких условиях меняется фото гг, это где-то нужно прописывать дополнительно? Я просто не работал с файлами dll и не понимаю как с ним работать

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
17 минут назад, Pavel сказал:

но смена имени также надо(по ходу игры должна произойти смена персонажей). 

Советую сразу задуматься над тем, как вы будете менять всю статистику в КПК ГГ, а так же вид от третьего лица. А то без этого будет совсем  криво.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
3 часа назад, makdm сказал:

Советую сразу задуматься над тем, как вы будете менять всю статистику в КПК ГГ, а так же вид от третьего лица. А то без этого будет совсем  криво.

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

Но пока с сюжетом моего мода можно и убрать раздел статистики, а потом постараюсь найти способ 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   2 пользователя онлайн