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

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


Halford

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

 

 

Функция прекрасно срабатывает вблизи ящика, но не работает если мы далеко

Функция прекрасно работает и далеко от ящика. Но предмет в ящике не сохраняется, если сделать сейв и потом его загрузить.

 

Мне посоветовали делать так, и все прекрасно работает.

function spawn_docs()
   local sobj = alife():object("heli_seif")
   if sobj and has_alife_info("take_zver_message") then
     local obj = level.object_by_id(sobj.id)
     if obj then
       spawn_item_in_inv("access_card", obj)
       spawn_item_in_inv("journal", obj)
     end
   end
end

function spawn_item_in_inv(spawn_item,npc)
	if not npc then 
		npc = db.actor 
	end
	local item = alife():create(spawn_item, 
		npc:position(),
		npc:level_vertex_id(),  
		npc:game_vertex_id(),
		npc:id())
	
	if npc:id() ~= db.actor:id() then
		-- Фикс пропадания доспавненного предмета при сейв/лоаде
		level.client_spawn_manager():add(item.id, -1, fix_spawn_item_in_inv, npc)  -- Калбек на выход item в онлайн
	end

	return item
end

function fix_spawn_item_in_inv(npc, id, item)
    npc:transfer_item(item, npc)
end

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

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


Ссылка на сообщение

Прошу помощи.

 

Написал диалог, на первый взгляд, вроде все правильно.

    <dialog id="job_juk_dialog">
        <phrase_list>
            <phrase id="0">
                <text>job_juk_dialog_0</text>
                <next>1</next>
            </phrase>
            <phrase id="1">
                <text />
                <next>111</next>
                <next>121</next>
                <next>131</next>
            </phrase>
            <phrase id="111">
                <text />
                <precondition>zaton_dialog.bandits_death</precondition>
                <next>11</next>
            </phrase>
            <phrase id="121">
                <text />
                <precondition>zaton_dialog.killers_death</precondition>
                <next>12</next>
            </phrase>
            <phrase id="131">
                <text />
                <precondition>zaton_dialog.all_alive</precondition>
                <next>13</next>
            </phrase>
            <phrase id="11">
                <text>job_juk_dialog_11</text>
                <next>21</next>
            </phrase>
            <phrase id="12">
                <text>job_juk_dialog_12</text>
                <next>22</next>
            </phrase>
            <phrase id="13">
                <text>job_juk_dialog_13</text>
                <action>dialogs.break_dialog</action>
            </phrase>
            <phrase id="21">
                <text>job_juk_dialog_21</text>
                <next>311</next>
                <next>312</next>
            </phrase>
            <phrase id="311">
                <text>job_juk_dialog_311</text>
                <give_info>job_kill_bandits</give_info>
                <action>dialogs.break_dialog</action>
            </phrase>
            <phrase id="312">
                <text>job_juk_dialog_312</text>
                <action>dialogs.break_dialog</action>
             </phrase>
            <phrase id="22">
                <text>job_juk_dialog_22</text>
                <next>321</next>
                <next>322</next>
            </phrase>
            <phrase id="321">
                <text>job_juk_dialog_321</text>
                <give_info>job_kill_killers</give_info>
                <action>dialogs.break_dialog</action>
            </phrase>
            <phrase id="322">
                <text>job_juk_dialog_322</text>
                <action>dialogs.break_dialog</action>
            </phrase>
        </phrase_list>
    </dialog>

Но при клике на первую фразу - вылет. Что тут не так?

stack trace:



001B:0076105B xrLUA.dll
001B:02DCE637 xrGame.dll
001B:02DD20A0 xrGame.dll

 

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

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


Ссылка на сообщение

 

 

Почему не поставил прекондишен сразу перед фразой (зелёным выделено) и убрать не нужную секцию ?

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

function bandits_death(actor, npc)
  if not has_alife_info("job_kill_bandits") then
        return true
  end
        return false
end

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

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


Ссылка на сообщение

 

 

Ну так что не ясно: видимо условие в прекондишене не выполняется

В том-то и дело, что условие выполняется. Ну в общем, я плюнул и сделал все по другому.

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

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


Ссылка на сообщение

 

 

просто поменял все имена esc_unik_npc на gan_store и выбивает ошибку вот лог

Значит, не везде поменял :)

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

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


Ссылка на сообщение

Словил вылет:

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ...shing\s.t.a.l.k.e.r\gamedata\scripts\xr_logic.script:614: attempt to call field '?' (a nil value)

Ругается на строчку (выделена красным жирным)

if infop.params then
      xr_effects[infop.func](actor, npc, infop.params)
     else
      xr_effects[infop.func](actor, npc)
     end

 

в функции pick_section_from_condlist(actor, npc, condlist). В чем может быть причина?

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

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

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


Ссылка на сообщение

@naxac, Спасибо, сам домыслил. Хотел отписаться, а мне уже ответили.

 

Еще вопрос:

 

Удаляю труп:

    if obj.m_story_id == 54554 then
      alife():release(obj, true)
    end

Удаляется отлично.

Прописываю условие

    if obj.m_story_id == 54554 and has_alife_info("test_bubna_off") then
      alife():release(obj, true)
    end

В логику пишу

[known_info]
test_bubna_off

Обыскиваю труп, удаляю  - не удаляется, хоть тресни. Что не так?

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

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

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


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

В том-то и беда, что поршень не выдается. А удаление вызываю из меню кнопкой, стоя РЯДОМ с трупом (пробую :) ). Если прописать любой выданный поршень - удаляет, как миленького.

 

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

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

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

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


Ссылка на сообщение

 

 

А труп у тебя как заспавнен, скриптом или оллспавном ?Что в кастом_дате ? Ты точно уверен, что поршня нет ? Пропиши на этот поршень любой таск из текущих.

Заспавнен не труп, а живой сталкер оллспавном. Я его убиваю, обыскиваю, а поршень не выдается, неясно - почему.

 

Сталкер имеет свою логику, анимки, звуки, пути - все прекрасно пашет. А логику смогу вечером выложить, когда буду дома.


 

 

Я так понял это в Sound Editor нужно делать?

Да. Хотя есть и сторонние проги.

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

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


Ссылка на сообщение

 

 

Можно воспользоваться программой попроще, SAVandT называется.

Ага, я про нее и говорил.


BFG, логика сталкера.

[logic]


active = walker
on_death = death

[walker]
path_walk = predbannik_bubna1_walk
path_look = predbannik_bubna1_look
on_actor_dist_le_nvis = 30| remark@pred_bubna1
on_info = {+bubna_first_dialog} walker@pred_bubna3

[remark@pred_bubna1]
anim = hello
snd = pred_bubna_hello
target = actor
on_signal = sound_end| walker@pred_bubna2

[walker@pred_bubna2]
path_walk = predbannik_bubna1_walk
path_look = predbannik_bubna1_look
meet = meet@bubna
on_info = {+bubna_first_dialog} walker@pred_bubna3

[walker@pred_bubna3]
path_walk = predbannik_bubna2_walk
path_walk = predbannik_bubna2_look

[meet@bubna]
meet_state = 15|guard@wait
meet_state_wpn = 15|backoff@threat_weap
victim = 15|actor
victim_wpn = 15|actor
use = true
use_wpn = false
syndata = backoff@threat_weap
meet_dialog = predbannik_bubna_dialog

[death]
on_info = %+agr_krot_dead +sar2_death_19%

[known_info]
test_bubna_off

 


Сталкеры, а секция [known_info] вообще из файла логики читается?

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

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


Ссылка на сообщение

@dsh, вот именно. То-то у меня инфопоршень при обыске трупа не выдавался. Теперь ясно.

 

BFG, из кастом_даты, я согласен. Но в оллспавне в кастом_дате только ссылка на файл логики. И значит, писать в логике секцию known_info в конфиге бессмысленно, так получается?

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

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

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


Ссылка на сообщение

Кто подскажет, как отловить момент создания аномалии при активации артефакта? И как ее через некоторое время убрать/деактивировать?

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

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


Ссылка на сообщение
Через биндер - на net_spawn'е - можно отловить выход аномалии в онлайн.

Был бы очень признателен за примерчик :)

 

 

 

Удалить можно через таймер - если в моде есть таймеры на подобии амк-шных.

Тоже про таймеры подумал, как раз АМК-шные таймеры и имеются.

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

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

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


Ссылка на сообщение

 

 

биндер - это скриптовый класс, наследуемый от движкового класса object_binder, который можно "прикреплять" к клиентским объектам. Подробнее можно почитать здесь. Его метод nеt_spawn срабатывает при выходе объекта в онлайн.

Что такое биндер, я знаю. Не совсем понятно, как именно отловить активацию конкретного арта и появление конкретной аномалии, для чего и просил поделиться примером.

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

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


Ссылка на сообщение

 

 

Ведь ее что-то создает. Вот этот момент, вероятно, тебе и нужен.

По логике, объект (артефакт) в момент создания аномалии уничтожается, наверно по этому пути надо идти.

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

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


Ссылка на сообщение

 

 

Его нужно бросить,

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

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

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


Ссылка на сообщение

 

 

Ну значит отслеживать, когда перестал существовать арт из пистолетного слота, и появилась аномалия.

Алгоритм понятен. Непонятно, как это ручками сделать. :?))

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

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


Ссылка на сообщение

 

 

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

Вот я и не пойму, что это за скрипт, как обзывается. Если что, мод на базе ОГСМ.

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

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


Ссылка на сообщение

 

 

А так, открой конфиг любого артефакта, который можно активировать, и посмотри наличие script_binding. Вот скрипт, который там указан, скорее всего активацией и занимается.

А вот нет такого параметра, совсем нет.

  • Согласен 2

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

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


Ссылка на сообщение

 

 

секция [af_base]

И в [af_base] нету.

[af_base]:identity_immunities


hud = artefact_hud
animation_slot = 11
allow_inertion = true
slot = 1
attach_angle_offset = 0,0,0
attach_position_offset = -0.1,-0.1,0
attach_bone_name = bip01_root
inv_grid_width = 1
inv_grid_height = 1
belt = true
af_actor_properties = on
actor_properties = on

[artefact_hud]
orientation = 0, 0, 0
position = 0, 0, 0
visual = weapons\artefact\wpn_artefact_hud.ogf
anim_idle = idle
anim_idle_sprint = idle_sprint
anim_hide = holster
anim_show = draw
anim_activate = activate

 


 

 

оригинале ТЧ у артефактов вообще не было биндера, насколько я помню.

Не было. Походу и сейчас нету.

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

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


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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