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

Скриптование


Svoboда

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

Доброго времени суток всем! :)

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

зачем оставлять по всей Зоне, хотя и невидимые, но никомму не нужные и по сути рудиментарные уже об'екты?

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

В принципе, даже проверял и где-то применяю - в самой логике рестриктора по окончании активной секции переключая на 'nil' - вызываю функцию удаления "самого себя".

Идея понятна сама по себе. Если можно, подробнее о принципе определения "самого себя". Последующее удаление не представляется проблематичным.

Заранее благодарен.

Поделиться этим сообщением


Ссылка на сообщение

Artos, провел эксперимент по самоудалению рестриктора.

Логика:

[logic]
active = sr_idle@one

[sr_idle@one]
on_actor_inside = | nil %=debug.del_restr%

Функция:

function del_restr(actor, obj, p)
    if obj then
        alife():release(obj)
    end
end

Функция получает правильный объект. Отрабатывает, объект не удаляется, биндер виснет (часы останавливаются).

В чем моя ошибка?

Поделиться этим сообщением


Ссылка на сообщение

Руководствуясь информацией из сообщения №3989

Для актора нужно проверять параметр нет-пакета: torch_flags (что даст информацию и по активности ПНВ) и если нужно изменять (управлять вкл/выкл)

провел серию экспериментов и выяснил следующее.

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

function Torch()
    local obj_torch = db.actor:item_in_slot(9)
    if obj_torch==nil then return end
    local se_obj = alife():object(obj_torch:id())
    if se_obj then 
        local pk = m_netpk.get(se_obj) 
        if pk:isOk() then
            local data = pk:get() 
            if data and data.upd and data.upd.torch_flags then
                local msg = string.format("%d", data.upd.torch_flags)
                news_manager.send_tip(db.actor, msg, nil, nil, 30000)
                data.upd.torch_flags=7    -- попытка включить принудительно
                pk:set(data)
            end
        end
    end
end

 

Заранее благодарен.

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

Поделиться этим сообщением


Ссылка на сообщение

Всем доброго дня и здоровья.

В целях отработки навыков работы с модулем m_netpk, поставил себе учебно-тренировочную задачу заспавнить полупустую пачку патронов.

 

По событию спавню патроны и сохраняю в переменной их ID.

local sobj = sim:create(ammo, vector():set(temp.position.x,temp.position.y,temp.position.z), temp.lv, temp.gv)
if sobj then
SobjID2 = sobj.id -- сохраняем id
end

Из биндера вызывается процедура перевода объекта в оффлайн/онлайн и внесения изменений в количество патронов в пачке.

 

function update2()
if not SobjID2 then return end
if not State2 then State2=0 end
local sobj = alife():object(SobjID2) -- получаем серверный объект
if sobj then
local obj = level.object_by_id(sobj.id) -- получаем клиентский объект
-- ждем появления в онлайне
if State2==0 then
if obj then
State2=1
local sim = alife ()
if sim ~= nil then
 sim:set_switch_online (obj:id (), false)
 sim:set_switch_offline (obj:id (), true)
end
end
-- ждем появления в оффлайне
elseif State2==1 then
if not obj then
set_params2() --прописываем данные
State2=2
end
-- проверяем данные
elseif State2==2 then
local ver = ver_params2()
if ver then
State2=3 -- проверка успешна
else
State2=1 -- ошибка, перезапись
end
-- переводим в онлайн
elseif State2==3 then
local sim = alife ()
if sim ~= nil then
sim:set_switch_online (sobj.id, true)
sim:set_switch_offline (sobj.id, false)
end
-- удаляем переменные
SobjID2=nil
State2=nil
end
end
end

Процедура записи параметров.

-- установка параметров
function set_params2()
if not SobjID2 then return end
local sobj = alife():object(SobjID2)
if sobj then
pk = get_netpk(sobj)
if pk:isOk() then
-- читаем пакет
local data = pk:get()
-- устанавливаем данные
ammo_num=15
-- записываем данные
data.upd.ammo_left = ammo_num
data.ammo_left = ammo_num
-- записываем пакет
pk:set(data)
end
end
end

Процедура проверки не представляет особого интереса, обычное чтение и сравнение.

Вроде работает, пачка появляется, "исчезает" и появляется вновь с заданными параметрами. Но, эпизодически объект не возвращается в онлайн. Объект существует, на него можно установить метку, но онлайнового объекта нет.

 

 

Всем, кто может проконсультировать по данному вопросу заранее благодарен.

 

Дополнительная проверка показала, что грубейшая ошибка была допущена как раз в процедуре проверки факта установки желаемых значений количества патронов в пачке и перезапуска установки оных. Как обычно, то, что считаешь несущественным, оказывается главенствующим. Сейчас проблемка устранена, но остается открытым вопрос - почему не всегда данные, прописанные нет-пакетом, нормально применяются и приходится их перезадавать повторно? Где тут "собака порылась"? В неправильном использовании модуля? Некорректной подачи данных в него? Особенности Сталкера?

Хотелось бы разобраться (насколько возможно) в подоплеке этого дела. Ведь пример чисто академический и простейший. При более сложных операциях, подозреваю, можно устроиться в еще более замысловатые ситуации.

Информация: ТЧ 1.0004, объект спавнится в непосредственной близости от ГГ.

Поделиться этим сообщением


Ссылка на сообщение
Reisen, попробуй так сделать:
local  group_1= {
    ["soldier_outfit_grey"] = true,  
    ["soldier_outfit_brown"] = true,
     ... etc.
    }


 

 

 

Поделиться этим сообщением


Ссылка на сообщение

Всем доброго дня.

Установил на чистый ТЧ 1.0004 сборку "Внешнее хранилище" всеми уважаемого Artos. Лежит у меня давно, не вспомню откуда скачал - вот ссылка на нее http://rghost.ru/48630478. Выполнил все шаги установки по вложенной инструкции:

Использование:
1. Добавить в конфиги (например в system.ltx) секцию [custom_storage];
2. Добавить в конфиги файл-конфиг модуля нет-пакетов (m_netpk.ltx):
3. Скопировать se_stor.script m_netpk.script и m_helpers.script в папку скриптов игры.
4. Добавить новый класс CUST_ST <-> clsid.custom_storage в файл class_registrator.script;
5. Добавить в биндер актора коды вызова события "сохранение игры" или функцию сохранения хранилища;
6. Внести изменения в алгоритм сохранения и чтения данных в биндере актора (bind_stalker.script);

Кроме того, пунктом 7 добавил инициализацию модулей в _g.script о чем, кстати, в инструкции умалчивается.

function start_game_callback()
	printf	("start_game_callback called")
	task_manager.clear_task_manager()
	treasure_manager.clear_treasure_manager()
	xr_sound.clear_all_sound_object()
	dialog_manager.fill_phrase_table()	
	m_netpk.init() -- этот сразу подключил, есть инструкция к нему отдельная	
	se_stor.init() -- этот уже позже, по безнадёге, но не помогло
end

Сохранение с НИ рядом с Сидоровичем благополучно происходит и загружается, но стоит с ним перетереть и выйти за дверь, так при попытке сохраниться получаю вылет:

[error]Arguments     : LUA error: ...ograms\s.t.a.l.k.e.r\gamedata\scripts\se_stor.script:143: attempt to call field 'size' (a nil value)

Прошу поддержки как у автора, так и у всех, кто может пролить свет на правила пользования этим инструментом.

Заранее благодарен.

 

 

Поделиться этим сообщением


Ссылка на сообщение

@Kirgudu, добавил приведенный фрагмент, стало заметно лучше. Сохранения/загрузки происходят, но только пока что-либо в хранилище не поместили. После записи в хранилище сохранение происходит, но при загрузке вылет:

Arguments     : LUA error: ...ograms\s.t.a.l.k.e.r\gamedata\scripts\se_stor.script:184: attempt to call field 'size' (a nil value)

Та же хреновина, но теперь при загрузке. 

Поделиться этим сообщением


Ссылка на сообщение

@Artos, был бы премного благодарен за обновленный полнофункциональный комплект. Да, и не я один, думаю. Особенно важным для меня является сохранение во внешнем хранилище простых таблиц, о чем я уже в ЛС писал.

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

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

Поделиться этим сообщением


Ссылка на сообщение

@stalker8509, возможно. Подобная схема боя для БТР уже реализована и включена в мод "Terra Incognita". Удалось довольно просто реализовать этот режим, не внося глобальных изменений в исходную схему логики БТР. Но простота реализации схемы достигнута благодаря ее взаимодействию с другими компонентами мода. Поэтому, рассматривать ее в отрыве от остальных компонентов мода нельзя.

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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