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

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

2 часа назад, naxac сказал:

CMincer - клиентский класс, se_zones.se_zone_anom - скриптовый серверный, ZS_PORT - параметр для конфигов, zone_port_s - название константы класса в clsid для скриптов. Новая игра не нужна

Вот спасибки. Давно хотел этот момент для себя прояснить, да все недосуг было.

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

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

Для движения машин используется такая конструкция:

action(CCar, move(move.on + move.fwd, 30), cond(cond.move_end, 3000)) --движение

Мне интересно за что отвечают параметры ф-ций, а именно 2-й параметр ф-ции move, (тот который 30) и для чего нужен cond и что значат пара его параметров? Также 2-ым параметром у cond  была замечана константа time_infinite...

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

@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

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

GTA 3 MAP X-Ray | NFS U:2 MAP X-Ray | RTCW MAP X-Ray | L2D | Куча раритетных модов на моем облаке — на память о былом.

JNCR — Coming Soon...

i5-10400F / RAM 16GB / GTX 1660 Super / 1TB HDD+256GB SSDm2 / Win 11 PRO x64 / Samsung Curved 27" x2


Подарки

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

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

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

    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

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

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

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

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

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

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

    Войти

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

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

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

    AMK-Team.ru

    ×
    ×
    • Создать...