Перейти к содержимому


Фотография

Установка объекта с клиента, на сервер - позиция, вектора.....


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 12

#1 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 12 September 2015 - 11:49

Суть:
    Клиент(игрок) выставляет объект, и шлет запрос на сервер, с данными объекта - класс, позиция, угол, вектора.
    Сервер, устанавливает объект самостоятельно, после определенных проверок, и сохраняет в БД.

Опустил не нужное - проверки, сохранение и т.п.
Итог:

Установка объекта -
.........................................................................................

_typeOf    =    toArray (typeOf _build_obj);
_typeOf resize ( (count _typeOf) - 8 );
_typeOf    =    toString _typeOf;
_posATL    = getPosATL _build_obj;
_dir       = getDir _build_obj;
_vectorDir = vectorDir _build_obj;
_vector_Up = vectorUp _build_obj;
Server_pck = ["player_build", [_typeOf, _posATL, _dir, _vectorDir, _vector_Up]];
publicVariableServer "Server_pck";

..........................................................................................
На сервере, обработка - Server_pck -
..........................................................................................

_typeOf    = (_this select 0);
_posATL    = (_this select 1);
_dir       = (_this select 2);
_vectorDir = (_this select 3);
_vectorUp  = (_this select 4);
_object    = createVehicle [_typeOf, _posATL, [], 0, "CAN_COLLIDE"];
_object setPosATL _posATL;
_object setDir _dir;
_object setVectorDirAndUp [_vectorDir, _vectorUp];

..........................................................................................

Пробовал и, getPosASL\setPosASL, и getPos\setPos
Объекты встают не ровно, со щелями, смещаются...

Отсюда пара вопросов:
1. Как правильно создать объект - сохранить и применить - координаты, вектора.
2. При установке объекта с векторами, нужен setDir?

 

Примеры:

Установка привью -

 

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

Пристыковка, после установки -

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

Итог:

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

Еще один пример пристыковки, после установки -

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

Итог (вид 1):

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

Итог (вид 2):

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание


 


Сообщение отредактировал NoNameUltima: 12 September 2015 - 12:10

  • 0

#2 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 12 September 2015 - 19:16

1. Can_colide попробуй заменить на NONE
2. Какие именно аргументы ты передаешь в скрипт (Именно сам скрипт передачи параметров нужен)
3. Как именно происходит "визуализация" объекта, который ты ставишь (не когда уже поставил, а когда еще редактируешь)

Сообщение отредактировал vlad333000: 12 September 2015 - 19:17

  • 0

#3 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 12 September 2015 - 20:02

Рекомендую эти команды для определения позиций

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 

Далее при создании композиции, желательно поставить, например игровую логику, и уже относительно её определять позиции обектов.

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

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

или этой

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

не знаю будет ли разница.

 

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

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 

После создания всех объектов удаляем игровую логику.


  • 0

#4 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 12 September 2015 - 20:15

По второму вопросу, однозначно так

_vectorDir = vectorDir _build_obj;
_vector_Up = vectorUp _build_obj;


А вот это лишнее

_dir       = getDir _build_obj;

так как уже есть это

_vectorDir = vectorDir _build_obj;

 


Почерпнёте полезного во внутренностях этого

http://arma3.ru/foru...3d-editor-mini/


  • 0

#5 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 13 September 2015 - 00:35

1. Can_colide попробуй заменить на NONE
2. Какие именно аргументы ты передаешь в скрипт (Именно сам скрипт передачи параметров нужен)
3. Как именно происходит "визуализация" объекта, который ты ставишь (не когда уже поставил, а когда еще редактируешь)

1. Пробовал - результат визуально одинаковый.

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

2. В какой скрипт? - Я же выше кинул скрипты, технически только данные параметры и идут. Ниже более подробно прикреплю.

3. Не совсем понял, что значит визуализация... - Создаю объект, аттачу к игроку. При использовании привязки - детач объекта, и аттач к объекту привязки. При нажатии хот-кея установки(финал стройки) - Детач, получение координат, векторов, и отправка на сервер.

 

 

Рекомендую эти команды для определения позиций

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 

Далее при создании композиции, желательно поставить, например игровую логику, и уже относительно её определять позиции обектов.

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

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

или этой

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

не знаю будет ли разница.

 

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

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 

После создания всех объектов удаляем игровую логику.

getPosWorld\setPosWorld - частично решило проблему.

т.е. - При установке ВСЕ ОК. Идеально.

Серверу отправляются данные. Он устанавливает объект. Объект ставится там где надо. При привязке к объекту, так же все ок. Никаких щелей и смещений.

А вот при старте сервера и загрузке с БД объектов, появляются небольшие  щели и смещения...

 

Вот кусок из процедуры которая ставит объект при крафте -

_player    = (_this select 0);
_class     = (_this select 1);
_pos       = (_this select 2);
_vectorDir = (_this select 3);
_vectorUp  = (_this select 4);
_code      = (_this select 5);
...................................................................................................
_object    = createVehicle [_class, _pos, [], 0, "CAN_COLLIDE"];
_object setVectorDirAndUp [_vectorDir, _vectorUp];
_object setPosWorld _pos;
_object setVariable ["_uid", _uid, true];
_data = [_uid, _class, _pos, _vectorDir, _vectorUp, 0, _code_key, Ultima_Date, Ultima_Date];
Ultima_BD_DLL_Name callExtension format["9|OBJECTS_BUILDABLE|%1|%2", _uid, _data]; // Запись в БД

А вот кусок из процедуры, при старте сервера, когда объекты загружаются и устанавливаются -

Загрузка с БД:

...................................................................................................................................................................................................

_tmp = call compile _tmp;
a_Ultima_Objects_Buildable set [(count a_Ultima_Objects_Buildable), _tmp];

...................................................................................................................................................................................................

Полная процедура установки:

Ultima_proc_Objects_Buildable_Spawn    =
    {
        Private ["_i", "_rec", "_uid", "_class", "_pos", "_vectorDir", "_vectorUp", "_damage", "_date_create", "_date_used", "_object"];
        for "_i" from 0 to (count a_Ultima_Objects_Buildable) - 1 do
            {
                _rec         = (a_Ultima_Objects_Buildable select _i);
                _uid         = (_rec select 0);
                _class       = (_rec select 1);
                _pos         = (_rec select 2);
                _vectorDir   = (_rec select 3);
                _vectorUp    = (_rec select 4);
                _damage      = (_rec select 5);
                //_code_key
                _date_create = (_rec select 7);
                _date_used   = (_rec select 8);
                _object      = createVehicle [_class, _pos, [], 0, "CAN_COLLIDE"];
                _object setVectorDirAndUp [_vectorDir, _vectorUp];
                _object setPosWorld _pos;
                _object setDamage _damage;
                _object setVariable ["_uid", _uid, true];
                a_Ultima_Objects_Buildable set [_i, (_rec + [_object])];
                _object addMPEventHandler ["MPKilled", {_this spawn Ultima_proc_Objects_Buildable_Killed}];
                diag_log(format["[#Ultima]: [Сервер]: [Постройки]: [Событие]: Загружена и создана постройка с идентификатором: %1", _uid]);
            };
    };

Может, при считывании из БД, при использовании - call compile _tmp "бьются" координаты?

Добавлю в РПТ... но сомневаюсь.


  • 0

#6 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 13 September 2015 - 02:12

Если вам нужно разместить некую композицию из нескольких объектов, как один объект, то желательно реализовывать через это

Далее при создании композиции, желательно поставить, например игровую логику, и уже относительно её определять позиции обектов.

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

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

или этой

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

не знаю будет ли разница.

 

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

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 

После создания всех объектов удаляем игровую логику.

 


ЗЫ

Мне трудно объяснить это на пальцах, почему я вам рекомендую сделать именно так.


  • 0

#7 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 13 September 2015 - 02:18

 

_object addMPEventHandler ["MPKilled", {_this spawn Ultima_proc_Objects_Buildable_Killed}];

Вы в курсе что это будет исполнено у всех!?


  • 0

#8 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 13 September 2015 - 02:25

Кстати, а не может быть такое, что процедуры в вашей dll немножко округляют цифери? Или убавляют не много разряды чисел?

Ultima_BD_DLL_Name callExtension format["9|OBJECTS_BUILDABLE|%1|%2", _uid, _data]; // Запись в БД

  • 0

#9 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 13 September 2015 - 02:32

 

Клиент(игрок) выставляет объект, и шлет запрос на сервер, с данными объекта - класс, позиция, угол, вектора.
    Сервер, устанавливает объект самостоятельно, после определенных проверок, и сохраняет в БД.
 

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

 

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


  • 0

#10 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 13 September 2015 - 02:39

ЗЫ_3

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


  • 0

#11 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 13 September 2015 - 03:06

 

 

_object addMPEventHandler ["MPKilled", {_this spawn Ultima_proc_Objects_Buildable_Killed}];

Вы в курсе что это будет исполнено у всех!?

Тут не совсем понятно... Как правильно -

По сути в событии уничтожения, прописано -

1. Удаление из массива объектов

2. Удаление из БД

3. Если объект был с инвентарем - расшвырять лут по земле(это не реализовано, и фиг знает надо ли...  так что, пока только 2 верхних пункта)

 

По сути, должно и так работать:

_object addEventHandler ["Killed", {_this spawn Ultima_proc_Objects_Buildable_Killed}];

 

Кстати, а не может быть такое, что процедуры в вашей dll немножко округляют цифери? Или убавляют не много разряды чисел?

Ultima_BD_DLL_Name callExtension format["9|OBJECTS_BUILDABLE|%1|%2", _uid, _data]; // Запись в БД

Это точно исключено, если только сама АрмА где то не округляет цифры.

А в DLL банальщина - отдали строку, записали. Никаких действий не производится над данными.

 

P.S. Сегодня в RPT вставлю вывод координат, и сравню, что после call compile _tmp приходит...

P.S.P.S. где то в эпоче это было кстати, при векторной стройке, но что то не могу найти, как и где исправляли...хотя там именно getPosATL\setPosATL шло.


Сообщение отредактировал NoNameUltima: 13 September 2015 - 03:07

  • 0

#12 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 13 September 2015 - 11:02

Это точно исключено, если только сама АрмА где то не округляет цифры.


Все вещественные числа в памяти представлены в виде приближеных значений, так что не удивительо, что вы можете получать совсем другие значения из БД, поэтому не всегда полезно запоминать абсолютную позицию объекта, а лучше попробовать сделать это как предложил тов. SteelRat - относительно какого-либо объекта - если это не исправит то тогда хз
  • 0

#13 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 13 September 2015 - 18:35

 

Тут не совсем понятно... Как правильно -

По сути в событии уничтожения, прописано -

1. Удаление из массива объектов

2. Удаление из БД

3. Если объект был с инвентарем - расшвырять лут по земле(это не реализовано, и фиг знает надо ли...  так что, пока только 2 верхних пункта)

 

вполне разумно на сервере и дать

_object addEventHandler ["Killed", {_this spawn Ultima_proc_Objects_Buildable_Killed}];

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


 

Это точно исключено, если только сама АрмА где то не округляет цифры.

А в DLL банальщина - отдали строку, записали. Никаких действий не производится над данными.

 

P.S. Сегодня в RPT вставлю вывод координат, и сравню, что после call compile _tmp приходит...

P.S.P.S. где то в эпоче это было кстати, при векторной стройке, но что то не могу найти, как и где исправляли...хотя там именно getPosATL\setPosATL шло.

 

Тогда попробовать такие векторы

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 

А позиции этим

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание


  • 0




Яндекс.Метрика