Interlude Alt + Click

  • Автор темы Автор темы Neo`
  • Дата начала Дата начала

Neo`

Хозяин тайги
Powered by PTS
Сообщения
658
Розыгрыши
0
Решения
1
Репутация
282
Реакции
1 223
Баллы
1 753
Уважаемые форумчане. Поделитесь пожалуйста сурсом реализации Alt + Click для IL. Готовое скомпиленное решение на руках имеется (DLL + скомпиленый интерфейс), но нужен именно сурс, чтобы не потерять другие моды которые есть в Interface.u заменив существующий Interface.u скомпиленным с поддержкой Alt+Click.

P.S. поиском на форуме я пользоваться умею, но описанное решение там для дабл-клик, а хотелось бы именно Alt + Click (вдруг найдутся добрые люди).
 
у меня нет байпасса для снятия бафа со стороны сервера. снятия бафа реализовано пакетом. соот-но я должен получить инфу из Interface.u, отправить её в DLL, и уже из DLL дунуть пакет в сторону сервера. Вопрос как раз как реализовать передачу инфы о снимаемом бафе по Alt+Click.

На форуме нашел код, в нем описан пример работы с Alt + Click, правда так же используется байпасс:

Код:
function OnLButtonDown (WindowHandle a_WindowHandle, int X, int Y)
{
    local Rect windowBounds;
    local int targetRow;
    local int targetCol;
 
    local StatusIconInfo info;
    local SkillInfo skillInfo;
    if (IsKeyDown( IK_Alt ))
    {
        // Find window position
        windowBounds = Me.GetRect();
 
        // Process clicks outside of window frame only
        if (X > (windowBounds.nX + NSTATUSICON_FRAMESIZE))
        {
            //Calc row and col of targeted icon
            targetRow = (Y - windowBounds. nY) / (GetBuffSize() + 2);
            targetCol = (X - windowBounds. nX - NSTATUSICON_FRAMESIZE) / (GetBuffSize() + 2);
 
            // Store status info of targeted icon
            StatusIcon.GetItem(targetRow, targetCol ,info );
 
            // Store actual skill info and make sure it is exists
            if (GetSkillInfo(info.ClassID, info.Level, skillInfo))
            {
                // Request server to stop skill effect
                // Usage: _dispel:<int:skill_id>,<int :skill_level>
                // Example: _dispel:313,8
                RequestBypassToServer("dispelBuff_"$string(skillInfo.SkillID));
            }
        }
    }
}
Просто подумал вдруг у кого уже есть реализация подобного и кто-то мог бы ей поделиться.
Собно в коде под катом есть проблема, что при клике - дропается и "соседний" баф. Именно в этом у меня сложность (как получить ID и lvl бафа из интерфейса по Alt + Click)
 
Так байпас/хендлер для того и делаеться, что бы ты дергал именно "флажок/имя" кода, а код уже будет делать дело.
посмотри другие к примеру подобные реализации.
 
Код:
function OnLButtonDown(WindowHandle a_WindowHandle, int X, int Y)
{
    local Rect windowBounds;
    local int targetRow;
    local int targetCol;
    local int iconSize;
    local int relX, relY;

    local StatusIconInfo info;
    local SkillInfo skillInfo;

    static float LastClickTime;
    local float CurrentTime;

    CurrentTime = GetGameTime();
    if (CurrentTime - LastClickTime < 0.2)
        return;
    LastClickTime = CurrentTime;

    if (!IsKeyDown(IK_Alt))
        return;

    windowBounds = Me.GetRect();
    iconSize = GetBuffSize();

    relX = X - windowBounds.nX - NSTATUSICON_FRAMESIZE;
    relY = Y - windowBounds.nY - NSTATUSICON_FRAMESIZE;

    if (relX < 0 || relY < 0)
        return;

    targetCol = relX / iconSize;
    targetRow = relY / iconSize;

    if (!StatusIcon.GetItem(targetRow, targetCol, info))
        return;

    if (GetSkillInfo(info.ClassID, info.Level, skillInfo))
    {
        RequestBypassToServer("dispelBuff_" $ string(skillInfo.SkillID));
    }
}

защита от двойного срабатывания
Код:
    static float LastClickTime;
    local float CurrentTime;
    CurrentTime = GetGameTime();
    if (CurrentTime - LastClickTime < 0.2)
        return;
    LastClickTime = CurrentTime;

ваш код без + 2 в размере иконки:
Код:
function OnLButtonDown (WindowHandle a_WindowHandle, int X, int Y)
{
    local Rect windowBounds;
    local int targetRow;
    local int targetCol;
 
    local StatusIconInfo info;
    local SkillInfo skillInfo;
    if (IsKeyDown( IK_Alt ))
    {
        // Find window position
        windowBounds = Me.GetRect();
 
        // Process clicks outside of window frame only
        if (X > (windowBounds.nX + NSTATUSICON_FRAMESIZE))
        {
            //Calc row and col of targeted icon
            targetRow = (Y - windowBounds. nY) / (GetBuffSize());
            targetCol = (X - windowBounds. nX - NSTATUSICON_FRAMESIZE) / (GetBuffSize());
 
            // Store status info of targeted icon
            StatusIcon.GetItem(targetRow, targetCol ,info );
 
            // Store actual skill info and make sure it is exists
            if (GetSkillInfo(info.ClassID, info.Level, skillInfo))
            {
                // Request server to stop skill effect
                // Usage: _dispel:<int:skill_id>,<int :skill_level>
                // Example: _dispel:313,8
                RequestBypassToServer("dispelBuff_"$string(skillInfo.SkillID));
            }
        }
    }
}

ваш код без + 2 в размере иконки (вариант 2):
Код:
function OnLButtonDown (WindowHandle a_WindowHandle, int X, int Y)
{
    local Rect windowBounds;
    local int targetRow;
    local int targetCol;
 
    local StatusIconInfo info;
    local SkillInfo skillInfo;
    if (IsKeyDown( IK_Alt ))
    {
        // Find window position
        windowBounds = Me.GetRect();
 
        // Process clicks outside of window frame only
        if (X > (windowBounds.nX + NSTATUSICON_FRAMESIZE))
        {
            //Calc row and col of targeted icon
           targetRow = (Y - windowBounds.nY - NSTATUSICON_FRAMESIZE) / GetBuffSize();
           targetCol = (X - windowBounds.nX - NSTATUSICON_FRAMESIZE) / GetBuffSize();
 
            // Store status info of targeted icon
            StatusIcon.GetItem(targetRow, targetCol ,info );
 
            // Store actual skill info and make sure it is exists
            if (GetSkillInfo(info.ClassID, info.Level, skillInfo))
            {
                // Request server to stop skill effect
                // Usage: _dispel:<int:skill_id>,<int :skill_level>
                // Example: _dispel:313,8
                RequestBypassToServer("dispelBuff_"$string(skillInfo.SkillID));
            }
        }
    }
}
 
Последнее редактирование:
у меня нет байпасса для снятия бафа со стороны сервера. снятия бафа реализовано пакетом. соот-но я должен получить инфу из Interface.u, отправить её в DLL, и уже из DLL дунуть пакет в сторону сервера. Вопрос как раз как реализовать передачу инфы о снимаемом бафе по Alt+Click.
Ну, через пакетку тоже можно, почему бьі и нет, возьмите какие-то сорки защитьі любой, где есть хуки на пакету и взаимодействие с ней для основьі. Но обьективно, оно нифига особо не оптимизирует в єтом случае. )
 
зачем, ну вот просто зачем насиловать труп мамонта, делать все через жопу и пытаться решить - нерешаемое, почему не взять более свежий клиент и вырезать все что не нужно. 2026 год, Вы все пытаетесь оптимизировать ИТ. (20 лет которому).
И не надо говорить, что игроки "привыкли к чистому ИТ", сейчас нету ни 1 проекта который бы не использовал какой-то кастомный интерфейс.
 
зачем, ну вот просто зачем насиловать труп мамонта, делать все через жопу и пытаться решить - нерешаемое, почему не взять более свежий клиент и вырезать все что не нужно. 2026 год, Вы все пытаетесь оптимизировать ИТ. (20 лет которому).
И не надо говорить, что игроки "привыкли к чистому ИТ", сейчас нету ни 1 проекта который бы не использовал какой-то кастомный интерфейс.
т.е. вместо добавления alt+click предлагаешь поиграть в "щас пакетку опущу на современном клиенте до 746"? у меня PTS сервер, сурсов естессна нет, как мне на него натянуть современный клиент? никак? понятно, проходите мимо, советчик херов.
 
Назад
Сверху Снизу