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

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

@Graff46 это тебе в исходники надо лезть, выяснять. Я не встречал никакого описания для action(), ни вменяемого, ни невменяемого. Каждый раз приходиться из исходников эту информацию по крупицам вытаскивать. А штука эта мощная, на мой взгляд.

Изменено пользователем dsh
Ссылка на комментарий
11 минут назад, dsh сказал:

это тебе в исходники надо лезть

Я плохо разбираюсь в си подобных, тем более анализировать их код... Для общего достояния, разбирающиеся люди, описали бы класс в теме по функциям и классам...

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

Таак.. Вопросы такие. Как:

 

1) Удалить оружие из инвентаря НПС? Использую:

 for a = 1,65534 do  
        local se_obj = alife():object(a)
        if se_obj and se_obj:section_name() == "wpn_saiga_uniq" then
            alife():release(se_obj, true)
        end
    end

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

 

2) Заспавнить НПСу оружие в инвентарь, чтобы он мог его использовать? Юзаю такую ф-ю:

for k,v in pairs(db.storage) do
        local obj = level.object_by_id(k)
        if obj then
            if obj:profile_name()=="npc_name" then
                ogse.spawn_item_in_inv("wpn_saiga",obj)
                break
            end
        end
    end

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

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

Дано: скриптовая эмуляция невидимых слотов (нож, болт, ПДА, бинокль). У меня два бинокля и при попытке вставить бинокль в слот, где уже есть другой, происходит движковый вылет, лог,:

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

0023:0494C077 xrGame.dll
0023:0494C513 xrGame.dll
0023:049A8C3A xrGame.dll
0023:049A7BD6 xrGame.dll
0023:049892B0 xrGame.dll
0023:049A91B0 xrGame.dll
0023:049892B0 xrGame.dll
0023:0494AC39 xrGame.dll
0023:04A111DC xrGame.dll
0023:04737410 xrGame.dll

Есть ли где подсмотреть готовое решение / костыль / затычку от вылета? Поиском решение не нашёл, DMX мод пока не предлагать, там немного другая система реализации скриптовых слотов, нежели Кираговская, попытки совместить решения оттуда не увенчались успехом.

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

@HellRatz, попробуй так

  local obj = npc:object( "wpn_saiga_uniq" )
	  if obj then
	    local sobj = alife():object( obj:id() )
	    if sobj then alife():release( sobj, true ) end
	  end

npc - это непись, у которого забираем пушку

  local wpn = alife():create( "wpn_saiga", vector():set( 0, 0, 0 ), 0, 0, obj:id() )
	  level.client_spawn_manager():add( wpn.id, 0,
	    function( npc, id, obj )
	      npc:transfer_item( obj, npc )
	    end,
	  obj )

Тут obj - непись, которому спавним оружие.

  • Спасибо 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

Народ, кто разбирается в математике, подскажите пожалуйста. Вот есть у меня два вектора: направление на объект и направление камеры. И есть у меня угол между этими векторами. Так вот, мне нужно определить, что камера смотри на этот объект. Я могу считать, что если камера на расстоянии 2-ух метров от объекта и угол между этими векторами меньше, скажем, 0.3, то камера смотрит на объект. Но если расстояние будет уменьшаться, ведь допустимый угол должен увеличиться, т.к. объект становится больше в камере. Как мне посчитать этот угол для меньшего расстояния, если я задаю, что на расстоянии 2 метра он должен быть меньше 0.3?

 

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

Считаешь, что вокруг центра объекта у тебя сфера радиусом Radius() + N. Находишь пересечение направления камеры и этой сферы. Если пересекаются, значит камера смотрит на объект. N подбираешь, как удобней. Может быть N будет вообще 0 и хватит движкого Radius.

  • Спасибо 1
Ссылка на комментарий

@abramcumner я правильно этот пример перевел на lua?

function is_actor_looking_to_pos( pos, radius )
  local k = vector():sub( pos, device().cam_pos ):normalize()
  local b = k:dotproduct( device().cam_dir )
  local c = k:dotproduct( k ) - radius * radius
  local d = b * b - c
  if d >= 0 then
    local sqrtfd = math.sqrt( d )
    local t1     = -b + sqrtfd
    local t2     = -b - sqrtfd
    local min_t  = math.min( t1, t2 )
    local t      = min_t > 0 and min_t or math.max( t1, t2 )
    return t > 0
  end
  return false
end

 

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

@dsh, нормализация не нужна. И иф не нужен(если тебе не нужна точка пересечения). То есть как-то так будет:


function is_actor_looking_to_pos( pos, radius )
  local k = vector():sub( pos, device().cam_pos )
  local b = k:dotproduct( device().cam_dir )
  local c = k:dotproduct( k ) - radius * radius
  local d = b * b - c
  return d >= 0
end

  • Спасибо 1
Ссылка на комментарий

Консультация нужна....

В-общем, не секрет. что в Сталкере иногда у объектов\рестрикторов зависает (равна нулю) логика. Простой пример - на двери Сидоровича нет надписи "Открыть" - дверь открывается только выстрелом из дробовика. В НС 201 камрад lsclon решила эту проблему. Например, из bind_physic_object.script было

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

 


function generic_physics_binder:load(reader)
    self.loaded = true
    object_binder.load(self, reader)
    xr_logic.load_obj(self.object, reader)
end

Стало:


function generic_physics_binder:load( reader )
    object_binder.load( self, reader )
    xr_logic.load_obj( self.object, reader )
    -- если потерялась логика -- lsclon --
    if self.st.loaded_ini_filename then
        self.loaded = true
    end
end

 

 

 

Я перенес эти правки в bind_physic_object.script, bind_heli.script, bind_restrictor.script в мод 2золотой Шар" - работает - логика восстанавливается.А вот в ЧН функция generic_physics_binder:load(reader) выглядит по другому:

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

 


function generic_physics_binder:load(reader)
    self.loaded = true
    printf("generic_physics_binder:load(): self.object:name()='%s'", self.object:name())
    object_binder.load(self, reader)
    set_save_marker(reader, "load", false, "physics_binder")
    xr_logic.load_obj(self.object, reader)
    set_save_marker(reader, "load", true, "physics_binder")
end

Я её изменил таким образом:


function generic_physics_binder:load(reader)
    -- self.loaded = true
    printf("generic_physics_binder:load(): self.object:name()='%s'", self.object:name())
    object_binder.load(self, reader)
    set_save_marker(reader, "load", false, "physics_binder")
    xr_logic.load_obj(self.object, reader)
    set_save_marker(reader, "load", true, "physics_binder")
    if self.st.loaded_ini_filename then
        self.loaded = true
    end    
end

 

 

 

логика объектов\рестрикторов восстанавливается, но вопрос всё же есть - правильно ли я сделал?

И еще вопрос - можно ли эту проверку добавлять в bind_monster.script:

function generic_object_binder:load(reader)
    self.loaded = true
    set_save_marker(reader, "load", false, "generic_object_binder")
    object_binder.load(self, reader)
    xr_logic.load_obj(self.object, reader)
    if self.object:clsid() == clsid.script_trader then
        trade_manager.load(self.object, reader)
    end
    set_save_marker(reader, "load", true, "generic_object_binder")
end
Изменено пользователем nasar75

AMD Athlon II X2 250, NVIDIA GTS 450, RAM 8.0 GB, WIN 7/64  правки Золотой Шар

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

@nasar75 я бы посоветовал не заниматься борьбой с последствиями, а один раз исправить причину этого. Вот тут можно посмотреть, в чем причина и один из вариантов исправления:

https://github.com/dsh2dsh/op2ogse/commit/f726609396ce7115ee4cd86fcc7cc7a314cf1349

 

  • Полезно 4
Ссылка на комментарий

@dsh дык это понятно - проще не допустить болесть, чем её лечить. НО авторы модов почему-то не учитывают этого, и в сейв пишутся объекты с нулевой логикой. А потом игроки пишут:

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

 

Помогите, не работает дверь на Свалку!

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

Помогите. не приходит смс в нужном месте!

Помогите, прихожу в церковь - а ничего не происходит!!!

 

И вопрос таки повторю - правильно ли я вставил код проверки?

да, а скрипт проверки логики из ОП-2 я пихаю во все моды сразу - с небольшой модификацией - без abort ( обычно это вылет на первом объекте), но с проверкой рестрикторов

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

 


 -- сообщение по побившейся логике физобъектов и вертолетов
  local s_ini = obj:spawn_ini()
  if not st.ini_filename and s_ini and logic_not_empty(obj, s_ini) then
    if obj:clsid() == clsid.script_phys or obj:clsid() == clsid.script_heli or obj:clsid() == clsid.script_restr
--        or ((IsMonster[obj:clsid()] or IsStalker[obj:clsid()]) and obj:alive())
--        or ((IAmAStalker[obj:clsid()] or IAmAMonster[obj:clsid()]) and obj:alive())
    then
         news_manager.send_tip(db.actor,"У объекта "..obj:name().." повисла логика.")    
         dbglog("У объекта "..obj:name().." повисла логика.")
--         printf("У объекта "..obj:name().." повисла логика.")
--        abort("У объекта "..obj:name().." повисла логика.")         
--        if not amk.has_timer("no_save") and not db.debug then
--            amk.start_timer("no_save", 5)
--            amk.start_timer("zonedocs_gg_kill",3,0)
--        end
    end
  end

.....

-- у объекта есть "непустая" логика
function logic_not_empty(npc, ini)
    return ini:section_exist("logic") and (
        ini:line_exist("logic", "cfg") or (ini:line_exist("logic", "active") and ini:r_string("logic", "active") ~= "nil")
    )
end

 

 

 

 

Изменено пользователем nasar75
  • Полезно 1

AMD Athlon II X2 250, NVIDIA GTS 450, RAM 8.0 GB, WIN 7/64  правки Золотой Шар

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

@nasar75 ну дык я же как раз и показал решение, что бы в сейв не писалась нулевая логика. Тогда не понадобится все остальное.

 

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

Добрый день.

Чтобы через скрипт ui_main_menu.script получить определённую сумму денег надо в

elseif     dik==DIK_keys.DIK_F3 then
self:ppe_menu_show()

заменить self:ppe_menu_show() на db.actor:give_money(1000)

Как изменить строку db.actor:give_money(1000) чтобы получить какой либо предмет ?

Например водку или патроны.

 

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

Здравствуйте. Нужно удалить НПС или монстра при попадании в него из оружия. На сколько я знаю, методом :release() можно удалять только неживые объекты. Есть такой кусочек кода (только не бейте если что:)):

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

if mob then
if mob:alive() and mob:who_hit_name()=="single_player" then  
  mob:kill(mob)
         alife():release(alife():object(mob:id()),true)


Насколько этот кусочек стабилен и не вызовет ли он в дальнейшем проблем (вроде боя сейвов)? Есть ли способ удалить живой объект без таких последствий?
И еще: аналогичен ли способ "mob:kill(mob)" способу "mob.health = 0"?

New Anomalies 1.1 ☢☢☢ "Смерть-лампа" ☢☢☢ Дисраптор

Русификатор для игры Vendetta: Curse of Raven's Cry

Ссылка на комментарий
9 часов назад, Jekyll сказал:

Насколько этот кусочек стабилен и не вызовет ли он в дальнейшем проблем (вроде боя сейвов)?

mob:kill(mob)
alife():release(alife():object(mob:id()),true)

Весь Сталкер построен на апдейтах(обновление по таймеру с определенным интервалом), соответственно движку, что бы выполнить какое-то сложное действие над объектом, требуется один\несколько апдейтов. А твой код будет выполнен в один апдейт, соответственно метод kill не будет полноценно обработан для объекта, и он будет сразу удален. Если у тебя этот моб будет под гулаговой логикой или в моде используется какая-то схема, которая прописывает рестрикторы мобам - будет вылет или зависание в скриптах(= битый сейв).

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

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

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

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

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

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

Войти

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

Войти
×
×
  • Создать...