
extdb3 и звания

Лучший Ответ Schatten , 01 June 2018 - 13:58
Теперь вопрос, как сделать так, чтобы от количества очков переменной присваивалась определенная строка из stringtable.xml?
Делал вот так, но не работает (пишет перед ником any).
Это потому, что _pRankP не видна вне оператора if. Чтобы была видна, надо вынести:
_pRankP = if (_pScore < 100000) then { localize "STR_DOM_MISSIONSTRING_1000001"; } else { if (_pScore < 200000) then { localize "STR_DOM_MISSIONSTRING_1000002"; } else { if (_pScore < 300000) then { localize "STR_DOM_MISSIONSTRING_1000003"; } else { if (_pScore < 400000) then { localize "STR_DOM_MISSIONSTRING_1000004"; } else { if (_pScore < 500000) then { localize "STR_DOM_MISSIONSTRING_1000005"; } else { if (_pScore < 600000) then { localize "STR_DOM_MISSIONSTRING_1000006"; } else { localize "STR_DOM_MISSIONSTRING_1000007"; }; }; }; }; }; };Перейти к сообщению

#1
OFFLINE
Отправлено 25 May 2018 - 17:38
1. extdb3 в которую выгружаются данные игроков, в том числе очки
2. Есть скрипт на отображение ника над головой игрока.
Задача: какой командой выгрузить очки игроков с базы, и на основании этих очков дописать над головой игрока звание. Допусти 100-200 очков сержант, 200-300 - лейтенант и тд.
Спасибо!))
#2
OFFLINE
Отправлено 30 May 2018 - 10:06
Если есть опыт работы с кодом в арме, могу только подсказать последовательность действий, по которому вы уже сможете сами такую штуку, своими знаниями реализовать или скорее внедрить в скрипты на вашем серве
Сообщение отредактировал ReXcOr: 30 May 2018 - 10:06
#3
OFFLINE
Отправлено 31 May 2018 - 11:11
Да, опыт есть, хоть и не большой. Так же рассмотрел бы другие варианты реализации званий. Еще в базу данных вносятся UID игроков. Можно например вручную прописывать каждому игроку звание, такой вариант меня тоже устраивает. Главная задача, чтобы это звание отображалось рядом с ником игрока)Дело не очень прям сложное, но и на такое простое, чтобы за один раз выложить годный ответ на форуме, без правок и лишнего геморроя...
Если есть опыт работы с кодом в арме, могу только подсказать последовательность действий, по которому вы уже сможете сами такую штуку, своими знаниями реализовать или скорее внедрить в скрипты на вашем серве
#4
OFFLINE
Отправлено 31 May 2018 - 11:40
Что есть:
1. extdb3 в которую выгружаются данные игроков, в том числе очки
2. Есть скрипт на отображение ника над головой игрока.
Задача: какой командой выгрузить очки игроков с базы, и на основании этих очков дописать над головой игрока звание. Допусти 100-200 очков сержант, 200-300 - лейтенант и тд.
А где это всё? В частности, структура БД, каким образом осуществляется с ней взаимодействие (фреймворк, напрямую...), код для отображения инфы над головой игрока.
Или ничего нет, а есть только хотелка?
Сообщение отредактировал Schatten: 31 May 2018 - 11:46
#5
OFFLINE
Отправлено 31 May 2018 - 13:04
БД настроена по тому же принципу, что в этой инструкции (https://arma3.ru/for...3/?fromsearch=1)А где это всё? В частности, структура БД, каким образом осуществляется с ней взаимодействие (фреймворк, напрямую...), код для отображения инфы над головой игрока.Что есть:
1. extdb3 в которую выгружаются данные игроков, в том числе очки
2. Есть скрипт на отображение ника над головой игрока.
Задача: какой командой выгрузить очки игроков с базы, и на основании этих очков дописать над головой игрока звание. Допусти 100-200 очков сержант, 200-300 - лейтенант и тд.
Или ничего нет, а есть только хотелка?
Вот скрипт на отображение имени:
addMissionEventHandler ["Draw3D", {
{
if (cursorTarget == vehicle _x && (vehicle player) distance _x < viewDistance) then
{
_clr = [0,1,0,1];
_pos = vehicle _x modelToWorld (vehicle _x selectionPosition "camera");
if (_x getVariable "isUnconscious") then
{
_clr = [1,0,0,1];
};
if (vehicle _x == _x) then
{
_vt = roleDescription _x ;
drawIcon3D
[
'',
_clr,
_pos,
0,
0,
getdir player,
format ["%1 [%2]",name _x,_vt],
2,
0.04,
'EtelkaMonospaceProBold'
];
}else
{
_pos = position (vehicle _x);
_pos set [2, (((vehicle _x) modelToWorld [0,0,0]) select 2) + 1];
_tx = format ["%1",(name vehicle _x)];
_clr = [0,1,0,1];
if ((count crew (vehicle _x)) > 1) then
{
_tx = format ["%1 + [%2]",(name vehicle _x),(count crew (vehicle _x))-1];
};
drawIcon3D
[
'',
_clr,
_pos,
0,
0,
getdir player,
_tx,
2,
0.04,
'EtelkaMonospaceProBold'
];
};
};
} count Playableunits - [player];
}];
#6
OFFLINE
Отправлено 31 May 2018 - 23:03
А ранг из базы данных выгружается?
Где зацепиться за него можно?
По сути вам надо выгрузить ранг из БД, вписать его в каждого игрока (публично) и в скрипте с отрисовкой имени в draw3D тупо поместить ссылку на ранг, прямо в ту же строку, где это имя и отрисовывается.
Сообщение отредактировал ReXcOr: 31 May 2018 - 23:08
#7
OFFLINE
Отправлено 31 May 2018 - 23:26
Нет. Ранг не выгружается. Только очки, количество убийств, тимкиллов. Нужно как-то очки преобразовать в рангА ранг из базы данных выгружается?
Где зацепиться за него можно?
По сути вам надо выгрузить ранг из БД, вписать его в каждого игрока (публично) и в скрипте с отрисовкой имени в draw3D тупо поместить ссылку на ранг, прямо в ту же строку, где это имя и отрисовывается.
#9
OFFLINE
Отправлено 01 June 2018 - 00:00
Сижу на форуме с телефона. Поэтому не могу пазобраться, как правильно сделать. Прошу прощения. Завтра попробую все исправитьmoroz89, предоставь код, с помощью которого выгружаются
и оформи его именно как код, а не цитату, а то разбираться сложно. Здесь тоже поправь оформление.очки, количество убийств, тимкиллов.
#10
OFFLINE
Отправлено 01 June 2018 - 00:24
Сижу на форуме с телефона. Поэтому не могу пазобраться, как правильно сделать.
В редакторе кнопка "<>".
#11
OFFLINE
Отправлено 01 June 2018 - 00:48
moroz89, я бы сделал получение и сохранение в глобальную переменную очков для ВСЕХ игроков раз в 5 секунд, чтобы не тревожить БД каждый кадр. То есть запрос может выглядеть так:
SELECT :uid, :rating FROM :table
Причём данные надо будет преобразовать в такой массив:
data = [ [_uid1, _rating1], ... ];
А уже в обработчике события Draw3D определял бы звания и выводил бы их над игроками:
{ if (_x != player) then { _uid = getPlayerUID _x; _index = data findIf {(_x select 0) == _uid}; if (_index >= 0) then { _rating = (data select _index) select 1; _rank = [_rating] call someFunction; drawIcon3D [...]; }; }; } forEach playableUnits;
Более конкретная помощь будет тогда, когда предоставишь данные по БД, о которых я писал.
Сообщение отредактировал Schatten: 01 June 2018 - 10:26
#12
OFFLINE
Отправлено 01 June 2018 - 06:45
Что есть:
1. extdb3 в которую выгружаются данные игроков, в том числе очки
2. Есть скрипт на отображение ника над головой игрока.
Задача: какой командой выгрузить очки игроков с базы, и на основании этих очков дописать над головой игрока звание. Допусти 100-200 очков сержант, 200-300 - лейтенант и тд.
Спасибо!))
1. Библиотека, для работы с SQL БД. АПИ есть в нете. В ini файле создаются шаблоны для запросов, далее они вызываются, для работы с БД.
2. Смотри п.1
Пример конфига:
[Default] Version = 12 Number of Inputs = 0 Sanitize Input Value Check = false Sanitize Output Value Check = false Prepared Statement Cache = true Return InsertID = false Strip = true Strip Chars Action = STRIP Strip Chars = \/\|;{}<>\' Strip Custom Chars = \/\|;{}<>\' [ifexists] SQL1_1 = SELECT CASE WHEN EXISTS(SELECT uid FROM players WHERE uid = ?) THEN 'true' ELSE 'false' END Number of Inputs = 1 SQL1_INPUTS = 1 OUTPUT = 1 [insertrecord] SQL1_1 = INSERT INTO players (uid, value) VALUES (?, ?) Number of Inputs = 2 SQL1_INPUTS = 1,2 OUTPUT = 1 [insertrecord_alternative] SQL1_1 = INSERT INTO players SET uid = ?, value = ? Number Of Inputs = 2 SQL1_INPUTS = 1,2 [selectrecord] SQL1_1 = SELECT players FROM value WHERE uid = ? Number of Inputs = 1 SQL1_INPUTS = 1 OUTPUT = 1 [updaterecord] SQL1_1 = UPDATE players SET value=? WHERE uid = ? Number of Inputs = 1 SQL1_INPUTS = 1 OUTPUT = 1 [updaterecord_alternative] SQL1_1 = UPDATE players SET value = ? WHERE uid = ? Number of Inputs = 2 SQL1_INPUTS = 1,2
Пример запроса(соединение):
_dbname = "ArmA_BD"; DBConId = str(round(random(999999))); _result = call compile ("extDB3" callExtension format["9:ADD_DATABASE_PROTOCOL:%1:SQL_CUSTOM_V2:%2:%1",_dbname, DBConId]);
Пример функции запроса:
private["_data", "_query_id", "_query", "_result"]; _data = (_this select 0); _query_id = (_this select 1); _query = format["%1:%2:%3", _query_id, DBConId, _data]; _result = call compile ("extDB3" callExtension _query); ((_result select 1) select 0)
Вывод над башкой - гугли -
displayCtrl
ctrlSetPosition
ctrlSetStructuredText
ctrlCommit
Сообщение отредактировал NoNameUltima: 01 June 2018 - 06:51
#13
OFFLINE
Отправлено 01 June 2018 - 12:59
Итак, последние изменения!
Очки сохраняются и подгружаются в игру.
В stringtable.xml добавил нужные звания:
<Key ID="STR_DOM_MISSIONSTRING_1000001"> <Original>рядовой</Original> <Russian>рядовой</Russian> </Key> <Key ID="STR_DOM_MISSIONSTRING_1000002"> <Original>капрал</Original> <Russian>капрал</Russian> </Key> <Key ID="STR_DOM_MISSIONSTRING_1000003"> <Original>сержант</Original> <Russian>сержант</Russian> </Key> <Key ID="STR_DOM_MISSIONSTRING_1000004"> <Original>лейтенант</Original> <Russian>лейтенант</Russian> </Key> <Key ID="STR_DOM_MISSIONSTRING_1000005"> <Original>капитан</Original> <Russian>капитан</Russian> </Key> <Key ID="STR_DOM_MISSIONSTRING_1000006"> <Original>майор</Original> <Russian>майор</Russian> </Key> <Key ID="STR_DOM_MISSIONSTRING_1000007"> <Original>полковник</Original> <Russian>полковник</Russian> </Key>
В коде отображения ника над головой делаю изменения:
1. Если добавляю переменную, присваиваю ей значение из stringtable.xml, то в игре перед ником пишет звание.
if (vehicle _x == _x) then { _pRankP = localize "STR_DOM_MISSIONSTRING_1000001"; _vt = roleDescription _x ; drawIcon3D [ '', _clr, _pos, 0, 0, getdir player, format ["%1 %2 [%3]",_pRankP,name _x,_vt], 2, 0.04, 'EtelkaMonospaceProBold' ]; };
2. Если переменной присваиваю количество очков игрока, то перед ником отображаются его очки. Работает отлично.
if (vehicle _x == _x) then { _pScore = score _x; _vt = roleDescription _x ; drawIcon3D [ '', _clr, _pos, 0, 0, getdir player, format ["%1 %2 [%3]",_pScore,name _x,_vt], 2, 0.04, 'EtelkaMonospaceProBold' ]; };
3. Теперь вопрос, как сделать так, чтобы от количества очков переменной присваивалась определенная строка из stringtable.xml?
Делал вот так, но не работает (пишет перед ником any). Наверное я чушь какую-то написал)))
if (vehicle _x == _x) then { _pScore = score player; if (_pScore < 100000) then { _pRankP = localize "STR_DOM_MISSIONSTRING_1000001"; } else { if (_pScore < 200000) then { _pRankP = localize "STR_DOM_MISSIONSTRING_1000002"; } else { if (_pScore < 300000) then { _pRankP = localize "STR_DOM_MISSIONSTRING_1000003"; } else { if (_pScore < 400000) then { _pRankP = localize "STR_DOM_MISSIONSTRING_1000004"; } else { if (_pScore < 500000) then { _pRankP = localize "STR_DOM_MISSIONSTRING_1000005"; } else { if (_pScore < 600000) then { _pRankP = localize "STR_DOM_MISSIONSTRING_1000006"; } else { _pRankP = localize "STR_DOM_MISSIONSTRING_1000007"; }; }; }; }; }; }; _vt = roleDescription _x ; drawIcon3D [ '', _clr, _pos, 0, 0, getdir player, format ["%1 %2 [%3]",_pRankP,name _x,_vt], 2, 0.04, 'EtelkaMonospaceProBold' ]; }
Сообщение отредактировал moroz89: 01 June 2018 - 13:01
#14
OFFLINE
Отправлено 01 June 2018 - 13:58 Лучший Ответ
Теперь вопрос, как сделать так, чтобы от количества очков переменной присваивалась определенная строка из stringtable.xml?
Делал вот так, но не работает (пишет перед ником any).
Это потому, что _pRankP не видна вне оператора if. Чтобы была видна, надо вынести:
_pRankP = if (_pScore < 100000) then { localize "STR_DOM_MISSIONSTRING_1000001"; } else { if (_pScore < 200000) then { localize "STR_DOM_MISSIONSTRING_1000002"; } else { if (_pScore < 300000) then { localize "STR_DOM_MISSIONSTRING_1000003"; } else { if (_pScore < 400000) then { localize "STR_DOM_MISSIONSTRING_1000004"; } else { if (_pScore < 500000) then { localize "STR_DOM_MISSIONSTRING_1000005"; } else { if (_pScore < 600000) then { localize "STR_DOM_MISSIONSTRING_1000006"; } else { localize "STR_DOM_MISSIONSTRING_1000007"; }; }; }; }; }; };
Сообщение отредактировал Schatten: 01 June 2018 - 14:00
#15
OFFLINE
Отправлено 01 June 2018 - 14:09
Теперь вопрос, как сделать так, чтобы от количества очков переменной присваивалась определенная строка из stringtable.xml?
Делал вот так, но не работает (пишет перед ником any).Это потому, что _pRankP не видна вне оператора if. Чтобы была видна, надо вынести:
_pRankP = if (_pScore < 100000) then { localize "STR_DOM_MISSIONSTRING_1000001"; } else { if (_pScore < 200000) then { localize "STR_DOM_MISSIONSTRING_1000002"; } else { if (_pScore < 300000) then { localize "STR_DOM_MISSIONSTRING_1000003"; } else { if (_pScore < 400000) then { localize "STR_DOM_MISSIONSTRING_1000004"; } else { if (_pScore < 500000) then { localize "STR_DOM_MISSIONSTRING_1000005"; } else { if (_pScore < 600000) then { localize "STR_DOM_MISSIONSTRING_1000006"; } else { localize "STR_DOM_MISSIONSTRING_1000007"; }; }; }; }; }; };
Теперь все работает! Спасибо всем огромное!!!)