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

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

@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

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

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

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

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