|
|
Модератор форума: Slon |
Форум » РЕДАКТОР - ArmA 2 » Скрипты » Имя юнита над головой ( Easy Nametags ) (nametags через addAction) |
Имя юнита над головой ( Easy Nametags ) |
› Понедельник
› 03.11.2014
› 23:26
› Сообщение #
Накануне в интернетах наткнулся на интересный и перспективный способ использования 8го параметра команды addAction. В частности, подсветка имён над головами юнитов для А3, и не долго думая решил переписать этот подход для А2 (в А3 используется команда drawIcon3D ).
Фишка в следующем: И так, вернемся к теме, по скольку возможности сделать надпись на экране в А2 одной командой нетъ, описываем класс диалога в классе RscTitles: Description.ext: Код class RscTitles { class ENT_Playertags { idd = 1000600; movingEnable=0; duration = 15000; onLoad = "uiNamespace setVariable ['ENT_playertag',[_this select 0,1000601]]"; controlsBackground[] = {"ENT_playertag"}; class ENT_playertag { idc = 1000601; type = 13; style = 0x01; x = 0.5; y = 0.5; w = 0.25; h = 0.2; size = 0.02; colorBackground[] = {0,0,0,0}; colortext[] = {0,0,0,0.7}; text =""; class Attributes { align = "right"; valign = "middle"; size = "1"; shadow = true; shadowColor = "#2D2D2D"; }; }; }; }; ENT_unitTags.sqf: Код /* ScriptName: Easy NameTags Version: 1.01 Author: Aloe {itfruit@mail.ru} Game: Arma2 Multiplayer: not supported Description: Only for Units! Display over head the name and type of non playble units. Script use the 8th element in addAction params array for execute (very little CPU cost). Thank КК for the excellent idea! reserved prefix: ENT_ */ 10 cutRsc ["ENT_playertags", "PLAIN"]; ENT_addTag = { if(_this isKindOf "Man" && isNil {_this getVariable "ENT_tag"};)then{ _this setVariable ["ENT_tag", _this addAction ["", "", "", 0, false, false, "", " _display = (uiNamespace getVariable 'ENT_playertag') select 0; _idc = (uiNamespace getVariable 'ENT_playertag') select 1; _control = _display displayCtrl _idc; _h = switch(toLower (unitPos _target))do{case 'auto':{2};case 'up':{2};case 'middle':{1.5};case 'down':{0.5};default {0}}; _p = getPosATL _target; _pos = worldToScreen [_p select 0, _p select 1, _h]; _maxDist = 10; _dist = round (_target distance player); if( _maxDist > _dist && alive _target && cursorTarget == _target && count _pos > 0 )then{ if( _pos select 0 > 0.4 && _pos select 0 < 0.6 && _pos select 1 < 0.4 && _pos select 1 > 0.03 )then{ _text = gettext(configFile >> 'CfgVehicles' >> (typeof _target) >> 'displayName'); _name = parseText format [""<t size='%4' shadow='true' align='center' color='%5'>%1</t><br/><t size='%4' shadow='true' align='center' color='%6'>[%2]</t>"", name _target, _text, _dist, 1.3, '#dfd7a5', '#DDDDDD']; _control ctrlShow true; _control ctrlSetStructuredText _name; _control ctrlSetPosition [(_pos select 0)-0.125,_pos select 1]; _control ctrlCommit 0; _control ctrlSetFade ( _dist / _maxDist ); }else{_control ctrlShow false}; }else{_control ctrlShow false}; if(!alive _target)then{_target removeAction (_target getVariable 'ENT_tag')}; false "]]; }; }; Init.sqf Как подключать и использовать: Код //Подключение самого скрипта _script = [] spawn compile preprocessFileLineNumbers "ENT_unitTags.sqf"; waitUntil{scriptDone _script}; //Для всех юнитов, которые созданы в редакторе {_x call ENT_addTag} foreach (allUnits - [player]); //Для некоторых юнитов или для динамически создаваемых {object} call ENT_addTag; *Cheers* Несколько замечаний по скрипту: 1. Применять скрипт только к юнитам! При желании можно сделать так, чтобы и к технике можно было. Но по моему это бессмысленно, дистанция всего лишь 10м. К тому же реализма добавляет - а вот хрен его знает, кто там в машине сидит. 2. Этот скрипт не покатит в мультиплеере. Есть мутные сомненья что вообще вариант такой подойдет. Если только прикреплять к игроку скрипт, а если так то смысл подхода утрачивается, проще циклом делать 3. Т.к. выполнение кода осуществляется внутри addAction, возникают трудности при скрытии ника, достаточно не просто отследить момент до того как код перестаёт выполняться, для того чтобы убрать надпись с экрана изнутри этого кода. По этому возможны залипания текста на экране. Я использовал вот такое условие: if( _pos select 0 > 0.4 && _pos select 0 < 0.6 && _pos select 1 < 0.4 && _pos select 1 > 0.03 )then{ где _pos = worldToScreen {позиция юнита} 0.4, 0.6, 0.4, 0.03 - все вместе образуют некий абстрактный квадрат внутри которого код ещё будет выполняться, а за его пределами нет Хрень полная, по хорошему надо составить выражение, при котором значения меняются в зависимости от дистанции до объекта. Но я это пока оставляю, если кто поможет будет хорошо. Добавлено (02.11.2014, 04:22) Добавлено (02.11.2014, 21:27) Добавлено (03.11.2014, 23:26)
Cтруктуры данных важнее кода!
Список команд | Список оружия | Список техники | Список юнитов | Список объектов Armstalker Online |
| |||
| |||
Чат сайта |