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


Фотография

lbData и UI


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

#1 OFFLINE   ReXcOr

ReXcOr

    Ст.сержант

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

Отправлено 05 March 2018 - 23:27

Товарищи, столкнулся с такой проблемой... Захотел сделать интерактив. меню через инвентарь (двойной клик по итему), но что-то пошло не так, увы.

 

Как я пытался это сделать:

1. Жду открытия инвентаря

2. При открытии, каждую секунду хинт выдает мне lbData выделенного control (Типа хинт дебаг, дальше которого уйти я так и не смог)

В данном случае я пытался получить инфу из контейнера нагрудника.

Проблема собственно в том, что если класс интересующей меня lbData не является CfgMagazines, то движок возвращает мне пустые скобки, то есть - навелся я на магазин от любой винтовки или на дымовую гранату, мне возвращается её класс

А если я навожусь на детектор или аптечку мне прилетает вот это - ""

 

Как я понял, ванильная функция инициализации инвентаря наполняет lbData только в том случае, если наша вещь в CfgMagazines, а как мне быть с остальными вещами, подскажите как мне их определить?

 

Вот кусок кода:

item_check = {

disableSerialization;

	while {true} do {
	sleep 1;
	_inventory = findDisplay 602;
	_vestList = _inventory displayCtrl 638;
	_cur = lbCurSel _vestList;
	_selData = _vestList lbData _cur;
	_selText = _vestList lbText _cur;

	hintSilent str [_selData,_selText,_cur];
	};
};

  • 0

#2 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 06 March 2018 - 01:50

Это так работает, если не магазин возвращается пустая строка, почему БЕСы решили так, большой ХЗ, да и сами они, БЕСЫ, сплошное недоразумение.


 

а как мне быть с остальными вещами, подскажите как мне их определить?

Мой личный опыт говорит что через графический интерфейс инвентаря ни как. Курсор не вернёт ни чего кроме магазинов.


 

Как я понял, ванильная функция инициализации инвентаря наполняет lbData

Ни каких внешних функций, это работает на уровне движка.


  • 1

#3 OFFLINE   ReXcOr

ReXcOr

    Ст.сержант

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

Отправлено 06 March 2018 - 18:52

Это так работает, если не магазин возвращается пустая строка, почему БЕСы решили так, большой ХЗ, да и сами они, БЕСЫ, сплошное недоразумение.


 

а как мне быть с остальными вещами, подскажите как мне их определить?

Мой личный опыт говорит что через графический интерфейс инвентаря ни как. Курсор не вернёт ни чего кроме магазинов.


 

Как я понял, ванильная функция инициализации инвентаря наполняет lbData

Ни каких внешних функций, это работает на уровне движка.

 

Спасибо за ответ SteelRat)

 

Если я правильно понял, то я вынужден перекидывать CfgItems на CfgMagazines?)


  • 0

#4 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 06 March 2018 - 20:55


Захотел сделать интерактив. меню через инвентарь (двойной клик по итему),

 

Вот простенькое решение, и имхо удобное.

При старте запускаем цикл на открытие\закрытие инвентаря.
Если инвентарь откроется - навешиваем на его контролы обработчики даблклика - зная ИДС просто вешаем 3 ЕХ, с доп. аргументом.

while {true} do
    {
        waitUntil { !(isNull (findDisplay 602)) };
        ((findDisplay 602) displayCtrl 633) ctrlSetEventHandler ["LBDblClick", "[_this, 'uniform'] call Ultima_Client_Procedure_Player_OnDblClick_Inventory_Object"];
        ((findDisplay 602) displayCtrl 638) ctrlSetEventHandler ["LBDblClick", "[_this, 'vest'] call Ultima_Client_Procedure_Player_OnDblClick_Inventory_Object"];
        ((findDisplay 602) displayCtrl 619) ctrlSetEventHandler ["LBDblClick", "[_this, 'backpack'] call Ultima_Client_Procedure_Player_OnDblClick_Inventory_Object"];
        waitUntil { (isNull (findDisplay 602)) };
    };

    
Сама процедурка Ultima_Client_Procedure_Player_OnDblClick_Inventory_Object
Примерно такая -
 

private ["_listitem", "_space", "_idc", "_index", "_text"];
_listItem    =    (_this select 0);                //    Элемент списка, по которому был клик(окно инвентаря - лист-бокс)
_space        =    (_this select 1);                //    Инвентарь, в котором находится объект (uniform, vest, backpack)
_idc        =    ctrlIDC (_listItem select 0);    //    Получаем контрол дисплея
_index        =    (_listItem select 1);            //    Получаем индекс позиции в списке
_text        =    lbText [_idc, _index];            //    Получаем текст предмета
//hint _text;
switch (_text) do
    {
        case "какой то предмет": {[_space] spawn процедурка;};
    };

  • 1

#5 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 06 March 2018 - 21:07

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

 

        case "Тушенка": {[_space] spawn eat_food;};

 

......

 

eat_food=

{

_space = _this select 0;

//зная пространство - удаляем оттуда тушенку

switch (_space) do

{

case "uniform": {_player removeItemFromUniform "tooshenka";};

.......

};

..что то делаем далее.

};

 

Ну как то так.


Сообщение отредактировал NoNameUltima: 06 March 2018 - 21:11

  • 0

#6 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 06 March 2018 - 22:41

А если локализация "Зимбабве"?

Но как костыль подходит).


  • 0

#7 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 06 March 2018 - 23:03

SteelRat,

так ну он же должен основываться на названии своих объектов при написании скриптов. Какая уж разница что там за локализация)

Это уже дело 10тое)


  • 1

#8 OFFLINE   ReXcOr

ReXcOr

    Ст.сержант

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

Отправлено 06 March 2018 - 23:37

Кстати, только зашел и как раз хотел спросить по поводу локализации))

Никогда не сталкивался с ней, если я правильно понял, то выглядеть это должно примерно так:

_text = localize "STR_My_file";
switch (_text) do
    {
        case "STR_My_file1": {[_space] spawn процедурка;};
    };
 

 Примерно так?)


  • 0

#9 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 07 March 2018 - 00:25

ReXcOr, зачем вам switch? Все же просто:
systemChat localize “STR_MY_LOCALIZED_TEXT”;

  • 1

#10 OFFLINE   ReXcOr

ReXcOr

    Ст.сержант

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

Отправлено 07 March 2018 - 01:07

Да, уже почитал БИКИ, спасибо за наводки))


  • 0

#11 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 07 March 2018 - 05:47

SteelRat,

так ну он же должен основываться на названии своих объектов при написании скриптов. Какая уж разница что там за локализация)

Это уже дело 10тое)

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

 

Одним словом, если предмет сделан по феньшую, то при смене локализации армы, кирилица в вашем скрипте перестанет быть актуальной.


Сообщение отредактировал SteelRat: 07 March 2018 - 05:50

  • 0

#12 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 07 March 2018 - 12:19

SteelRat, ааа ну так то да. Надо будет глянуть, есть ли что то в lbData чтобы не по названию определять.


  • 0

#13 OFFLINE   ReXcOr

ReXcOr

    Ст.сержант

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

Отправлено 07 March 2018 - 12:24

SteelRat, ааа ну так то да. Надо будет глянуть, есть ли что то в lbData чтобы не по названию определять.


Вот в этом и беда, что нету))
Эх не хочется мне делать через lbText, чувствую как-то это непорядочно))
По этому попробую продолжить свои поиски, если накопаю интересного, по-любому вам расскажу)
  • 0

#14 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 07 March 2018 - 15:40


Вот в этом и беда, что нету))

Выдает. Но не все...

Ultima_Client_Procedure_Player_OnDblClick_Inventory_Object    =
        {
            private ["_listitem", "_space", "_idc", "_index", "_text", "_data"];
            _listItem    =    (_this select 0);
            _space        =    (_this select 1);
            _idc        =    ctrlIDC (_listItem select 0);
            _index        =    (_listItem select 1);
            _text        =    lbText [_idc, _index];
            _data        =    lbData [_idc, _index];
            hint format["_text: %1, _data: %2", _text, _data];
            diag_log format["_text: %1, _data: %2", _text, _data];
        };

14:57:25 "_text: ХИС (зеленый), _data: Chemlight_green"
14:57:26 "_text: Магазин STANAG, 30 патр. 6,5 мм, _data: 30Rnd_65x39_caseless_mag"
14:57:30 "_text: Голографический прицел Mk17, _data: "
14:57:35 "_text: Дымовая шашка (оранжевая), _data: SmokeShellOrange"
14:57:42 "_text: ПНВ (коричневый), _data: "
 


Сообщение отредактировал NoNameUltima: 07 March 2018 - 16:28

  • 0

#15 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 07 March 2018 - 16:25

Собственно о этой проблеме человек и пишет, возвращается дата только для магазинов.


  • 0

#16 OFFLINE   ReXcOr

ReXcOr

    Ст.сержант

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

Отправлено 07 March 2018 - 17:42

В общем единственное решение, которое я нашел, это шерстить весь конфиг с помощью:

configName (("getText (_x >> 'displayName') == 'Искомый_Класс_По_Disp_Name'" configClasses (configFile >> "cfgWeapons"))select 0);
Но это удовольствие стоит нам 3мс(без аддонов), чего это будет стоить на "калькуляторе" я не знаю, по этому удовольствие, скорее сомнительное, с точки зрения оптимизации)).
И наверное придется костылить таблицу с локализацией(

Сообщение отредактировал ReXcOr: 07 March 2018 - 17:44

  • 1

#17 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 07 March 2018 - 18:37


Но это удовольствие стоит нам 3мс(без аддонов), чего это будет стоить на "калькуляторе" я не знаю, по этому удовольствие, скорее сомнительное, с точки зрения оптимизации)).

Так этож на клиенте в миссии. - Не критично, и крайне мало///

del


Сообщение отредактировал NoNameUltima: 07 March 2018 - 18:45

  • 0

#18 OFFLINE   ReXcOr

ReXcOr

    Ст.сержант

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

Отправлено 07 March 2018 - 18:54

Да в принципе я согласен, тем более скрипт стреляет только при открытии инвентаря...

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

По этому и чахну сижу над этой фигней)


Сообщение отредактировал ReXcOr: 07 March 2018 - 18:56

  • 0

#19 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 07 March 2018 - 19:25

ReXcOr, пробовали сопоставлять getUnitLoadout с жтим списком? Может там есть какая-то закономерность?
  • 0

#20 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 07 March 2018 - 19:46

ReXcOr, вот вам на подумать:
onEachFrame {
    _a = [];
    
    {
        _a pushBack [_forEachIndex, _x];
    } forEach (((getUnitLoadout player) select 4) select 1);

    hintSilent (_a joinString toString [92,110]);
};

PS Придется немного отсортировать массив, но закономерность думаю видна:

  • 1




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