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

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

Нужен скриптер, возможно ли переделать скрипт из мода Dynamics Helmets на ЗП в ТЧ? Поменял только названия визуалов, вылет.

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

[26.09.20 15:11:25.868] *********************************************************************************
[26.09.20 15:11:25.868] [print_output([CScriptEngine::lua_pcall_failed])] SCRIPT RUNTIME ERROR:
....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:125: bad argument #1 to 'find' (string expected, got nil)
stack traceback:
    [C]: at 0x7ff92d71b8d8
    [C]: in function 'find'
    ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:125: in function 'str_explode'
    ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:68: in function 'update'
    ...l.k.e.r - shadow of chernobyl\gamedata\scripts\bind_stalker.script:340: in function <...l.k.e.r - shadow of chernobyl\gamedata\scripts\bind_stalker.script:214>
[26.09.20 15:11:25.868] *********************************************************************************
[26.09.20 15:11:25.868] 
FATAL ERROR

[error]Expression    : FATAL ERROR
[error]Function      : CScriptEngine::lua_pcall_failed
[error]File          : c:\projects\ogsr-engine\ogsr_engine\common_ai\script_engine.cpp
[error]Line          : 52
[error]Description   : [CScriptEngine::lua_pcall_failed]: ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:125: bad argument #1 to 'find' (string expected, got nil)

[26.09.20 15:11:25.868] ***************************[ScriptCrashHandler]**********************************
[26.09.20 15:11:25.868] stack traceback:
    [C]: at 0x7ff92d71b8d8
    [C]: in function 'find'
    ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:125: in function 'str_explode'
    ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:68: in function 'update'
    ...l.k.e.r - shadow of chernobyl\gamedata\scripts\bind_stalker.script:340: in function <...l.k.e.r - shadow of chernobyl\gamedata\scripts\bind_stalker.script:214>
[26.09.20 15:11:25.868]     Locals: 
[26.09.20 15:11:25.868]      string (*temporary) : ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:125: bad argument #1 to 'find' (string expected, got nil)
[26.09.20 15:11:25.868]     End
[26.09.20 15:11:25.868]     Locals: 
[26.09.20 15:11:25.868]      nil (*temporary) : [not available]
[26.09.20 15:11:25.868]      string (*temporary) : .
[26.09.20 15:11:25.868]      number (*temporary) : 1.000000
[26.09.20 15:11:25.868]      boolean (*temporary) : true
[26.09.20 15:11:25.868]      string (*temporary) : string expected, got nil
[26.09.20 15:11:25.868]      string (*temporary) : bad argument #1 to 'find' (string expected, got nil)
[26.09.20 15:11:25.868]     End
[26.09.20 15:11:25.868]     Locals: 
[26.09.20 15:11:25.868]      string div : .
[26.09.20 15:11:25.868]      nil str : [not available]
[26.09.20 15:11:25.868]      number pos1 : 1.000000
[26.09.20 15:11:25.868]      number pos2 : 1.000000
[26.09.20 15:11:25.868]      nil clear : [not available]
[26.09.20 15:11:25.868]      nil conv : [not available]
[26.09.20 15:11:25.868]      Table: t
[26.09.20 15:11:25.868]      nil cpt : [not available]
[26.09.20 15:11:25.868]      nil pos : [not available]
[26.09.20 15:11:25.868]     End
[26.09.20 15:11:25.868]     Locals: 
[26.09.20 15:11:25.868]     End
[26.09.20 15:11:25.868]     Locals: 
[26.09.20 15:11:25.868]      Userdata: self
[26.09.20 15:11:25.868]              Table: self.st
[26.09.20 15:11:25.868]              number self.next_restrictors_update_time : 28190.000000
[26.09.20 15:11:25.868]              boolean self.weapon_hide : false
[26.09.20 15:11:25.868]              boolean self.bCheckStart : false
[26.09.20 15:11:25.868]              Userdata: self.weather_manager
[26.09.20 15:11:25.868]                      table self.weather_manager.weather_list : [...]
[26.09.20 15:11:25.868]                      number self.weather_manager.update_time : 10000.000000
[26.09.20 15:11:25.868]                      string self.weather_manager.update_level : l01_escape
[26.09.20 15:11:25.868]                      number self.weather_manager.weather_change_day : 1.000000
[26.09.20 15:11:25.868]              Userdata: self.actor_detector
[26.09.20 15:11:25.868]                      number self.actor_detector.init_time : -1.000000
[26.09.20 15:11:25.868]      number delta : 0.000000
[26.09.20 15:11:25.868]      number time : 27990.000000
[26.09.20 15:11:25.868]     End

Вот сам скрипт:

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

----------------------
-- File:   Visuals
-- Author: Shoker, Mechanic
-- Правки: Antnigm, Redix
-- Меняет визуал ГГ в зависимости от одетого на него шлема
----------------------


-- Таблица секций брони, а также визуалов
--[[
local visuals = {
    секция_брони = {
        секция_шлема = путь к моделе 
        ...
                }
    ...
}
]] 
-- Если шлем не нужен, то ничего не пишем

local visuals = {
    without_outfit = { 
        helm_respirator            = "actors\\novice\\green_stalker_antigas",
                },
    novice_outfit = { 
        helm_respirator            = "actors\\novice\\green_stalker_antigas",
                },
    stalker_outfit = {
        helm_respirator         = "actors\\novice\\green_stalker_antigas",
                },
    svoboda_light_outfit = {
        helm_respirator            = "actors\\novice\\green_stalker_antigas",
                },
    dolg_outfit = {
        helm_respirator            = "actors\\novice\\green_stalker_antigas",
                },        
    svoboda_heavy_outfit = {
        helm_respirator            = "actors\\novice\\green_stalker_antigas",
                },
    specops_outfit = {
        helm_respirator            = "actors\\novice\\green_stalker_antigas",
                },            
    military_outfit = {
        helm_respirator         = "actors\\novice\\green_stalker_antigas",
                },        
    dolg_heavy_outfit = {
        helm_respirator            = "actors\\novice\\green_stalker_antigas",
                },                    
}

local otf  
local helm
local curent_vis
local helm_tbl
local new_model

function update()
otf = db.actor:item_in_slot(7)
helm = db.actor:item_in_slot(11)
curent_vis = db.actor:get_visual_name()

if otf==nil and helm==nil then 
    db.actor:set_visual_name("actors\\hero\\hero_novice")
    return
end

if otf~=nil and helm==nil then
    local otf_vis_name = str_explode(".", get_ltx(otf:section(), "actor_visual", "str"))[1]
    if otf_vis_name~=curent_vis then
        db.actor:set_visual_name(otf_vis_name)
    end
else
-------------------------------------
    if otf==nil and helm~=nil then 
        helm_tbl = visuals["without_outfit"]
    else 
        helm_tbl = visuals[otf:section()]
    end
    if helm_tbl~=nil then
        new_model = helm_tbl[helm:section()]
        if new_model~=nil then
            if new_model~=curent_vis then
                db.actor:set_visual_name(new_model)
            end
        end
    end
-------------------------------------
end

end


-- Получить строку из LTX файла
function get_ltx(l_name,l_string,type)
if system_ini():section_exist(l_name) and system_ini():line_exist(l_name, l_string) then

    if type=="bol" then
        return system_ini():r_bool(l_name, l_string)
    end
    if type=="num" then   -- целое число
        return tonumber(system_ini():r_u32(l_name, l_string))
    end
    if type=="num_float" then   -- число с запятой
        return tonumber(system_ini():r_float(l_name, l_string))
    end
    if type=="str" then
        return tostring(system_ini():r_string(l_name, l_string))
    end
    if type==nil then
        return system_ini():r_u32(l_name, l_string)
    end

end

return nil
end

function str_explode(div,str,pos1,pos2,clear, conv)
    local t={}
    local cpt, pos

    if pos1 == nil then pos1 = 1 end
    if pos2 == nil then pos2 = pos1 end

    local cpt1 = string.find (str, div, pos1, true)
    local cpt2 = string.find (str, div, pos2, true)

    if cpt1 and cpt2 then

        if cpt2-cpt1 > 5 then
            cpt = cpt1
            pos = pos1
        else
            cpt = cpt2
            pos = pos2
        end

        repeat
            if clear then
                table.insert( t, trim(string.sub(str, 1, cpt-1)) )
            else
                table.insert( t, string.sub(str, 1, cpt-1) )
            end
            str = string.sub( str, cpt+string.len(div) )
            cpt = string.find (str, div, pos, true)
        until cpt==nil
    end
    if clear then
        table.insert(t, trim(str))
    else
        table.insert(t, str)
    end

    if conv then 
        t = convert_tbl(t)
    end

    return t
end

125 строка - local cpt1 = string.find (str, div, pos1, true)
Заранее спасибо

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

В xray_ext есть скриптовой метод задающий путь до визуала для актора - set_actor_visual(string<path>), не думал попробовать?

В ОГСР скорее всего тоже что то есть, не знаю.

Как показал lua_help в ТЧ нет методов set_visual_name, get_visual_name, так что однозначно правим движок:big_boss:

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

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

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

Ребят, а как вообще реализована механика ворон в Сталкере? Насколько я понял - они спавнятся и "беспалева" преследуют ГГ по небу, имитируя бурную воронью деятельность. А есть возможность задать воронам вектор движения? По вызову скрипта, например, чтобы летела ворона от края до края локи?

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

Доброго времени!

Сильно заинтересовал такой вопрос - в ТЧ есть масхалат, точнее маскировочный экзоскелет, в котором можно некоторое время шариться под самым носом у врагов и они только головами водят, но не трогают. Как реализовать такую маскировку в ЗП, если это реально?

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

@mdm64, вставлю 5 копеек и не более. Не утверждаю, т.к не скриптер. Но большинство кода можно перенести из платформы в платформу, что и делали первые модификации на ЗП — там тянули фишки из модов на ТЧ (Те же контейнеры для артов). Думаю, если у тебя есть скрипт этого экзоскелета, можно попробовать его адаптировать напрямую. Во всяком случае, я бы начал с этого, чем писать с нуля.

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

@HellRatz, Согласен, идея более чем разумная. Мы тут с моей головой посовещались и я решил... высказать простое предположение по возможной реализации "невидимки" - по сути, если вспомнить реакцию враждебных НПС из той же Солянки, требуется при надевании такого масхалата прописать запрет на стрельбу со стороны врагов и всё. И будет тот же самый эффект. Я хорошо помню, что неписи даже какое-то время шли за мной с оружием, кричали "враг, враг!", но не стреляли. Но честно говоря, я сейчас не представляю, как эту возможность реализовать. Понятно, что требуется скрипт и инфопоршни, чтобы при одевании масхалата выдавался поршень и скрипт отрабатывал запрет ведения огня любыми неписями... Думается, так оно и реализовано, это по мне так самый простой вариант "Невидимки". Хотя, может быть и ошибаюсь...

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

Как реализовать такую маскировку в ЗП, если это реально?

 

@mdm64, один из вариантов реализации маскхалата можно подсмотреть здесь.

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

@Jurok, Этот параметр является штатным для движка ЗП - "npc_blindness_koeff" (видимость ГГ НПС, в метрах.)? или это только для правленого движка?

@Jurok, Если я правильно понимаю, в этом способе работают следующие файлы:

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

npc_blindness_koeff             = 19 ;видимость ГГ НПС, в метрах.

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

function ReadOutfitBlindnessKoeff(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"npc_blindness_koeff") then
      return ltx:r_float(section,"npc_blindness_koeff")
   else
      return 80
   end
end


function transparent_gg()
    local  range1, id, obj_around, alife_obj, dist_act_npc
    local outfit_in_slot=db.actor:item_in_slot(7)
    if db.actor == nil then
        return nil
    end  
    if db.actor:item_in_slot(7) == nil then
        range1 = 80  
    elseif outfit_in_slot~=nil and ReadOutfitBlindnessKoeff(outfit_in_slot:section())>0.0 then
        range1 = ReadOutfitBlindnessKoeff(outfit_in_slot:section())
    else
        range1 = 80
    end  

    for id = 1, 65534 do
        obj_around = level.object_by_id(id)  
        if obj_around ~= nil and IsStalker(obj_around) then   
            alife_obj = alife():object(id)
            if alife_obj then  
                dist_act_npc = db.actor:position():distance_to(alife_obj.position)
            end
            if dist_act_npc <= 120 then  
                if obj_around then  
                    obj_around:set_range(range1)  
                end
            else
                if obj_around then  
                    obj_around:set_range(80)
                end
            end
        end
    end
end

function timer_trans()
    timer_transparent = timer_transparent + 1
    if timer_transparent >= 50 then
        timer_transparent = 0
        transparent_gg()
    end
end

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

    trans_outfit.timer_trans() -- уменьшение дистанции видимости при одевании соотв. броников
    
    -- јпдейт доступности дл¤ симул¤ции.
    simulation_objects.get_sim_obj_registry():update_avaliability(alife():actor())

    bind_stalker_ext.actor_on_update(self,delta)
    
    --alun_utils.debug_write("actor update END 2")
end

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

mus_vol = 0
amb_vol = 0
b_discard_settings_shown = false
timer_transparent = 0 --маскхалат

Я ничего не пропустил или всё-таки что-то не доглядел?

Изменено пользователем mdm64
Ссылка на комментарий
2 hours ago, mdm64 said:

высказать простое предположение по возможной реализации "невидимки

Один из вариантов - это использовать enemy_callback. Т.е. если невидимка в слоте, то всем мобам этот коллбек отвечает, что актор невкусный и они его игнорируют.

  • Согласен 2
  • Полезно 3
Ссылка на комментарий
2 часа назад, mdm64 сказал:

Думается, так оно и реализовано. Хотя, может быть и ошибаюсь...

Ошибаешься.

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

большинство кода можно перенести из платформы в платформу

Я как-то тоже подумывал перенести "невидимку" на КоК, там конечно есть свой "маскхалат", но вот хочется именно тот самый скрипт невидимки от @НаноБот, там используется некий "инвиз", что за зверь и где он в скриптах вообще объявляется я так и не нашёл(или плохо искал), или может он из движка не знаю, так и забил на это.

 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

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

возможной реализации "невидимки"

Как уже сказал @dsh, самый простой вариант добавить новое условие в функцию "is_enemy()" в "xr_combat_ignore.script".

Если надет нужный броник, то функция возвращает false.

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

function is_enemy(obj, enemy, st, not_check_sim)

	...

	if st.enabled == false then
		return true
	end

	-- МаскХалат
	if enemy:id() == db.actor:id() then
		local bronik = db.actor:item_in_slot(7)
		if bronik and bronik:section() == "maskhalat" then
			return false
		end
	end

	...

end

 

 

  • Согласен 1
  • Полезно 3

S.T.A.L.K.E.R. CoP Objects (upd 28.10.24)

Ссылка на комментарий
11 минут назад, WinCap сказал:

самый простой вариант

Ну не всё так просто - это не реализация "невидимки", это всего лишь некий игнор, враг просто не будет атаковать, но по факту актора будут все видеть, и даже на него реагировать. И назвать такое "невидимкой" у меня лично язык не повернётся, ИМХО. А вот сделать полную реализацию невидимки, когда мобы актора не просто игнорят - а полностью не видят и не реагируют - вот это уже "невидимка".

  • Согласен 4
 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

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

@Romann, Соглашусь полностью, но именно так была реализована "невидимка" в Солянке, просто другой реализации я не видел.

Я бы даже сказал так - это именно маскхалат, когда враги тебя ощущают, но не видят отчётливо настолько, чтобы стрелять.

А "невидимка" это да - когда сидят "три мартышки"...:biggrin: и четвёртая с КПК....:lol3:

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

@mdm64, вариант скрипта, с проверкой расстояния и времени суток:

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

	if enemy:id() == db.actor:id() then
		local bronik = db.actor:item_in_slot(7)
		if bronik and bronik:section() == "maskhalat" then
			local dist = 10		-- ночью
			if in_time_interval(10, 17) then 
				dist = 50		-- днем
			else if in_time_interval(6, 21) then
				dist = 35		-- утром/вечером
			end
			if obj:position():distance_to(enemy:position()) > dist then
				return false
			end
		end
	end

 

 

  • Нравится 1
  • Полезно 1

S.T.A.L.K.E.R. CoP Objects (upd 28.10.24)

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

@WinCap, А ведь на этот скрипт можно "прикрутить" совершенно уникальные условия для выполнения тех или иных квестов!

И в частности, с фотографированием нужных объектов или НПС... Вот только нигде пока не нашёл аддона с фотиком, как в Фотографе...:biggrin:

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

А возможно заспавнить физический объект? Например, деревянный ящик, такой, как рядом с Прапором? На котором магнитофон стоит.

Делаю, как ниже. Рюкзак спавнится, а какую секцию указать для ящика?

local a_pos  = db.actor:position()
local xpos=a_pos.x+2
local ypos=a_pos.y
local zpos=a_pos.z
local lv=db.actor:level_vertex_id()
local gv=db.actor:game_vertex_id()
local newOBJ=alife():create("inventory_box", xyz(xpos,ypos,zpos), lv,gv)

 

Ссылка на комментарий
53 минуты назад, phalcor сказал:

а какую секцию указать для ящика?

Нужно создать предмет (естественно не подбираемый, хотя можно и ящики собирать если нужно) с визуалом ящика, потом спавнить как любой предмет. Но все же советую делать такие вещи через СДК, подобные костыли — уровень 2007 года.

  • Спасибо 1
  • Согласен 2
Ссылка на комментарий
2 минуты назад, phalcor сказал:

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

Деревянный ящик — это зашитая в спавн секция динамического объекта с прописанным визуалом этого самого ящика. Соответственно — нет. Тебе нужно по аналогии создать в конфигах предмет с прописанным визуалом, и спавнить непосредственно предмет, а не модель.

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

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

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

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

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

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

Войти

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

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

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