лыжи не едут (AbnormalStatusWnd)

root@localhost:~#

Легендарный
VIP
Победитель в номинации 2022
Победитель в номинации 2021
Участник Новогоднего Фонда 2021
Сообщения
764
Розыгрыши
0
Решения
4
Репутация
278
Реакции
388
Баллы
1 723
Товарищи, нужна помощь, в AbnormalStatusWnd есть функция которая отвечает за диспел, никак не могу понять в какой момент она принимает кнопку Alt, всю голову сломал

C++:
function OnClickItem (string strID, int index)
{
    local int row;
    local int col;
    local StatusIconInfo info;
    local SkillInfo skillInfo;        // 스킬 정보. 버프스킬인지 확인해야 하니까

    col = index / 10;
    row = index - (col * 10);

    StatusIcon.GetItem(row, col, info);
    
    // ID를 가지고 스킬의 정보를 얻어온다. 없으면 패배
    if( !GetSkillInfo( info.ID.ClassID, info.Level, info.SubLevel, skillInfo ) )
    {
        //debug("ERROR - no skill info!!");
        return;
    }

    if ( InStr( strID ,"StatusIcon" ) > -1 )
    {
        //버프 취소 요청
        if (skillInfo.Debuff == 0 && skillInfo.OperateType == 1)
        {
            RequestDispel(info.ServerID, info.ID, info.Level, info.SubLevel);
        }
        //강화 스킬인 경우에만 버프 취소가 가능합니다.
        else
        {   
            AddSystemMessage(2318);   
        }   
    }
}
 
функция OnClickItem в AbnormalStatusWnd отвечает за обработку кликов на иконки статуса. Она не принимает нажатие кнопки Alt напрямую. Вместо этого, она обрабатывает клик на иконку статуса и, если статус является бафом (не дебафом) и тип операции равен 1, то она отправляет запрос на отмену бафа (RequestDispel).
 
функция OnClickItem в AbnormalStatusWnd отвечает за обработку кликов на иконки статуса. Она не принимает нажатие кнопки Alt напрямую. Вместо этого, она обрабатывает клик на иконку статуса и, если статус является бафом (не дебафом) и тип операции равен 1, то она отправляет запрос на отмену бафа (RequestDispel).
в моём понимании это так и должно работать
но обрабатывается эта функция исключительно с нажатым Alt
для примера я изменил функцию до такого вида, только с Alt'ом обрабатывает всё равно
C++:
function OnClickItem (string strID, int index)
{
    local int row;
    local int col;
    local StatusIconInfo info;
    local SkillInfo skillInfo;        // 스킬 정보. 버프스킬인지 확인해야 하니까

    col = index / 10;
    row = index - (col * 10);

    StatusIcon.GetItem(row, col, info);

    RequestBypassToServer ( "testOnClickItem" $ string ( Info.Id.ClassID )) ;

    // ID를 가지고 스킬의 정보를 얻어온다. 없으면 패배
    if( !GetSkillInfo( info.ID.ClassID, info.Level, info.SubLevel, skillInfo ) )
    {
        //debug("ERROR - no skill info!!");
        return;
    }

    if ( InStr( strID ,"StatusIcon" ) > -1 )
    {
        //버프 취소 요청
        if (skillInfo.Debuff == 0 && skillInfo.OperateType == 1)
        {
            return;
            //RequestDispel(info.ServerID, info.ID, info.Level, info.SubLevel);
        }
        //강화 스킬인 경우에만 버프 취소가 가능합니다.
        else
        {   
            AddSystemMessage(2318);   
        }   
    }
}
 
в моём понимании это так и должно работать
но обрабатывается эта функция исключительно с нажатым Alt
для примера я изменил функцию до такого вида, только с Alt'ом обрабатывает всё равно
C++:
function OnClickItem (string strID, int index)
{
    local int row;
    local int col;
    local StatusIconInfo info;
    local SkillInfo skillInfo;        // 스킬 정보. 버프스킬인지 확인해야 하니까

    col = index / 10;
    row = index - (col * 10);

    StatusIcon.GetItem(row, col, info);

    RequestBypassToServer ( "testOnClickItem" $ string ( Info.Id.ClassID )) ;

    // ID를 가지고 스킬의 정보를 얻어온다. 없으면 패배
    if( !GetSkillInfo( info.ID.ClassID, info.Level, info.SubLevel, skillInfo ) )
    {
        //debug("ERROR - no skill info!!");
        return;
    }

    if ( InStr( strID ,"StatusIcon" ) > -1 )
    {
        //버프 취소 요청
        if (skillInfo.Debuff == 0 && skillInfo.OperateType == 1)
        {
            return;
            //RequestDispel(info.ServerID, info.ID, info.Level, info.SubLevel);
        }
        //강화 스킬인 경우에만 버프 취소가 가능합니다.
        else
        { 
            AddSystemMessage(2318); 
        } 
    }
}
Советую сделать проще, найдите через поиск в исходнике интерфейса по этой клавише все места где это использует и отсейте лишнее.
Не могу сейчас более точно подсказать, но возможно обработка alt захардкодена в nwindow, или в исходнике интерфейса и вызывает с другой части кода и не конкретно здесь. 🤔🍻
 
даже если
C++:
RequestBypassToServer ( "testOnClickItem" $ string ( Info.Id.ClassID )) ;
завернуть в
C++:
if(isKeyDown(IK_LShift))
{
RequestBypassToServer ( "testOnClickItem" $ string ( Info.Id.ClassID )) ;
}
то всё равно приходится нажимать Alt+Shift
 
даже если
C++:
RequestBypassToServer ( "testOnClickItem" $ string ( Info.Id.ClassID )) ;
завернуть в
C++:
if(isKeyDown(IK_LShift))
{
RequestBypassToServer ( "testOnClickItem" $ string ( Info.Id.ClassID )) ;
}
то всё равно приходится нажимать Alt+Shift
Советую посмотреть следующее, может натолкнет на мысли для решения этого вопроса. ☕

Скрытое содержимое доступно для зарегистрированных пользователей!
 
Советую посмотреть следующее, может натолкнет на мысли для решения этого вопроса. ☕

*** Скрытый текст не может быть процитирован. ***
к сожалению это всё не то, почему то в AbnormalStatusWnd не работают функции

C++:
OnDBClickItem(String strID, int index);
OnRClickItem(String strID, int index);
OnRDBClickItem(String strID, int index);
 
к сожалению это всё не то, почему то в AbnormalStatusWnd не работают функции

C++:
OnDBClickItem(String strID, int index);
OnRClickItem(String strID, int index);
OnRDBClickItem(String strID, int index);
Возможно действительно захардкодена обработка в nwindow. 🤔

к сожалению это всё не то, почему то в AbnormalStatusWnd не работают функции

C++:
OnDBClickItem(String strID, int index);
OnRClickItem(String strID, int index);
OnRDBClickItem(String strID, int index);
Попробуйте свое окно кастомное реализовать, может можно поменять.
Сделаете, не бывает невозможного, все можно решить за 🛍️ в ищу исполнителя, или за бесплатно, в обмен на что то. 🍻🤗
 
Попробуйте свое окно кастомное реализовать, может можно поменять.
Сделаете, не бывает невозможного, все можно решить за 🛍️ в ищу исполнителя, или за бесплатно, в обмен на что то. 🍻🤗
Ну за пакеты из цума можно многое решить
 
Попробуйте свое окно кастомное реализовать, может можно поменять.
Сделаете, не бывает невозможного, все можно решить за 🛍️ в ищу исполнителя, или за бесплатно, в обмен на что то. 🍻🤗
забавно, но переименование ничего не решило
 
забавно, но переименование ничего не решило
Тогда есть альтернативный вариант, берите патч без темиды и открывайте nwindow через ghidra с декомпиляцией в псевдокод и смотрите что там отвечает за это окно. В любом случае нужно разобраться где и что это вызывает. 🍻🤗
 
условия нет, но Alt всё равно требует
попробуйте создать такую функцию:
C++:
function OnLButtonUp (WindowHandle a_WindowHandle, int X, int Y) {
    ....
    if (IsKeyDown(IK_Alt) && GetSkillInfo(Info.ClassID, Info.Level, SkillInfo)) {
        RequestBypassToServer("_dispell " $ string(SkillInfo.SkillID));
    ....
    }
}
 
попробуйте создать такую функцию:
C++:
function OnLButtonUp (WindowHandle a_WindowHandle, int X, int Y) {
    ....
    if (IsKeyDown(IK_Alt) && GetSkillInfo(Info.ClassID, Info.Level, SkillInfo)) {
        RequestBypassToServer("_dispell " $ string(SkillInfo.SkillID));
    ....
    }
}
для OnLButtonUp нужно писать обработку нажатия и границы иконок, я честно сказать устал подгонять эти пиксели под каждую иконку, это довольно глупая функция и выглядит как костыль затычка для интерлюд клиента
хотелось бы пользоваться встроенными в клиент функциями
 
для OnLButtonUp нужно писать обработку нажатия и границы иконок, я честно сказать устал подгонять эти пиксели под каждую иконку, это довольно глупая функция и выглядит как костыль затычка для интерлюд клиента
Когда подгонялись Rec и PC окна Wnd, было много крашей, но все сделано)

Можно к примеру так еще зафиксить окно:
Код:
       class'UIAPI_WINDOW'.static.SetAnchor( "RecommendBonusWnd", "RadarMapWnd", "TopRight", "TopRight", -139, 386 );
        class'UIAPI_WINDOW'.static.SetAnchor( "PCCafeEventWnd", "RadarMapWnd", "TopRight", "TopRight", -139, 528 );
 
Когда подгонялись Rec и PC окна Wnd, было много крашей, но все сделано)

Можно к примеру так еще зафиксить окно:
Код:
       class'UIAPI_WINDOW'.static.SetAnchor( "RecommendBonusWnd", "RadarMapWnd", "TopRight", "TopRight", -139, 386 );
        class'UIAPI_WINDOW'.static.SetAnchor( "PCCafeEventWnd", "RadarMapWnd", "TopRight", "TopRight", -139, 528 );
дело не в крашах и прочем, а в том, что размер иконки баффа меняется и смещаются координаты при смене размера
честно сказать мне пока мозгов не хватает правильно подогнать функцию под изменение окна
в принципе готов оплатить если кто поможет просчитать
 
короче по итогу пришлось всё таки костылить через OnLButtonUp, вариант крайне сомнительный но деваться некуда
 
короче по итогу пришлось всё таки костылить через OnLButtonUp, вариант крайне сомнительный но деваться некуда
Вот и я костылил интерфейс местами, хорошо бы конечно еще окно друзей переделать. На hf вкладка msn мешает и толку нет, но там точно нативное окно. :pandaredlol:
 
Товарищи, нужна помощь, в AbnormalStatusWnd есть функция которая отвечает за диспел, никак не могу понять в какой момент она принимает кнопку Alt, всю голову сломал

C++:
function OnClickItem (string strID, int index)
{
    local int row;
    local int col;
    local StatusIconInfo info;
    local SkillInfo skillInfo;        // 스킬 정보. 버프스킬인지 확인해야 하니까

    col = index / 10;
    row = index - (col * 10);

    StatusIcon.GetItem(row, col, info);
   
    // ID를 가지고 스킬의 정보를 얻어온다. 없으면 패배
    if( !GetSkillInfo( info.ID.ClassID, info.Level, info.SubLevel, skillInfo ) )
    {
        //debug("ERROR - no skill info!!");
        return;
    }

    if ( InStr( strID ,"StatusIcon" ) > -1 )
    {
        //버프 취소 요청
        if (skillInfo.Debuff == 0 && skillInfo.OperateType == 1)
        {
            RequestDispel(info.ServerID, info.ID, info.Level, info.SubLevel);
        }
        //강화 스킬인 경우에만 버프 취소가 가능합니다.
        else
        {  
            AddSystemMessage(2318);  
        }  
    }
}
Все просто. Проверка находится в функции NCStatusIconCtrl::OnLButtonUp. проверку делает функция NWndUtil::IsKeyDown принимающая код кнопки. Если альт нажат, вызывается UUIScript::eventOnClickItem (это наверное и есть представленная тобой функция из скрипта интерфейса)
 
Назад
Сверху Снизу