Jump to content

Recommended Posts

WinCap    171
5 часов назад, mdm64 сказал:

я не понял, где искать эту 748 строку

Не трать время зря, ничего полезного там нет.

 

"Error in error handling" - Lua не смог корректно обработать ошибку.

Найти причину очень сложно. Вспоминай всё, что менял в последнее время.

В первую очередь проверяй все скрипты, которые правил, и не только корректность синтаксиса, но и правильность написания имен переменных и функций (хорошо помогает подсветка совпадающих слов в Notepad++).

Также проверяй логику объектов, всех новых или недавно правленых, и, конечно, работу в смартах.

  • Полезно 3

Share this post


Link to post
Share on other sites
mole venomous    105

Добренько вам. Есть ли возможность поставить в исключения для схемы выброса непися, находящегося в конкретном гулаге под конкретной работой. Или всех НПС под этим гулагом, независимо от "рода деятельности" (в основе ТЧ 1.0006 + АМК 1.41) .

Edited by mole venomous

Share this post


Link to post
Share on other sites
phalcor    19

Если неписю продать штук 10-20 разных стволов, он какое-то время будет их носить в инвентаре, но затем большинство из них в одну секунду пропадут, останется только самое мощное (по его мнению).

Вопрос - как можно  управлять этим процессом? (например, запретить такое вот исчезновение оружия из инвентаря непися). За это отвечает какой-то скрипт или что-то еще?

Share this post


Link to post
Share on other sites
phalcor    19
15 часов назад, phalcor сказал:

За это отвечает какой-то скрипт или что-то еще?

Таки нашёл сам. Предметы из инвентаря неписей исчезают благодаря функции first_update(npc) в скрипте trade.script. (Это справедливо для ОП 2.1). Может кому-то будет полезна эта информация ;)

Share this post


Link to post
Share on other sites
_Sk8_AsTeR_    43

Доброго времени! Возможно ли в Нет-пакет НПС добавить какие-то свои данные? В качестве теста - новую переменную, которая будет в себе хранить просто какое-нибудь число. Как это реализовать? Чтение нетпакета:

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

local pk = get_netpk(npc) --
if pk and pk:isOk() then
	local data = pk:get()
  	--КАКАЯ-ТО ФУНКЦИЯ, работаем с нет-пакетом
  	pk:set(data)

 

 

Edited by _Sk8_AsTeR_

Share this post


Link to post
Share on other sites
_Sk8_AsTeR_    43

@Kirgudu, интересно. А после проделанных манипуляций сейвы теоретически могут каким-либо образом убиться? 

Share this post


Link to post
Share on other sites
Kirgudu    673

Вот чтобы не "убились", и надо задействовать кастом дату. :) В описанном случае никаких неприятных последствий замечено не было.

  • Thanks 1
  • Согласен 2

Share this post


Link to post
Share on other sites
Zander_driver    5,337
1 час назад, _Sk8_AsTeR_ сказал:

А после проделанных манипуляций сейвы теоретически могут каким-либо образом убиться?

Вообще-то, могут довольно запросто. Размер нетпакета в игре ограничен, и если записать в кастом дату слишком много данных (Кучу длинных строк например), то получится "битый сейв" - ничего не случится при сохранении, игра даже в логе не ругнется, но при попытке сейв загрузить, будет вылет с совершенно невразумительными логами.

Я не знаю, есть ли в последних версиях модуля Артоса, железно-надежная внутренняя проверка, не допускающая переполнения. В тех версиях, с которыми я имел дело, такой проверки не было. Т.е. объем записываемых данных, надлежит контролировать самостоятельно.

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

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

Это не панацея в любом случае. Т.к. кастом-дата - неотъемлемая часть нетпакета, а сам нетпакет не резиновый.

Если в модуле Артоса есть проверка, запрещающая запись в пакет лишних данных - значит, когда мы попытаемся записать слишком много, часть данных не запишется.

Если такой проверки внутри модуля нет, и мы не проверив, запишем больше разрешенного объема, то получим битый сейв. Т.е. и так и эдак, следить за объемом своих данных, надо самому, а не полагаться на то, что Артос "все предусмотрел". Тут нельзя избавить конечного пользователя от заботы об объеме данных. Получится выбор между потерей данных во имя стабильности, либо битьем сейвов во имя сохранения всего и вся.
Как вариант для записи больших данных - se_stor того же Артоса. Там данные распределяются по нетпакетам многих объектов, а не одного, и благодаря этому хранить можно теоретически сколько угодно. Только следить за тем, чтобы не было монолитных неделимых строк размером больше разрешенной длины нетпакета. Если такие запихивать на запись, то даже se_stor будет бить сейвы. Проверено на личном опыте... :)

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


karikatura-arheologiya_(vladimir-brovkin


 

 

  • Согласен 2

08.01.2012 в 03:30, xStream сказал:

Те, у кого свои руки есть, копипастить это не будут, проще свое написать, которое тоже велосипедное, но более понятное автору.

 

Share this post


Link to post
Share on other sites
Kirgudu    673

@Zander_driver, я имел в виду несколько другое. Если выбирать между записью в кастом дату и в отдельное свойство всего нет-пакета [ local data = pk:get()    data.my_prop = 1    pk:set(data) ] - однозначно следует предпочесть кастом дату, поскольку добавление отдельного свойства может поломать весь нет-пакет, обладающий определённой структурой для каждого типа объекта (хотя не исключено, что модуль просто проигнорирует добавленные свойства, не характерные для нет-пакета - это я не проверял).

Ну а то, что мы не можем превышать определённую длину, обсуждалось уже много раз. Впрочем, согласен, упомянуть об этом стоило. :)

Edited by Kirgudu
  • Like 1
  • Согласен 1
  • Полезно 2

Share this post


Link to post
Share on other sites
Redix    0

Нужен скриптер, возможно ли переделать скрипт из мода 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)
Заранее спасибо

Share this post


Link to post
Share on other sites
UriZzz    821

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

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

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

Edited by UriZzz

Моя нычка. Периодически пополняю

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

UriZzz.gif

Share this post


Link to post
Share on other sites
_Sk8_AsTeR_    43

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

Share this post


Link to post
Share on other sites
mdm64    56

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

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

Share this post


Link to post
Share on other sites
 HellRatz    2,188

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

  • Согласен 3

Share this post


Link to post
Share on other sites
mdm64    56

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

Share this post


Link to post
Share on other sites
Jurok    2,074
Цитата

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

 

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

  • Полезно 1

Share this post


Link to post
Share on other sites
mdm64    56

@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 --маскхалат

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

Edited by mdm64

Share this post


Link to post
Share on other sites
dsh    3,031
2 hours ago, mdm64 said:

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

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

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

Share this post


Link to post
Share on other sites
Romann    548
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.

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


AMK-Team.ru

×
×
  • Create New...