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

DustBlue IPB Skin by CodeGame Networks

Учёт боеприпасов в рюкзаках и технике

патроны

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

#1 КенГуру

КенГуру

    Продвинутый пользователь

  • Проверенные
  • PipPipPip
  • 42 сообщений
  • ГородЧелябинск

Отправлено 07 сентября 2015 - 14:46

Приветствую уважаемое сообщество!
Вопрос к гуру по поводу проблем с сохранением в БД кол-ва боеприпасов. Почему в Эпохе не реализовано? Неужели длина строки в таблице мускула настолько коротка? Сможет ли в таком случае её усвоить дллка ultima.dll ?
Вот, например, инвентарь СуперСУВа в 2005 символов из бэкапа БД:
Скрытый текст
А т.к. вместимость лута я проставил в этом СУВе 25000 предметов - это ещё не предел строки, как я понимаю.. :)
Но баг с вечными патронами я твёрдо намерен решить. Прошу помощи советом, по крайней мере..
С уважением, и всё такое..

#2 NoNameUltima

NoNameUltima

    Администратор

  • Администраторы
  • 191 сообщений
  • ГородСанкт-Петербург

Отправлено 07 сентября 2015 - 17:41

Проблема не в сохранении БК, а в том, что в А2 нет функции наполнения рожка патронами. т.е. - либо фул рожок, либо ничего.
Если для обычного оружия, это не критично - автоматики, пистолетики и т.п., то для патронов на технике это уже сомнительно -можно каждый рестарт получать полный рожок. - 2000 патронов это не мало.

Именно по этому и не реализовано.

Реализовать можно так:

Получать кол-во патронов в рожке, и если меньше 95% патронов(от полного) - записывать в БД, что БК=0.
Если больше - сохранять БК(т.е. полный рожок при рестарте будет).
Ну и записывать не кол-во патронов, а просто 0 или 1 - есть, или нет. т.к. хранить кол-во необязательно, все равно функции пополнить рожок 1\2\3.... патронами - нет в А2.

Хранить можно в SQL, но придется проверить все скрипты и учесть кол-во передаваемых параметров.
Ну или через ДЛЛ, что проще -
Прочесть через ДЛЛ ini
*Пример записи в ini:
xxxx=[ ["aaa",2] , ["bbb", 1] ]
Где - xxxx - UID техники, aaa - рожок с ИД ааа в кол-ве 2, bbb - рожок с ИД bbb в кол-ве 1
После спавна техники, искать технику с данным ЮИД, по списку, и добавить в технику рожки.
Добавить скрипт который при стрельбе будет учитывать % патронов в рожке, и пересохранять данные в БД ini файла.
Если патронов в технике нет - удалять запись из ini

Собсно тоже самое надо и при использовании SQL делать, но еще раз повторю - геморойнее из-за того, что там уже есть параметры.

#3 КенГуру

КенГуру

    Продвинутый пользователь

  • Проверенные
  • PipPipPip
  • 42 сообщений
  • ГородЧелябинск

Отправлено 07 сентября 2015 - 20:53

Понятно..
Рассматриваю
gearSlotAmmoCount
С уважением, и всё такое..

#4 КенГуру

КенГуру

    Продвинутый пользователь

  • Проверенные
  • PipPipPip
  • 42 сообщений
  • ГородЧелябинск

Отправлено 07 сентября 2015 - 20:53

И https://community.bi...iki/weaponState
С уважением, и всё такое..

#5 КенГуру

КенГуру

    Продвинутый пользователь

  • Проверенные
  • PipPipPip
  • 42 сообщений
  • ГородЧелябинск

Отправлено 07 сентября 2015 - 20:56

Вылез вопрос - как пронумерованы слоты в рюкзаке? Номера в инвентаре есть в скрипте player_gearSync. Если узнать номера рюкзачных (и если они вообще нумеруются) - можно повторить фокус
С уважением, и всё такое..

#6 NoNameUltima

NoNameUltima

    Администратор

  • Администраторы
  • 191 сообщений
  • ГородСанкт-Петербург

Отправлено 07 сентября 2015 - 22:21

Просмотр сообщенияКенГуру (07 сентября 2015 - 20:56) писал:

Вылез вопрос - как пронумерованы слоты в рюкзаке? Номера в инвентаре есть в скрипте player_gearSync. Если узнать номера рюкзачных (и если они вообще нумеруются) - можно повторить фокус

Что есть нумераци?
Нет никакой нумерации слотов, ни в инвентаре, ни где либо еще...

#7 КенГуру

КенГуру

    Продвинутый пользователь

  • Проверенные
  • PipPipPip
  • 42 сообщений
  • ГородЧелябинск

Отправлено 08 сентября 2015 - 00:10

Просмотр сообщенияNoNameUltima (07 сентября 2015 - 22:21) писал:

Нет никакой нумерации слотов, ни в инвентаре, ни где либо еще...
Хм.. А это тогда что?
Скрытый текст
Взято из скрипта player_gearSync
С уважением, и всё такое..

#8 КенГуру

КенГуру

    Продвинутый пользователь

  • Проверенные
  • PipPipPip
  • 42 сообщений
  • ГородЧелябинск

Отправлено 08 сентября 2015 - 00:14

Скрипты все вроде поправил, но сейчас решаю траблу с player_monitor.fsm
Не знаю - удастся ли ;)
С уважением, и всё такое..

#9 NoNameUltima

NoNameUltima

    Администратор

  • Администраторы
  • 191 сообщений
  • ГородСанкт-Петербург

Отправлено 08 сентября 2015 - 01:02

Просмотр сообщенияКенГуру (08 сентября 2015 - 00:10) писал:

Хм.. А это тогда что?
//Primary Mags
for "_i" from 109 to 120 do {
_control = _dialog displayCtrl _i;
_item = gearSlotData _control;
_val = gearSlotAmmoCount _control;
_max = getNumber (configFile >> "CfgMagazines" >> _item >> "count");
if (_item != "") then {
if (_item == "BoltSteel") then { _item = "WoodenArrow" };
if (_val != _max) then {
_magazineArray set [count _magazineArray,[_item,_val]];
} else {
_magazineArray set [count _magazineArray,_item];
};
};
};
//Secondary Mags
for "_i" from 122 to 129 do {
_control = _dialog displayCtrl _i;
_item = gearSlotData _control;
_val = gearSlotAmmoCount _control;
_max = getNumber (configFile >> "CfgMagazines" >> _item >> "count");
if (_item != "") then {
if (_val != _max) then {
_magazineArray set [count _magazineArray,[_item,_val]];
} else {
_magazineArray set [count _magazineArray,_item];
};
};
};
Взято из скрипта player_gearSync

А при чем тут нумерация?
Ну если считать контролы ячеек за нумерацию, то пусть будет нумерация)

#10 КенГуру

КенГуру

    Продвинутый пользователь

  • Проверенные
  • PipPipPip
  • 42 сообщений
  • ГородЧелябинск

Отправлено 08 сентября 2015 - 02:56

Нумерация-нумерация, :)  - ишо какая!
Короче, сделал я player_monitor :rolleyes: В базу данных засунул ленту пулемётную в виде
["100Rnd_762x51_M240",69]
и после пары десятков неудачных попыток запилил-таки правильный синтаксис и получил эту ленту количеством 100.
Теперь имею в player_monitor локальную переменную с реальным кол-вом в 69, которую мне надо синхронизировать. Думаю запустить сразу в этой фазе синхронизацию перса (в соответствующем скрипте server_playerSync уже сделан учёт количества патронов).

Прокатит - как думаешь? ИМХО - должно..

Исхожу из того, что во время сессии сервак хранит кол-во патронов в гире техники, причём ТРАНСЛИРУЕТ всем. Если я скину в тачку недострелянную обойму, мой напарник, зайдя позже на сервер - найдёт её именно там именно НЕцелую. Значит, переменная количества патронов в обойме - глобальная, но не записываемая в БД.

Я теперь пишу в базу.
Схема такая:
1) Скинул игрок обойму в инвентарь тачки или в рюкзак;
2) Этот гир апдейтится (синхронизируется) и кол-во патронов записывается при этом в БД;
3) При начале новой сессии игрока (в случае с рюкзаком) или новой сессии сервера (в случае с техникой-хранилищами) обойма читается из БД в виде массива, откуда забирается её название и игрок (либо объект) спавнится С ПОЛНОЙ ОБОЙМОЙ;
4) Полученное из БД количество патронов в этой обойме ПРИСВАИВАЕТСЯ ей при апдейте.

Как план? Видно слабые места?

Я пока вижу из основных трабл только необходимость апдейтить каждую такую обойму сразу при получении переменной - ДО замены такой же из следующей неполной обоймы. Кстати, ЦЕЛЫЕ обоймы вообще не трогаются и в этой вакханалии не участвуют - просто спавнятся. :)
С уважением, и всё такое..

#11 КенГуру

КенГуру

    Продвинутый пользователь

  • Проверенные
  • PipPipPip
  • 42 сообщений
  • ГородЧелябинск

Отправлено 08 сентября 2015 - 03:10

Мдяя. Как же запускать синхрон - если рюкзак ещё не наполнился? То бишь В ПРОЦЕССЕ наполнения? :wacko: Можно ли?
Или придётся эти количества копить до окончания заполнения рюкзака?
Вот кстати кусок кода заполнения рюкзака из монитора, который переписал:
Было:
Скрытый текст
Стало:
Скрытый текст
Вот
_backpackAmmoQty
и есть выцепленное из БД количество патронов
С уважением, и всё такое..

#12 NoNameUltima

NoNameUltima

    Администратор

  • Администраторы
  • 191 сообщений
  • ГородСанкт-Петербург

Отправлено 08 сентября 2015 - 03:24

Просмотр сообщенияКенГуру (08 сентября 2015 - 02:56) писал:

Нумерация-нумерация, :)  - ишо какая!
Короче, сделал я player_monitor :rolleyes: В базу данных засунул ленту пулемётную в виде
["100Rnd_762x51_M240",69]
и после пары десятков неудачных попыток запилил-таки правильный синтаксис и получил эту ленту количеством 100.
Теперь имею в player_monitor локальную переменную с реальным кол-вом в 69, которую мне надо синхронизировать. Думаю запустить сразу в этой фазе синхронизацию перса (в соответствующем скрипте server_playerSync уже сделан учёт количества патронов).

Прокатит - как думаешь? ИМХО - должно..

Исхожу из того, что во время сессии сервак хранит кол-во патронов в гире техники, причём ТРАНСЛИРУЕТ всем. Если я скину в тачку недострелянную обойму, мой напарник, зайдя позже на сервер - найдёт её именно там именно НЕцелую. Значит, переменная количества патронов в обойме - глобальная, но не записываемая в БД.

Я теперь пишу в базу.
Схема такая:
1) Скинул игрок обойму в инвентарь тачки или в рюкзак;
2) Этот гир апдейтится (синхронизируется) и кол-во патронов записывается при этом в БД;
3) При начале новой сессии игрока (в случае с рюкзаком) или новой сессии сервера (в случае с техникой-хранилищами) обойма читается из БД в виде массива, откуда забирается её название и игрок (либо объект) спавнится С ПОЛНОЙ ОБОЙМОЙ;
4) Полученное из БД количество патронов в этой обойме ПРИСВАИВАЕТСЯ ей при апдейте.

Как план? Видно слабые места?

Я пока вижу из основных трабл только необходимость апдейтить каждую такую обойму сразу при получении переменной - ДО замены такой же из следующей неполной обоймы. Кстати, ЦЕЛЫЕ обоймы вообще не трогаются и в этой вакханалии не участвуют - просто спавнятся. :)

А зачем писать в БД кол-во патронов?)
Схема то другая :
Если патронов больше 90%  -
ПИШЕМ В БД - [ [Тип, Кол-во обойм], [Тип, Кол-во обойм] ] (пример для 2 типов обойм)
Если патронов меньше 90%  -
Если обойм больше 1 -
Удаляем 1 обойму
ПИШЕМ В БД. [ [Тип, Кол-во обойм], [Тип, Кол-во обойм] ] (пример для 2 типов обойм)
В противном случае(обойма 1, или меньше) -
ПИШЕМ В БД, запись об обоймах - [ [Тип, Кол-во обойм] ] (пример для 2 типов обойм - остался только 1 тип), или [] (если обойм вообще нету)

#13 NoNameUltima

NoNameUltima

    Администратор

  • Администраторы
  • 191 сообщений
  • ГородСанкт-Петербург

Отправлено 08 сентября 2015 - 03:34

По поводу записи -
При создании техники, добавляй технику в свой массив на сервере
My_veh_array set [(count My_veh_array), [UID техники, [массив обойм] ] ];


И 1 скрипт -
while {true} do
{
sleep 10;
....
Раз в 10 секунд к примеру прогоняй на сервере цикл по технике
Взяли технику Х, нашли ее в массиве по UID
Сравнили параметры(массив обойм)
Если параметры изменились, проверяем условия из сообщения выше -
и по условию в верхнем сообщении(проверка на % патронов), удаляем обойму\добавляем обойму\обнуляем обоймы\пишем в БД
изменяем данные в массиве, для последующей проверки
};

#14 КенГуру

КенГуру

    Продвинутый пользователь

  • Проверенные
  • PipPipPip
  • 42 сообщений
  • ГородЧелябинск

Отправлено 08 сентября 2015 - 04:15

Просмотр сообщенияNoNameUltima (08 сентября 2015 - 03:24) писал:

А зачем писать в БД кол-во патронов?
А почему бы и нет? Зачем морочиться с определением наполненности обоймы, учётом техники с таким лутом и циклами её проверки, если проще взять число патронов из БД и в точном соответствии прописать обойме при апдейте? :unsure:
С патронами в гире игрока всё пишется-читается прекрасно и без лишнего кода..

Количество символов при записи каждой битой обоймы увеличивается на 5. В ИнноДБ максимум 7000 байт ключ - я выяснил. Это 6997 символов, что до хренища - хватит на всё.. :)

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

#15 NoNameUltima

NoNameUltima

    Администратор

  • Администраторы
  • 191 сообщений
  • ГородСанкт-Петербург

Отправлено 08 сентября 2015 - 04:26

Просмотр сообщенияКенГуру (08 сентября 2015 - 04:15) писал:

А почему бы и нет? Зачем морочиться с определением наполненности обоймы, учётом техники с таким лутом и циклами её проверки, если проще взять число патронов из БД и в точном соответствии прописать обойме при апдейте? :unsure:
С патронами в гире игрока всё пишется-читается прекрасно и без лишнего кода..

Количество символов при записи каждой битой обоймы увеличивается на 5. В ИнноДБ максимум 7000 байт ключ - я выяснил. Это 6997 символов, что до хренища - хватит на всё.. :)

Да пофигу сколько там в инноБД
The game currently calls the RVExtension function with outputSize of 4096 (can be increased in future versions if needed, called extensions should always check this value and never produce output larger than this size). If the function is to receive arguments, they can be concatenated to the function name and the dll is responsible to perform any spliting / parsing / decoding as needed.
HiveExt тебе больше 4096 б не отдаст и не примет.
Хотя этого хватит за глаза.

А по поводу патронов - так эт)))
Ты шо собрался при отстреле патронов в БД скидывать их кол-во?)
т.е. - стреляют с сува в котором 2к обойма, и ты при каждом выстреле будешь дергать БД? Или как? - Как ты будешь обновлять инфу то в БД?
Если дергать длл при каждом выстреле - этж умереть не встать.)

#16 NoNameUltima

NoNameUltima

    Администратор

  • Администраторы
  • 191 сообщений
  • ГородСанкт-Петербург

Отправлено 08 сентября 2015 - 04:35

Можно на клиенте во время стрельбы смотреть сколько патронов, и если их меньше Х - отсылать на сервер сообщение, так же при зарядке(пополнении БК), смене БК.
Попутно вешая на технику setVariable с текущими значениями, и при выстреле проверять, - надо ли вообще слать на серв обновление, или все и так норм.

Хотя скрипт который технику с пуликами проверяет раз в 10-20 сек имхо и проще и особо не нагрузит серв.

#17 КенГуру

КенГуру

    Продвинутый пользователь

  • Проверенные
  • PipPipPip
  • 42 сообщений
  • ГородЧелябинск

Отправлено 08 сентября 2015 - 05:15

Ясно с длиной кея..

Просмотр сообщенияNoNameUltima (08 сентября 2015 - 04:26) писал:

Ты шо собрался при отстреле патронов в БД скидывать их кол-во?)
Да нет конечно.. :D
Я собираюсь учитывать количество патронов в недострелянных обоймах, положенных в гир тачки или ящика-сейфа для восстановления после рестарта. И положенных в рюкзак для восстановления их после релога. Надо решить этот баг уже - иначе всю игру с десятком обойм можно прожить.. :wacko:
Интересуюсь - где сервак хранит это количество до реста.. :rolleyes: Запилил скрипт server_AmmoSync по аналогии с server_playerSync, но в исходном всё опять в кей пишется и дампится в базу.. А мне надо в PV (в случае с объектами) или, хотя бы локально игроку (если речь о рюкзаке). Чтобы у него реально неполная обойма стала в рюкзаке..
С уважением, и всё такое..

#18 КенГуру

КенГуру

    Продвинутый пользователь

  • Проверенные
  • PipPipPip
  • 42 сообщений
  • ГородЧелябинск

Отправлено 08 сентября 2015 - 16:46

Переспал с этой проблемой и понял, что похоже сервак хранит всю инфу о количестве патронов в обоймах где-то в кэше?

З.Ы. Короче, хотел уже конфиги неполных обойм морочиться создавать, но потом принял решение  вообще не сохранять в БД неполные обоймы. Ибо нех.. :D
С уважением, и всё такое..

#19 NoNameUltima

NoNameUltima

    Администратор

  • Администраторы
  • 191 сообщений
  • ГородСанкт-Петербург

Отправлено 08 сентября 2015 - 20:36

Просмотр сообщенияКенГуру (08 сентября 2015 - 16:46) писал:

Переспал с этой проблемой и понял, что похоже сервак хранит всю инфу о количестве патронов в обоймах где-то в кэше?

Где то была функция, для перебора магазинов, и там возвращался массив - [ [магаз, кол-во патронов], [...] ]
Но где то потерял ее.
т.е. - посмотреть сколько, вроде можно, а вот заполнить кол-вом, в А2 нельзя. Такого нет.

#20 КенГуру

КенГуру

    Продвинутый пользователь

  • Проверенные
  • PipPipPip
  • 42 сообщений
  • ГородЧелябинск

Отправлено 08 сентября 2015 - 22:29

Жулькаю надыбанную
setGearSlotAmmoCount
:)

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

Сообщение отредактировал КенГуру: 08 сентября 2015 - 22:53

С уважением, и всё такое..




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных