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

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

@Dennis_Chikin

Ну всё правильно. save\load сохраняет в сейв только данные клиентских объектов которые в онлайне. Соответственно если клиентский объект ушёл в оффлайн => он удалился (?), и сохранять у него нечего. Ему на замену приходит серверный объект у которого свой метод сохранения. 

 

Я не знаю что там насчёт ТЧ, но в ЗП в этих случаях (кажется) помогала функция серверного объекта keep_saved_data_anyway() - должна возвращать true (в ЗП есть примеры). Тогда там (по моему) данные даже при смене локации сохранялись, но опять же очень давно это всё проверял. 

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

@Struck, абсолютно.

Был вопрос:

 

где можно прочитать про отличия UPDATE_Read/Write от STATE_Read/Write нетпакета?

Ответ:

acdc.pl

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

 

Ответ *Shoker*`а на мой взгляд гораздо уместнее.

Изменено пользователем abramcumner
  • Спасибо 1
  • Согласен 1

Подарки

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

    "keep_saved_data_anyway()" - а толку ?

    Именно что удаляют, и сохранять ни кто ничего даже и не собирался.

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

    Ну вот в ЗП я сохранял данные и столкнулся с похожей проблемой, keep_saved_data_anyway() мне помог, но как - уже не помню :D.

     

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

    Так вот - тип прицела сохраняется ТОЛЬКО в клиентском объекте оружия (в save\load). Но в серверном объекте про это забыли. Поэтому пока оружие в инвентаре ГГ или рядом с ним - при сохранениях и переходе с локации на локацию всё хорошо. Но стоит бросить оружие, уйти далеко и вернуться - на оружии прицел сбросится на стандартный. 

    • Полезно 1

    Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

    Мастер аномалий на свою заднюю точку.

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

    :offtopic:

     

     

    Правда отличие вида: функции с разными названиями пишут/читают разные данные, думаю, было очевидно вопрошающему и без этого.

    В этом и суть ответа, если не вникать как оно все там :).

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

    Спасибо всем за информативные ответы. Вникать пытаюсь, так как не понимаю до конца как все работает...

    К сожалению - после прочтения Ваших постов вогнал себя в непонимание еще больше.

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

    self.storage - заспавленный на уровне объект, стою возле него, т.е. он в онлайне...

    local s_storage=alife():object(self.storage:id())
    local packet=net_packet()
    далее заполняю packet стандартными заголовками (vertex,custom_data,visual и т.д.)
    packet:w_tell() = 108 байт
    пишу далее свои данные (несколько таких пар)
    packet:w_stringZ(section)
    packet:w_u8(tp)
    packet:w_tell() = 140 байт
    packet_size=packet:w_tell()

    packet:r_seek(0)

    log(packet:r_tell().." "..packet:w_tell()) - в логе 0 140

    s_storage:STATE_Read(packet,packet_size)

    log(packet:r_tell().." "..packet:w_tell()) - в логе 108 140

    т.е. мои данные не записались в пакет объекта... почему? где ошибка в моих рассуждениях? Благодарю за любую информацию.

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

    self.storage - заспавленный на уровне объект, стою возле него, т.е. он в онлайне...

    Изменение пакета возможно только для серверных объектов, находящихся в оффлайне. Иначе серверный объект постоянно обновляется данными клиентского - отсюда и несоответствие реальной и ожидаемой длин считанных из пакета в объект данных.

    Кстати, какой класс у твоего объекта? Если специальный, только для хранения твоих данных, имеет смысл добавить в его биндер методы, препятствующие переходу объекта в онлайн. Примерно так:

    function se_custom_storage:can_switch_online()
    	return false -- никогда не выходить в онлайн
    end
    function se_custom_storage:can_switch_offline()
    	return true -- всегда переходить в оффлайн
    end

    Если же один из стандартных, перед записью данных объект следует принудительно перевести в оффлайн:

    function switch_offline(sobj_id)
    	local sim = alife()
    	if sim and sim:object(sobj_id) then
    		sim:set_switch_online(sobj_id, false)
    		sim:set_switch_offline(sobj_id, true)
    	end
    end
    

    затем, после записи данных, перевести аналогичным образом обратно в онлайн.

     

    А вообще, для хранения своих данных лучше воспользоваться полностью отлаженными решениями, которые можно найти здесь, на форуме. Навскидку можно предложить альтернативные реализации от @Malandrinus (используется, если не ошибаюсь, в OGSE) и @Artos (делаем поиск по «se_stor»).

    Изменено пользователем Kirgudu
    • Спасибо 1
    • Нравится 1
    • Согласен 2
    Ссылка на комментарий

    Подскажите пожалуйста, каким образом можно "дождаться" перехода объекта в офлайн после вызова 

    alife():set_switch_online(sobj.id, false)
    alife():set_switch_offline(sobj.id, true)
    не передавая управление из своей функции?
    while sobj.online do 
     sleep() ??????
    end
    Ссылка на комментарий

    Доброго времени суток.

    Вопрос: можно ли установить "состояние"(condition)  предмету на классе "антирада"?

    Если - да, то как это корректно сделать.


    local sim = alife()

    local pos = db.actor:position()
    local lvid = db.actor:level_vertex_id()
    local gvid = db.actor:game_vertex_id()
    local pid = db.actor:id()
    local obj = sim:create("Мой предмет section", pos, lvid, gvid, pid)
    if obj then
           obj:set_condition(0.5)
    end

    Либо так:
    local se_obj = (alife():object(obj:id())
    if se_obj then
          se_obj:set_condition(0.5)
    end

    Итог: вылет со строкой: attempt to call method 'condition' (a nil value)

     

    Мне это нужно для того, чтобы: несколько таких предметов не группировались в инвентаре ГГ, для отслеживание их состояния, а так же возможность их использования. Если подобное уже описывалось на форуме - ткните куда копать. Поиск не выдал ничего конкретного(либо я плохо искал.).

    Заранее признателен.

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

    @Shkiper2012

    Ф-ция set_condition() - это метод класса game_object, т.е. клиентских объектов в игре. А ты пытаешься применять ее к серверным объектам, alife():create и alife():object возвращают серверные объекты. Получи клиентский объект, допустим так:

    level.object_by_id(se_obj.id)

    и уже ему устанавливай состояние.

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

    @UnLoaded, лучше через коллбек на выход в онлайн.

    @Shkiper2012, используй ХЕ или 7, там есть удобные функции для установки группируемости объектов (тоже клиентских как не трудно догадаться), это к вопросу о нормальном методе. С состоянием тут лучше не плясать.

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

     

     

    Мне это нужно для того, чтобы: несколько таких предметов не группировались в инвентаре ГГ

    Двиг не группирует предметы с различием состояния менее 0.01, т.е. если изменишь его на 0.0099 то ничего не выйдет.

     

    Просто для справки.

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

     

     

    Двиг не группирует предметы с различием состояния менее 0.01

    Группирует. Более - не группирует.

     

    Просто для справедливости.

     

    @Shkiper2012, в рамках стандартного движка самый простой и нормальный вариант это создать нужное количество секций, прям от парента создаешь полностью только секцию меняешь и все. Вроде:

     

    [section_1]:parent

    [section_2]:parent

     

    Он их группировать разумеется не будет. Но пока не поздно еще раз советую глянуть в сторону 7 движка и сделать на флагах, куда меньше мозги будешь парить, две однострочных функции решат эту канитель :).

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

    Группирует. Более - не группирует.   Просто для справедливости.

    Да, перепутал)) Не группирует, если различие больше 0.01.
    Ссылка на комментарий

    Признателен всем ответившим.

    Для себя нашел такой выход, как создание "нового" класса на базе "object_binder" для нужного предмета.

    И уже в нем задаю нужные параметры.

    Хотя ХЕ и 7, тоже интересуюсь, но пока только хожу около них, как кот у горячей каши, а "съесть" не могу. =)

     

    Ещё такой вопрос: как отловить момент перезарядки, разрядки и момент смены типов патронов у оружия? Есть ли флаг или что-то подобное для этого?

    Я сейчас "ловлю" последний патрон в стволе, но может быть есть более изящный способ?

     

    Для версии ТЧ 1.0006, нужно для манипуляций с оружием.

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

    Ещё такой вопрос: как отловить момент перезарядки, разрядки и момент смены типов патронов у оружия? Есть ли флаг или что-то подобное для этого? Я сейчас "ловлю" последний патрон в стволе, но может быть есть более изящный способ?

    Если используешь ХЕ, там есть метод получения текущего стейта худа оружия:

    uint<state> get_hud_item_state() - возвращает номер текущего стейта.
    
    пример:
    local weapon_states = {
    	idle = 0,
    	fire = 1,
    	fire2 = 2,
    	reload = 3,
    	showing = 4,
    	hiding = 5,
    	hidden = 6,
    	misfire = 7,
    	mag_empty = 8,
    	switch = 9
    }
    
    local state = db.actor:active_item():get_hud_item_state()
    if state == weapon_states.reload then
    ...
    end
    • Спасибо 1
    • Полезно 1
    Ссылка на комментарий

    Надеюсь, в ту тему пишу, вроде не совсем "Ковыряемся в файлах".
    В общем когда-то применил к скрипту кодировку, а может что-другое наворотил, и теперь не могу вернуть его [скрипт] обратно в норм. состояние. Суть в том, что при определенной кодировке, сообщения на русском языке в игре отображаются крякозябрами, а при другой (UTF-8 или что-то такое, не помню) игра вообще вылетает при отрабатывании этого скрипта. Ну, вопрос думаю понятен: в какой кодировке должен быть скрипт, чтобы в игре норм отображался русский язык?

    https://ru.wikipedia.org/wiki/Windows-1251
    dc

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

    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
  • Ссылка на комментарий

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

    function my_binder:__init(obj) super(obj)
         self.my_field = {tbl}
    end

    new_binder = my_binder(obj)

    obj:bind_object(new_binder) 

     

    необходимо получить доступ к полю my_field биндера.

    Благодарю!

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

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

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

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

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

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

    Войти

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

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

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

    AMK-Team.ru

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