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

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

Daniar299, вся "враждебность" заключается в группировке, спавни непися как всегда, только с группировкой нужной.

 

NaslednikTutti, легче через all.spawn параметр health

Чем же распаковка, правка и обратная компиляция лешче багальной фушкции установки хдоровья актору в нужное (раненое) значение?

И тем более, подобное не заставит актора валяться и/или просить аптечку. --/Artos

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

Вампир35, через health в all.spawn я пробовал)) поставил health = 0.1, при старте игры у гг просто меньше здоровья.

А мне нужно так, чтобы ГГ при старте игры именно лежал на полу как раненный нпс.

 

Править следует два параметра: health и upd:health ... важен имменно второй. --/Artos

 

Добавлено через 29 мин.:

Даже просто сделать так, чтобы при старте игры, такая скриптовая сцена (или как она там называется=)), ГГ лежит на полу без сознания и потом типо очнулся и встает... Как это реализовать на ЗП. Подскажите пожалуйста.

Есть же такое в ТЧ, когда ГГ теряет сознание и падает..потом ролик.. а после он очнулся и встает. Только это нужно на ЗП.

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

Не соответствует правилам.

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

NaslednikTutti, ну так что мешает сделать такое на ЗП? При старте новой игры запускаешь кат-сцену

ГГ лежит на полу без сознания и потом типо очнулся и встает
.

Делается через "sr_cutscene". Подробнее читай тут

[logic]
active = sr_idle

[sr_idle]
on_info = {!black_screen +agru_nvidia_presentation} sr_cutscene@cam1
;Здесь мы проверяем инфопоршен agru_nvidia_presentation и функцию
;black_screen (нет ли черного экрана) и переходим в секцию sr_cutscene@cam1

[sr_cutscene@cam1]
point = agru_nv_camera_walk
;точка walk где игрок будет находится после камеры
look = agru_nv_camera_look
;точка look куда будет направлена камера игрока после камеры
cam_effector = scenario_cam\agroprom_underground\camera1_0_904
;файл камеры и путь к нему
on_signal = cameff_end | sr_cutscene@cam2
;сигнал окончание камеры и переход в следующую секцию

[sr_cutscene@cam2]
....

 

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

Подскажите, какое максимальное целое бесзнаковое число можно хранить в числовой переменной для ТЧ на 32-bit ОС ?

 

Понятиям "переменная" не применимо - "числовая", что присвоил - тому и соответствует.

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

Применительно к сохранениям значения переменных в сэйвы игры - существуют методы r_u64 и w_u64, которые могут читать/писать в нет-пакеты соответственно 2х4 байта для числа, однако ими никто не пользуется и применяют максимально r_u32 и w_u32, т.е. 4-х байтовые. Нужно больше - запоминай чвстями. --/Artos

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

Вроде-бы - 2^23, не точно, в "Справочнике функций и классов..." это обсуждалось, давно.

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

всё легко

Ссылка на комментарий
 ----------
-- чтение формы из нет-пакета
----------
function r_shape(packet)
local s
local st = {}
st.count = packet:r_u8()
st.shapes = {}
for i=1, st.count do
s = {}
s.type = packet:r_u8()
if s.type == 0 then
s.center = packet:r_vec3()
s.radius = packet:r_float()
else
s.axis_x = packet:r_vec3()
s.axis_y = packet:r_vec3()
s.axis_z = packet:r_vec3()
s.offset = packet:r_vec3()
end
st.shapes[i] = s
end
return st
end

----------
-- запись формы в нет-пакет
----------
function w_shape(packet, st)
local s
packet:w_u8(st.count)
for i=1, st.count do
s = st.shapes[i]
packet:w_u8(s.type)
if s.type == 0 then
packet:w_vec3(s.center)
packet:w_float(s.radius)
else
packet:w_vec3(s.axis_x)
packet:w_vec3(s.axis_y)
packet:w_v ec3(s.axis_z)
packet:w_vec3(s.offset)
end
end
end

----------
-- перепаковка нет-пакета созданного скриптом рестрикта
----------
function rewrite_restrictor(se_obj, custom, radius)
local packet = net_packet()
se_obj:STATE_Write(packet)
local game_vertex_id = packet:r_u16()
local distance = packet:r_float()
local direct_control = packet:r_s32()
local level_vertex_id = packet:r_s32()
local object_flags = packet:r_s32()
local custom_data = packet:r_stringZ()
local story_id = packet:r_s32()
local spawn_story_id = packet:r_s32()
local shape = r_shape(packet)
local restrictor_type = packet:r_u8()

custom_data = custom
shape = {}
shape.count = 1
shape.shapes = {}
shape.shapes[1] = {}
shape.shapes[1].type = 0
shape.shapes[1].center = vector():set(0,0,0)
shape.shapes[1].radius = radius

packet:w_u16(game_vertex_id)
packet:w_float(distance)
packet:w_s32(direct_control)
packet:w_s32(level_vertex_id)
packet:w _s32(object_flags)
packet:w_stringZ(custom_data)
packet:w_s32(story_id)
packet:w_s32(spawn_story_id)
w_shape(packet, shape)
packet:w_u8(restrictor_type)
se_obj:STATE_Read(packet, packet:w_tell() - packet:r_tell())
end

function create_shompl_restr()
local se_obj = alife():create("space_restrictor",vector():set(-247.4907989502,-20.131322860718,-153.27322387695),12047,47)
local custom = "[logic]\ncfg = scripts\ins\shompl.ltx" --путь к логике рестриктора
rewrite_restrictor(se_obj, custom, 5.0) --5.0 - это радиус действия нашего рестриктора
end

 

 

Вроде всё правильно сделал, но при добавлении в бинд_сталкер имя_файла.create_shompl_restr(), происходит вылет по этой строчке.

Подскажите, может что-то пропустил?

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

class "MapTex" (CUIScriptWnd)
function MapTex:__init() super()
    self:Init(0, 0, device().width, device().height)

    self.overlay = CUIStatic()
    self.overlay:Init(15, 15, 256, 256)
    self.overlay:InitTexture("MapTex\\MapTex") -- текстурка
    self.overlay:SetStretchTexture(true)
    self.overlay:Show(true)
    self:AttachChild(self.overlay)
end

 

 

Мне нужно скриптом повернуть эту текстуру, как?

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

AutoGnom, для поворота текстуры статика его необходимо создавать, используя InitStatic.

В конфиге статика указать параметр heading="1". Поворачивается статик с помощью метода SetHeading.

Всё это было описано много раз.Не ленись использовать поиск.

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

Занялся логикой, схемами поведения и т.п. Возник вопрос про условия экшена. Например есть строки

action:add_precondition        (world_property(stalker_ids.property_alive, true))
action:add_precondition        (world_property(stalker_ids.property_enemy,    false))
action:add_precondition        (world_property(stalker_ids.property_danger,false))
action:add_precondition        (world_property(stalker_ids.property_anomaly,false))

Сами условия более менее понятны, но как они проверяются? Но даже если это списать на проверку в движке - константы из класса stalker_ids, то встает вопрос про "самодельные" константы:

function addCommonPrecondition(action)
    --action:add_precondition (world_property(xr_evaluators_id.reaction,false))
    action:add_precondition (world_property(xr_evaluators_id.stohe_meet_base + 1,false))
    action:add_precondition (world_property(xr_evaluators_id.sidor_wounded_base + 0,  false))
    action:add_precondition (world_property(xr_evaluators_id.chugai_heli_hunter_base, false))
    action:add_precondition (world_property(xr_evaluators_id.abuse_base, false))
end

Откуда такие смещения в 1, 0(?), в других скриптах бывает 2 и т.д. Я нигде не нашел проверки на эти константы, только использование в конструкторе world_property. Так как это все работает? Что за класс такой world_property?

PS: а кто нибудь описывал, какие условия проверяются для каждой константы из класса stalker_ids?

PPS: ТЧ 1.0004 если это важно.

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

ТЧ 1.0004. SAP и Trans mod

github

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

Desertir

1. По world_property - посмотри хотя бы азбуку (lua_help.script). В кратце там можно разобраться что-к-чему ...

2. Советую вначале ознакомиться с классами stalker_ids, planner_action и action_planner.

Имеютс встроенные в движек 'property' и 'action', имеются скриптовые, которые добавлены в прописаны в xr_evaluators_id.script и xr_actions_id.script. Можно и "ручками" назначить и использовать.

Суть: Кажому 'property' (условию) и 'action' (действию), сопоставлена некая числовая констатна (эксклюзивная), и именно по этим числам движек и скрипты оперируют в своих действиях, нахоодя по этим константам нужный класс эвалуатора или экшена.

Нередко в схемах имеется не одно условие и/или не одно действие - вот и регистрируется несколько, взяв за базу основное значение.

Например, в state_mgr.script pbhtubcnhbhjdfyj одна константа xr_evaluators_id.state_mgr, а все остальные вычисляются именно по смещению +1, +2, ...

Т.о. смещение обозначает, какое берется из значений, зарезервирвованных для данной схемы.

Я нигде не нашел проверки на эти константы, только использование в конструкторе world_property

А world_property - это и есть проверка "этих констант" ...

Постарайся читать и понимать написанное, например приведенная тобою строка:

action:add_precondition (world_property(xr_evaluators_id.stohe_meet_base + 1,false))

- означает, что некоему действию схемы назначается проверка условия из схемы 'meet'. Если заглянуть в эту схему, то можно видеть, что значению xr_evaluators_id.stohe_meet_base + 1 сопоставлен эвалуатор 'evaluator_contact' этой схемы. Вот и будет активизация некоего твоего действия зависеть от проверки этого эвалуатора, т.е. если эвалуатор вернет 'false' - простым языком: "если непись не вступила в контакт/разговор с актором".

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Напишу тут.

Пара уточнений. Под объектом в целом я буду иметь ввиду клиентский объект NPC. Менеджер - объект, получаемый методом motivation_action_manager() объекта:

local manager = object:motivation_action_manager()

Экшн - объект класса унаследованного от action_base.

Прописать условие в менджер:

manager:add_evaluator(id, property_evaluator(npc, name))

Установить условие экшену:

action:add_precondition(world_property(id, true/false))

Итак, есть функция из xr_logic - enable_generic_schemes, которая косвенно через пару функций вызывается из апдейтов биндеров, так же она вызывается из метода класса gulag, но я пока не о гулагах. В этой функции прописаны схемы которые по идее активны всегда, так ведь? Ну если условия все пройдут. В конечном итоге еще через пару функций вызывается функция add_to_binder для каждой схемы, прописанной в enable_generic_schemes. В add_to_binder прописываются различные условия, например:

manager:add_evaluator (properties["abuse"], evaluator_abuse("evaluator_abuse", st))

где properties["abuse"] = xr_evaluators_id.abuse_base.

Если эта схема всегда активна, в своей новой, которая прописывается как например walker или kamp, т.е. которая активна не всегда, я могу опять получить менеджер объекта, в котором уже есть это условие, и установить это условие в каком нибудь экшене.

В итоге работает это все так:

-Есть несколько схем, которые активны всегда.

-В этих схемах в менеджер каждого объекта прописываются разные условия с идом.

-Позже к любому экшену в любой другой схемы можно добавить это условие по иду с помощью класса world_property.

Так ли это, ну хотя бы образно? Если да, тогда имеет смысл порядок включения схем в enable_generic_schemes? Допустим в одной схеме есть установка условия на что-либо, а прописывается само условие на что-либо в менеджер только в следующей схеме. Или условие в экшн устанавливается только как ид, и не важно, прописано это условие в менеджер?

И что если установить эшену несуществующее условие, если движок не найдет по иду условие - вылет?

 

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий
local health_hud = nil
local power_hud = nil
local spots = {}
local spot_init_table = {}
local maptex = nil
local is_hide = false
local health = nil
local power = nil

function start_update()
    for id = 1, 65535 do
        local sobj = alife():object(id)
        if sobj then
            local ssect = sobj:section_name()
            for _, v in ipairs(list_arts) do
                if ssect == v then
                    artefacts[id] = {}
                    artefacts[id].spot = false
                    artefacts[id].time_beep = 0
                    
                    a_m.Tips:show(sobj:section_name(), "CAutoGnomTest",nil,5)
                end
            end
        end
    end
end

class "CAutoGnomSpot" (CUIScriptWnd)
function CAutoGnomSpot:__init(owner, id, x, y) super()
    self:Init(0, 0, device().width, device().height)

    self.owner = owner
    self.id = id

    if spots[self.id] == nil then
        spots[self.id] = CUIStatic()
        spots[self.id]:SetAutoDelete(true)
        spots[self.id]:InitTexture("autognom_minimap\\white_dot")
        spots[self.id]:SetStretchTexture(false)
        spots[self.id]:SetWndRect(x, y, 2, 2)
--        spots[self.id]:SetFont(GetFontLetterica16Russian())
        spots[self.id]:Show(true)
        
        self:AttachChild(spots[self.id])
    end
end

function CAutoGnomSpot:Update()
    CUIScriptWnd.Update(self)
    local obj = level.object_by_id(self.id)
    
    if obj and obj:position():distance_to_xz(db.actor:position()) <= self.owner.max_distantion and obj.health > 0 then
        local x, y = self.owner:get_pos_data(obj:position())
        spots[self.id]:SetWndRect(x, y, 2, 2)
        
        if is_hide == false then
            spots[self.id]:Show(true)
        else
            spots[self.id]:Show(false)
        end

        local color = self:get_color(self.id)
        spots[self.id]:SetColor(color)
        
        if obj.health <= 0 then
            RemoveSpot(self.id)
        end
    else
        spots[self.id]:Show(false)
    end
end

function CAutoGnomSpot:get_color(id)
    local obj = level.object_by_id(id)
    local so = alife():object(id)
    local stalker = IsStalker(so)

    if obj:alive() then
        if obj:id() == db.actor:id() then
            return GetARGB(255, 255, 132, 0) -- its me)
        end
        
        if stalker then
            if obj:relation(db.actor) == game_object.friend then
                return GetARGB(255, 0, 255, 0) -- green
            elseif obj:relation(db.actor) == game_object.enemy then
                return GetARGB(255, 255, 0, 0) -- red
            else
                return GetARGB(255, 255, 255, 0) -- yelloy
            end
        end
    else
        return GetARGB(255, 127, 127, 127)
    end
end

-- *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
-- *_# Класс полоски здоровья
-- *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
class "CAutoGnomHealth" (CUIScriptWnd)
function CAutoGnomHealth:__init() super()
    self:Init(0, 0, device().width, device().height)

    self.overlay = CUIStatic()
    self.overlay:Init(157, 173, 128, 128)
    self.overlay:InitTexture("autognom_minimap\\green\\autognom_green_25")
    self.overlay:SetStretchTexture(true)
    self.overlay:SetAutoDelete(true)
    self.overlay:Show(true)
    self:AttachChild(self.overlay)
end

function CAutoGnomHealth:Update()
    CUIScriptWnd.Update(self)
    
    if health ~= db.actor.health then
        local num = math.floor(db.actor.health * 25)
        health = db.actor.health

        if num >= 0 then
            self.overlay:InitTexture("autognom_minimap\\green\\autognom_green_" .. tostring(num))
        else
            self.overlay:InitTexture("autognom_minimap\\green\\autognom_green_0")
        end
    end
    
    if is_hide == false then
        self.overlay:Show(true)
    else
        self.overlay:Show(false)
    end
end

-- *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
-- *_# Класс полоски выносливости
-- *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
class "CAutoGnomPower" (CUIScriptWnd)
function CAutoGnomPower:__init() super()
    self:Init(0, 0, device().width, device().height)

    self.overlay = CUIStatic()
    self.overlay:Init(145, 10, 128, 128)
    self.overlay:InitTexture("autognom_minimap\\blue\\autognom_blue_25")
    self.overlay:SetStretchTexture(true)
    self.overlay:SetAutoDelete(true)
    self.overlay:Show(true)
    self:AttachChild(self.overlay)
end

function CAutoGnomPower:Update()
    CUIScriptWnd.Update(self)

    if power ~= db.actor.power then
        local num = math.floor(db.actor.power * 25)
        power = db.actor.power

        if num >= 0 then
            self.overlay:InitTexture("autognom_minimap\\blue\\autognom_blue_" .. tostring(num))
        else
            self.overlay:InitTexture("autognom_minimap\\blue\\autognom_blue_0")
        end
    end
    
    if is_hide == false then
        self.overlay:Show(true)
    else
        self.overlay:Show(false)
    end
end


-- *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
-- *_# Класс миникарты
-- *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
class "CAutoGnomMiniMap" 
function CAutoGnomMiniMap:__init()
    self.max_distantion = 70
    self.map_radius = 85 
    self.map_cntr_x = 138
    self.map_cntr_y = 138 
    self.disabled = false
    
    self.signal_power = {
        l01_escape         = {90, 100},
        l02_garbage     = true,
        l03_agroprom     = true,
        l04_darkvalley     = true,
        l05_bar         = true,
        l06_rostok         = true,
        l07_military     = true,
        l08_yantar         = true,
        l10_radar         = true,
        l11_pripyat     = true
    }

    self.time_update = time_global() + 1000
    self.update_map_r = false
end

function CAutoGnomMiniMap:update_map_radius(signal)
    self.map_radius = signal
end

function CAutoGnomMiniMap:update_map_radius_random()
    if self.update_map_r == true then
        local now_time = time_global()
        if now_time > self.time_update then 
            self.time_update = now_time + math.random(500, 2000)

            local signal = math.random(self.signal_power[level.name()][1], self.signal_power[level.name()][2])
            
            self:update_map_radius(signal)
        end
    end
end

function CAutoGnomMiniMap:get_pos_data(tpos)
    local cam_dir = device().cam_dir
    local dir = tpos:sub(db.actor:position())

    vect = vector_rotate_y(vector():set(dir.x / self.max_distantion * self.map_radius, 0, 
        -dir.z / self.max_distantion * self.map_radius), math.atan2(-cam_dir.x, cam_dir.z) / math.pi * 180)

    return vect.x + self.map_cntr_x, vect.z + self.map_cntr_y
end

function CAutoGnomMiniMap:is_disabled()
    if self.disabled == true then
--
        return true
    end
    
    return false
end

function CAutoGnomMiniMap:update()
    if self:is_disabled() then
        return
    end

    local hud = get_hud()

    if maptex == nil then
        ShowPowerHud()
        ShowHealthHud()
        ShowMapTex()
    end

    for id, obj in pairs(db.storage) do
        local obj = level.object_by_id(id)
        local sobj = alife():object(id)

        if sobj and obj then
            local stalker = IsStalker(sobj)
            
            if stalker and obj:position():distance_to_xz(db.actor:position()) <= self.max_distantion then
                local x, y = self:get_pos_data(obj:position())
                
                if obj.health > 0 then
                    local id = obj:id()
                --    if spots[id] == nil then
                        AddSpot(self, id, x, y)
                --    end
                end
            end
        end
    end
end

-- *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
-- *_# Класс текстурки миникарты
-- *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*
class "CAutoGnomMapTex" (CUIScriptWnd)
function CAutoGnomMapTex:__init() super()
    self:Init(0, 0, device().width, device().height)

    self.overlay = CUIStatic()
    self.overlay:Init(15, 15, 256, 256)
    self.overlay:InitTexture("autognom_minimap\\autognom_minimap")
    self.overlay:SetStretchTexture(true)
    self.overlay:Show(true)
    self.overlay:SetAutoDelete(true)
    self:AttachChild(self.overlay)
end

function CAutoGnomMapTex:Update()
    CUIScriptWnd.Update(self)
--self.overlay:SetHeading(math.rad(math.random(360)))
    if is_hide == false then
        self.overlay:Show(true)
    else
        self.overlay:Show(false)
    end
end

function ShowMapTex()
    if maptex == nil then
        maptex = CAutoGnomMapTex()
        get_hud():AddDialogToRender(maptex)
    end
end

function RemoveMapTex()
    if maptex ~= nil then
        get_hud():RemoveDialogToRender(maptex)
        maptex = nil
    end
end

function CAutoGnomMapTex:__finalize()
    RemoveMapTex()
end

function ShowHealthHud()
    if health_hud == nil then
        health_hud = CAutoGnomHealth()
        get_hud():AddDialogToRender(health_hud)
    end
end

function RemoveHealthHud()
    if health_hud ~= nil then
        get_hud():RemoveDialogToRender(health_hud)
        health_hud = nil
    end
end

function CAutoGnomHealth:__finalize()
    RemoveHealthHud()
end


function ShowPowerHud()
    if power_hud == nil then
        power_hud = CAutoGnomPower()
        get_hud():AddDialogToRender(power_hud)
    end
end

function RemovePowerHud()
    if power_hud ~= nil then
        get_hud():RemoveDialogToRender(power_hud)
        power_hud = nil
    end
end

function CAutoGnomPower:__finalize()
    RemovePowerHud()
end


function AddSpot(owner, id, x, y)
    if spot_init_table[id] == nil then
        spot_init_table[id] = CAutoGnomSpot(owner, id, x, y)
        get_hud():AddDialogToRender(spot_init_table[id])
    end
end

function RemoveSpot(id)
    if spot_init_table[id] ~= nil then
        get_hud():RemoveDialogToRender(spot_init_table[id])
        spot_init_table[id] = nil
    end
end

function CAutoGnomSpot:__finalize()
    RemoveSpot(self.id)
end

function HideAllStatics()
    is_hide = true
end

function ShowAllStatics()
    is_hide = false
end

Когда загружаю игру, все мои статики корректно отображаются, всё работает без проблем, игра загружается через F6 без прблем

 

Проблема в следующем: при переходе на другую локацию, игра крашится без лога. Показывается "Сервер: старт игры" и вылет без лога. Понять не могу вчём тут дело, помогите пожалуйста

 

Както не хочется бросать эти наработки на пол дороги

 

Используй для кодов соответствующий тэг (code), чтобы сохранять форматирование/отступы. --/Artos

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

AutoGnom, создавая об'екты оконных классов в некоторых ситуациях следует их отключать/удалять "ручками", когда в них отпала надобность.

Используй коллбэк на завершение игры и/или перехода на др.локацию и удаляй созданные об'екты.

И/или, взгляни, например в _g.start_game_callback() - наверное не зря разработчики зачищают task_manager.clear_task_manager() и прочее.

 

Добавлено через 26 мин.:

Возвращаяс (по просьбе Kirgudu) к пропущенным прошлым вопросам:

Вопрос о пропаже 'tktvtynf универсального хранилища:

Непросто ответить в отрыве от применяемого контекста конкретного мода, тем более приведены логи только по созданию и чтению элементов хранилища. Честно говоря, меня несколько удивляет об'ем записи (6х8kB) и не является ли факт "пропажи" сбоем при записи некорректных данных.

Если такая ситуация возникает (с чем еще ни разу не сталкивался), то следует вывести в лог и строки собственно функции записи в создаваемые элементы, их очистки/удаления элементов хранилица, и их спавна при загрузке сэйва и анализировать.

И уточни версию скриптов универсального хранилища, т.к. вполне может быть что используешь устаревшую.

 

На вопрос о прекращении табличной сортировки штатным методом, могу только сказать, что если в скриптах этот метод не затрагивается (а в m_helpers.script этого как раз нет), то причины изменения функционирования следует искать в ином месте. У меня и у других метод table.sort работает вполне корректно.

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

 

Добавлено через 22 мин.:

Desertir

Кратко: Почитай материалы по ООП, т.к. начинаешь оперировать не линейным кодом, а об'ектами. По идам ты в менеджер добавляешь об'екты классов схем и соответственно отсутствие какого-либо добавляемого об'ект спровоцирует вылет. Не зря в таких случаях предусмотрено добавление заглушки property_evaluator_const(false).

Ну и конечно порядок активации схем важен, если последующие схемы используют в своей работе эвалуаторы/экшены от предшествующих. Не будет активирована требуемая схема - не будет и соответствующих об'ектов этой схемы - получишь вылет.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
Непросто ответить в отрыве от применяемого контекста конкретного мода, тем более приведены логи только по созданию и чтению элементов хранилища. Честно говоря, меня несколько удивляет об'ем записи (6х8kB) и не является ли факт "пропажи" сбоем при записи некорректных данных.

Даже не знаю, как показать контекст. Вот архив с модулями, в которые я внедрил хранилище (все файлы, которые к нему относятся)

https://dl.dropbox.com/u/56394435/HWM/HWM_plus_store.7z

Данные в хранилище пишутся в модулях ogsm_notepad.script, ogsm_rare_items_manager и ogsm_rt_manager, остальное - часть комплекта хранилища или его подключение. Но в отрыве от мода запустить их вряд ли получится, если только код посмотреть. Могу архивнуть и выложить мод целиком.

Логи я привёл только как иллюстрацию пропажи объекта, а не для показа конкретной ошибки. Ошибки-то я как раз и не обнаружил, о чём ниже.

Что же касается объёма записи, то ничего удивительного тут нет. Он, кстати, даже больше - 6x16kB, - ведь речь идёт о моде для CS. Просто в хранилище должны были сохраняться изменяемые данные статей экспериментального КПК - дата создания и изменения, статус, всяческие примечания, заметки игрока. Особенно заметки игрока, уж очень их игроки просили. Пока пришлось отказаться.

 

Если такая ситуация возникает (с чем еще ни разу не сталкивался), то следует вывести в лог и строки собственно функции записи в создаваемые элементы, их очистки/удаления элементов хранилица, и их спавна при загрузке сэйва и анализировать.

Это было первое, что я сделал. Поставил вывод в лог во всех возможных закоулках как в se_stor и m_helpers, так и в bind_stalker, а также в модулях, где использовал хранилище. Всё чисто, никаких ошибок, некорректных данных нет (я специально оптимизировал сохраняемые таблицы так, чтобы в них были только простые типы данных или, максимум, вложенные таблицы с простыми типами собственных данных). Потом, при сужении области поиска, как раз и обнаружил, что пропадает custom объект вместе со своим tail пакетом, причём именно при чтении, а при записи по всем фронтам вроде бы порядок...

 

И уточни версию скриптов универсального хранилища, т.к. вполне может быть что используешь устаревшую.

Комплект хранилища брал отсюда: http://www.amk-team.ru/forum/index.php?sho...st&p=695329

Внедрял в мод с небольшой модификацией, описанной здесь (в конце поста): http://www.amk-team.ru/forum/index.php?s=&...st&p=707932

 

На вопрос о прекращении табличной сортировки штатным методом, могу только сказать, что если в скриптах этот метод не затрагивается (а в m_helpers.script этого как раз нет), то причины изменения функционирования следует искать в ином месте. У меня и у других метод table.sort работает вполне корректно.

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

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

А что в Lua подразумевается под "странными таблицами"? Вложенные таблицы, индексы, отличные от последовательной нумерации, метатаблицы, что-то ещё?

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

Kirgudu, тоже сортировка сломалась (ЗП). Правда использую xray-extension. Если не сложно, выложи самописную функцию, чтобы мне велосипед не изобретать. А вот код, где сортировка не работает:

    --Таблица items заполняется выше и имеет структуру:
    --items[id_предмета] = секция_предмета

    local sort_items = {}
    for k,v in pairs(items) do
        item_w, item_h = _m.get_icon_size(v)
        sort_items[k] = {sect = v, width = item_w, id = k}
    end
    if _m.table_size(sort_items) > 1 then
        table.sort(sort_items, function(a,b) return (a.width < b.width) end)
    end

 

 

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

Shredder, да-да, точно такая сортировка, по одному из полей значений, и у меня перестала работать, но при этом без понятных (мне) внешних причин.

В изначальном посте, где я про сортировку спрашивал, всё есть. И описание, и сама функция (с доп. функцией поддержки), и примеры использования.

Вот здесь: http://www.amk-team.ru/forum/index.php?s=&...st&p=707932

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

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

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

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

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

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

Войти

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

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