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


Фотография

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";
					};
				};
			};
		};
	};
};
Перейти к сообщению


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

#1 OFFLINE   moroz89

moroz89

    Мл.сержант

  • Пользователи
  • 116 сообщений

Отправлено 25 May 2018 - 17:38

Что есть:
1. extdb3 в которую выгружаются данные игроков, в том числе очки
2. Есть скрипт на отображение ника над головой игрока.
Задача: какой командой выгрузить очки игроков с базы, и на основании этих очков дописать над головой игрока звание. Допусти 100-200 очков сержант, 200-300 - лейтенант и тд.
Спасибо!))
  • 0

#2 OFFLINE   ReXcOr

ReXcOr

    Ст.сержант

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

Отправлено 30 May 2018 - 10:06

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

Сообщение отредактировал ReXcOr: 30 May 2018 - 10:06

  • 0

#3 OFFLINE   moroz89

moroz89

    Мл.сержант

  • Пользователи
  • 116 сообщений

Отправлено 31 May 2018 - 11:11

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

Да, опыт есть, хоть и не большой. Так же рассмотрел бы другие варианты реализации званий. Еще в базу данных вносятся UID игроков. Можно например вручную прописывать каждому игроку звание, такой вариант меня тоже устраивает. Главная задача, чтобы это звание отображалось рядом с ником игрока)
  • 0

#4 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 31 May 2018 - 11:40

Что есть:
1. extdb3 в которую выгружаются данные игроков, в том числе очки
2. Есть скрипт на отображение ника над головой игрока.
Задача: какой командой выгрузить очки игроков с базы, и на основании этих очков дописать над головой игрока звание. Допусти 100-200 очков сержант, 200-300 - лейтенант и тд.

А где это всё? В частности, структура БД, каким образом осуществляется с ней взаимодействие (фреймворк, напрямую...), код для отображения инфы над головой игрока.

Или ничего нет, а есть только хотелка?


Сообщение отредактировал Schatten: 31 May 2018 - 11:46

  • 0

#5 OFFLINE   moroz89

moroz89

    Мл.сержант

  • Пользователи
  • 116 сообщений

Отправлено 31 May 2018 - 13:04

Что есть:
1. extdb3 в которую выгружаются данные игроков, в том числе очки
2. Есть скрипт на отображение ника над головой игрока.
Задача: какой командой выгрузить очки игроков с базы, и на основании этих очков дописать над головой игрока звание. Допусти 100-200 очков сержант, 200-300 - лейтенант и тд.

А где это всё? В частности, структура БД, каким образом осуществляется с ней взаимодействие (фреймворк, напрямую...), код для отображения инфы над головой игрока.
Или ничего нет, а есть только хотелка?
БД настроена по тому же принципу, что в этой инструкции (https://arma3.ru/for...3/?fromsearch=1)


Вот скрипт на отображение имени:

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];
}];


  • 0

#6 OFFLINE   ReXcOr

ReXcOr

    Ст.сержант

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

Отправлено 31 May 2018 - 23:03

А ранг из базы данных выгружается?

Где зацепиться за него можно?

По сути вам надо выгрузить ранг из БД, вписать его в каждого игрока (публично) и в скрипте с отрисовкой имени в draw3D тупо поместить ссылку на ранг, прямо в ту же строку, где это имя и отрисовывается.


Сообщение отредактировал ReXcOr: 31 May 2018 - 23:08

  • 0

#7 OFFLINE   moroz89

moroz89

    Мл.сержант

  • Пользователи
  • 116 сообщений

Отправлено 31 May 2018 - 23:26

А ранг из базы данных выгружается?
Где зацепиться за него можно?
По сути вам надо выгрузить ранг из БД, вписать его в каждого игрока (публично) и в скрипте с отрисовкой имени в draw3D тупо поместить ссылку на ранг, прямо в ту же строку, где это имя и отрисовывается.

Нет. Ранг не выгружается. Только очки, количество убийств, тимкиллов. Нужно как-то очки преобразовать в ранг
  • 0

#8 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 31 May 2018 - 23:34

moroz89, предоставь код, с помощью которого выгружаются

очки, количество убийств, тимкиллов.

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


  • 0

#9 OFFLINE   moroz89

moroz89

    Мл.сержант

  • Пользователи
  • 116 сообщений

Отправлено 01 June 2018 - 00:00

moroz89, предоставь код, с помощью которого выгружаются

очки, количество убийств, тимкиллов.

и оформи его именно как код, а не цитату, а то разбираться сложно. Здесь тоже поправь оформление.
Сижу на форуме с телефона. Поэтому не могу пазобраться, как правильно сделать. Прошу прощения. Завтра попробую все исправить
  • 0

#10 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 01 June 2018 - 00:24

Сижу на форуме с телефона. Поэтому не могу пазобраться, как правильно сделать.

В редакторе кнопка "<>".


  • 0

#11 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 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

  • 0

#12 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 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

  • 0

#13 OFFLINE   moroz89

moroz89

    Мл.сержант

  • Пользователи
  • 116 сообщений

Отправлено 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

  • 0

#14 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 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

  • 0

#15 OFFLINE   moroz89

moroz89

    Мл.сержант

  • Пользователи
  • 116 сообщений

Отправлено 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";
					};
				};
			};
		};
	};
};

 

Теперь все работает! Спасибо всем огромное!!!)


  • 0




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