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


Фотография

BIS_fnc_loadInventory на сервере в MP, с параметрами из БД


  • Закрытая тема Тема закрыта
Сообщений в теме: 25

#1 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 08 September 2015 - 07:15

У БИСОв написано:

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

- Unit to receive the loadout.

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

- Config entry of loadout found in either CfgVehicles or CfgRespawnInventory, OR:

 

 

т.е. если я правильно понял, передаваемые параметры

1 - Объект

2 - Можно строку, полученную в результате выполнения функции

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

.

*

or

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

- usable with inventories saved via

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

.

 

**Не совсем понятно, ведь результат

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

, - массив...

 

Ну ладно, строка так строка...

 

Получили массив с помощью :

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

[["U_O_GhillieSuit",["9Rnd_45ACP_Mag","9Rnd_45ACP_Mag","20Rnd_762x51_Mag"]],["V_PlateCarrierGL_mtp",[]],["B_AssaultPack_Base",[]],"H_HelmetB_camo","G_Shades_Black","Rangefinder",["srifle_EBR_MRCO_pointer_F",["","acc_pointer_IR","optic_MRCO",""],"20Rnd_762x51_Mag"],["launch_I_Titan_F",["","","",""],""],["",["","","",""],""],["ItemMap","","","ItemRadio","ItemGPS"],[]]

Банально переделываем в строку:

*можно и str(...);

TEST_STR='[["U_O_GhillieSuit",["9Rnd_45ACP_Mag","9Rnd_45ACP_Mag","20Rnd_762x51_Mag"]],["V_PlateCarrierGL_mtp",[]],["B_AssaultPack_Base",[]],"H_HelmetB_camo","G_Shades_Black","Rangefinder",["srifle_EBR_MRCO_pointer_F",["","acc_pointer_IR","optic_MRCO",""],"20Rnd_762x51_Mag"],["launch_I_Titan_F",["","","",""],""],["",["","","",""],""],["ItemMap","","","ItemRadio","ItemGPS"],[]]';

На сервере после соединения игрока, пытаемся его "одеть обуть" :

_player = (_this select 0);
.......
_loadout    = [_player, TEST_STR] call BIS_fnc_loadInventory;

Результат:

false

Вопрос:

Как из предварительно сохраненного массива, загрузить инвентарь игроку с помощью BIS_fnc_loadInventory

?


  • 0

#2 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 08 September 2015 - 15:26

А вас не смутило что написано:
array in format ...
?

Сообщение отредактировал vlad333000: 08 September 2015 - 15:32

  • 0

#3 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 08 September 2015 - 21:37

А вас не смутило что написано:
array in format ...
?

там дальше написано

or String


  • 0

#4 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 08 September 2015 - 23:03

А не догадаться что это означает МАССИВ СТРОК, который и ВОЗВРАЩАЕТ одна бисовская функция?
  • 0

#5 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 08 September 2015 - 23:34

А не догадаться что это означает МАССИВ СТРОК, который и ВОЗВРАЩАЕТ одна бисовская функция?

Бисовская функция возвращает массив.

При чем тут всякие иссинуации - типа массив строк и т.п. я хз.

Да и телепатов нет, чтоб в догадалки играть.

Если ты про то, что передавать надо массив, а не строку - сейчас проверим.


  • 0

#6 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 08 September 2015 - 23:39

При передаче массива, результат - any


  • 0

#7 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 09 September 2015 - 05:46

Идиотизм какой то... зачем в bis_fnc_saveInventory_data выносить идентификатор за пределы своего массива.....

хрен с ним, разобрался.

тему можно офф.


  • 0

#8 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 09 September 2015 - 18:49

Идиотизм какой то... зачем в bis_fnc_saveInventory_data выносить идентификатор за пределы своего массива.....

хрен с ним, разобрался.

тему можно офф.

 

Таким форматом передаваемых данных, в вашем случае, если я правильно понял

[[массив внутри массива]] call BIS_fnc_loadInventory

 функция определяет, что вы используете формат данных bis_fnc_saveInventory_data.

 

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


  • 0

#9 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 09 September 2015 - 19:02

ЗЫ

_loadout    = [_player, [ARRAY_INVENTORY]] call BIS_fnc_loadInventory;

Сообщение отредактировал SteelRat: 09 September 2015 - 19:06

  • 1

#10 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 09 September 2015 - 23:11

 

ЗЫ

_loadout    = [_player, [ARRAY_INVENTORY]] call BIS_fnc_loadInventory;

Да, уже разобрался. Не понял, зачем было пихать массив, в массив....

 

Сохранение в бд:

Private ["_player", "_uid"................
_player = (_this select 0);
_uid = getPlayerUID _player;
_inv    =    [_player, [ObjNull, _uid]] call BIS_fnc_saveInventory;
.........
_data    =    [_uid, _inv, _damage, _oxygen, ........... _pos, _dir, 0, false, false, [], false];
Ultima_BD_DLL_Name callExtension (format ["9|PLAYERS|%1|%2", _uid, _data]);

Загрузка:

....
[_player, [(_data select 1)]] call BIS_fnc_loadInventory;
....

Кстати, вопрос немного не по теме:

Как лучше пересохранять данные в БД?

Пока ничего лучше не придумал, чем -

Цикл каждые ХХ секунд, по всем игрокам, с получением параметров, и их перезапись.


  • 0

#11 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 10 September 2015 - 00:09

 

Цикл каждые ХХ секунд, по всем игрокам, с получением параметров, и их перезапись.

На а собственно как ещё, либо по событию, игрок закрыл инвентарь,  инициализация синхронизации данных игрока в базе.

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


  • 0

#12 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 10 September 2015 - 00:21

ЗЫ

Точнее, лучше комплекс

 

1 Добавить игроку еванхандлеры Put и Take

В обработчике этих событий, при наступлении событий, например игрок что то положил или выкинул из инвентаря, дать значение, предварительно определённой глобальной переменной ForceSave, значение TRUE. Это даст возможность перед инициализацией сохранения данных произвести проверку на изменение содержимого инвентаря. Игрок может и просто открыть, посмотреть и закрыть инвентарь, не внося изменений.

player addEventHandler ["Put", {
	ForceSave = true;
}];

player addEventHandler ["Take", {
	ForceSave = true;
}];

2 Добавить игроку евантхандлер InventoryClosed

player addEventHandler ["InventoryClosed", {
	if (ForceSave) then {
		//	Инициализация сохранения данных в базу
		
		ForceSave = false;
	};
}];

  • 0

#13 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 10 September 2015 - 01:28

 

ЗЫ

Точнее, лучше комплекс

 

1 Добавить игроку еванхандлеры Put и Take

В обработчике этих событий, при наступлении событий, например игрок что то положил или выкинул из инвентаря, дать значение, предварительно определённой глобальной переменной ForceSave, значение TRUE. Это даст возможность перед инициализацией сохранения данных произвести проверку на изменение содержимого инвентаря. Игрок может и просто открыть, посмотреть и закрыть инвентарь, не внося изменений.

player addEventHandler ["Put", {
	ForceSave = true;
}];

player addEventHandler ["Take", {
	ForceSave = true;
}];

2 Добавить игроку евантхандлер InventoryClosed

player addEventHandler ["InventoryClosed", {
	if (ForceSave) then {
		//	Инициализация сохранения данных в базу
		
		ForceSave = false;
	};
}];

Это если бы надо было сохранять только изменения в инвентаре, но координаты то все равно сохранять тоже надо, а игрок постоянно двигается - что то делает....

Видимо цикл с задержкой единственное решение.

Хотя мб разделить как то сохранение инвентаря и доп. параметров, чтоб не нагружать скрипт - вот интересно, сильная ли нагрузка, если раз в 20с получать инвентарь, координаты, ну и некоторый статус игрока


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

  • 0

#14 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 10 September 2015 - 03:33

 

 

ЗЫ

Точнее, лучше комплекс

 

1 Добавить игроку еванхандлеры Put и Take

В обработчике этих событий, при наступлении событий, например игрок что то положил или выкинул из инвентаря, дать значение, предварительно определённой глобальной переменной ForceSave, значение TRUE. Это даст возможность перед инициализацией сохранения данных произвести проверку на изменение содержимого инвентаря. Игрок может и просто открыть, посмотреть и закрыть инвентарь, не внося изменений.

player addEventHandler ["Put", {
	ForceSave = true;
}];

player addEventHandler ["Take", {
	ForceSave = true;
}];

2 Добавить игроку евантхандлер InventoryClosed

player addEventHandler ["InventoryClosed", {
	if (ForceSave) then {
		//	Инициализация сохранения данных в базу
		
		ForceSave = false;
	};
}];

Это если бы надо было сохранять только изменения в инвентаре, но координаты то все равно сохранять тоже надо, а игрок постоянно двигается - что то делает....

Видимо цикл с задержкой единственное решение.

Хотя мб разделить как то сохранение инвентаря и доп. параметров, чтоб не нагружать скрипт - вот интересно, сильная ли нагрузка, если раз в 20с получать инвентарь, координаты, ну и некоторый статус игрока

 

 

Это даёт возможность рулить объёмом сетевого траффика, то есть, избирательный подход. Синхронизируется только то что изменилось. В дайз моде именно так реализованно. Рекомендую покопаться)

 

ЗЫ

То есть все данные разделены на категории. Медицина, инвентарь, итд, точно по именно уже не скажу.


Сообщение отредактировал SteelRat: 10 September 2015 - 03:36

  • 0

#15 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 10 September 2015 - 08:58

SteelRat, надо помимо put, take и закрытия инвентаря еще как-то организовать сохранение при выстрелах - ведь кол-во патронов меняется при выстрелах/перезарядке, так еще и при лечении - жесть короче :)
  • 0

#16 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 10 September 2015 - 09:14

 

 

 

ЗЫ

Точнее, лучше комплекс

 

1 Добавить игроку еванхандлеры Put и Take

В обработчике этих событий, при наступлении событий, например игрок что то положил или выкинул из инвентаря, дать значение, предварительно определённой глобальной переменной ForceSave, значение TRUE. Это даст возможность перед инициализацией сохранения данных произвести проверку на изменение содержимого инвентаря. Игрок может и просто открыть, посмотреть и закрыть инвентарь, не внося изменений.

player addEventHandler ["Put", {
	ForceSave = true;
}];

player addEventHandler ["Take", {
	ForceSave = true;
}];

2 Добавить игроку евантхандлер InventoryClosed

player addEventHandler ["InventoryClosed", {
	if (ForceSave) then {
		//	Инициализация сохранения данных в базу
		
		ForceSave = false;
	};
}];

Это если бы надо было сохранять только изменения в инвентаре, но координаты то все равно сохранять тоже надо, а игрок постоянно двигается - что то делает....

Видимо цикл с задержкой единственное решение.

Хотя мб разделить как то сохранение инвентаря и доп. параметров, чтоб не нагружать скрипт - вот интересно, сильная ли нагрузка, если раз в 20с получать инвентарь, координаты, ну и некоторый статус игрока

 

 

Это даёт возможность рулить объёмом сетевого траффика, то есть, избирательный подход. Синхронизируется только то что изменилось. В дайз моде именно так реализованно. Рекомендую покопаться)

 

ЗЫ

То есть все данные разделены на категории. Медицина, инвентарь, итд, точно по именно уже не скажу.

 

Да вот грызут меня сомнения -

Как раз таки по сетевому траффику, если при каждом движении, при каждом дергании инвентаря, получении дамаги и т.д. и т.п. заставлять серв пересохранять данные, то это жОский такой напряг и на трафф и на сервер, который будет дергать длл с эпичной скоростью. А так - раз в 20-40 секунд, вполне достаточно.)

Что касаемо статусов и т.п., то их назначает сервер, а не клиент, как в эпоче.

т.е. (на примере голода) - для всех игроков работает серверный скрипт, который в массиве игроков инкрементит переменную, раз в ХХ(скажем - раз в 2 минуты - 120сек, и не напряжно, и не часто) секунд, и отсылает клиентам новое значение.

При юзе жратвы, клиент шлет на сервер запрос, на понижение у себя, данной переменной в массиве, на некое значение(от жратвы зависит).

Как то так...

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

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

 

По игрокам, естественно, что принудительно, при дисконнекте и смерти игрока, пересохраняется все - координаты, статусы и т.п, и инвентарь при смерти очищается.


SteelRat, надо помимо put, take и закрытия инвентаря еще как-то организовать сохранение при выстрелах - ведь кол-во патронов меняется при выстрелах/перезарядке, так еще и при лечении - жесть короче :)

Ну я и пишу, что это бредово - по каждому случаю дергать слать на серв инфу.


  • 0

#17 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 10 September 2015 - 12:34

NoNameUltima, ну оба способа имеют свои плюсы и минусы и поэтому тут выбор только за тобой
  • 0

#18 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 10 September 2015 - 18:34

 

Как раз таки по сетевому траффику, если при каждом движении, при каждом дергании инвентаря, получении дамаги и т.д. и т.п. заставлять серв пересохранять данные, то это жОский такой напряг и на трафф и на сервер, который будет дергать длл с эпичной скоростью. А так - раз в 20-40 секунд, вполне достаточно.)

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

 

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


 

Насчет избирательности, интересно только одно - есть ли смысл отдельных потоков, для пересохранения

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


 

Ну я и пишу, что это бредово - по каждому случаю дергать слать на серв инфу.

Уже прояснил по этому поводу)


  • 0

#19 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 10 September 2015 - 21:57

 

Насчет избирательности, интересно только одно - есть ли смысл отдельных потоков, для пересохранения

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

 

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


  • 0

#20 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1791 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 10 September 2015 - 22:32

NoNameUltima, речь ведь про поток к БД.


  • 0




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