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

Упомянутые в теме пользователи:

Показано с 1 по 8 из 8

Тема: TrufiGCD

  1. #1
    Новичок
    Регистрация
    19.05.2017
    Сообщений
    24
    Поблагодарил(а)
    2
    Получено благодарностей: 0 (сообщений: 0).
    Репутация: 0

    TrufiGCD

    Здравствуйте. Возникла идея отслеживать заклинания определенных игроков на бг, нашел аддон TrufiGCD и попробовал его переделать под свои нужды (привязать к ивентам имя персонажа), но столкнулся с проблемой нахождения ID заклинания у заклинателя, у UNIT_SPELLCAST_START отсутствует 5й аргумент, который должен передавать spellid, посему попробовал привязать COMBAT_LOG_EVENT_UNFILTERED у которого 12 аргумент содержит spellid, но столкнулся с проблемой, если я в этот же аддон пытаюсь добавить TrGCDEventFrame:RegisterEvent("COMBAT_LOG_EVENT_UN FILTERED"), то при ивенте SPELL_CAST_START доступны не те аргументы, в которых отсутствует spellid. Но если я сделаю отдельный аддон:
    Код:
    local eventgrub = CreateFrame("Frame")
    eventgrub:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
    eventgrub:SetScript("OnEvent", function(self, event, timestamp, eventType, sourceGUID, sourceName, sourceFlags, destGUID, destName, destFlags, arg11, arg12, ...)
    	if eventType == "SPELL_CAST_START" and sourceName == "Пупкаваськин" then
    		spellIDcur = arg11
    	end
    	if eventType == "SPELL_CAST_SUCCESS" and sourceName == "Пупкаваськин" then
    		spellIDcur = arg11
    	end
    	if eventType == "SPELL_CAST_SUCCESS" and sourceName == "Пупкаваськин" then
    		spellIDcur = arg11
        end
    	print(spellIDcur)
    end)
    то все впорядке, через глобальные spellIDcur я могу дальше в function TrGCDEventHandler добавить local arg5 = spellIDcur, но столкнулся с тем, что события в TrufiGCD обрабатываются раньше, и соответвенно возникает отстование по отображению: при первом запуске вов и первым произнесением заклинания Пупкаваськиным spellIDcur = nil, при втором заклинании spellIDcur возвращает id первого заклинания, при третьем заклинании spellIDcur возвращает id второго заклинания и тд.
    Вопрос к знатокам, как победить?

  2. #2
    Новичок
    Регистрация
    19.05.2017
    Сообщений
    24
    Поблагодарил(а)
    2
    Получено благодарностей: 0 (сообщений: 0).
    Репутация: 0
    Спасибо, работает , не понимаю как лайкнуть

  3. #3
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,201
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399
    Ага, но при юнит ивентах придется получать каким то образом айди для получения иконки спела, это значит, что все спелы придется заполнять руками в массив локализированное название спела = айди , проще через комбатлог, потом при каждом событии сравниваеть гуид унита с гуидом кастер, а гуид юнита забивать в массив при появлении юнита, например пати через PARTY_MEMBER_CHANGED

    Ну или писать инжектор + длл , а после расширять луа стэк своими апи, си функция для получения айди из имени есть

    PHP код:
    inline int SpellIdByName(const charname)
    {
        
    int rank;
        return ((
    int(__cdecl*)(const char*, int*))0x00540200)(name, &rank);

    Это вернет айди по имени спела

    После чего расширяем луа стэк

    PHP код:
    static    lua_State*    (lua_State*)(*(void **)0x00D3F78C);
    typedef void (*Lua_Pushcclosure)(lua_State *Llua_CFunction fn, int n); 
    typedef void (*Lua_Setfield)(lua_State *Lint idx, const chark); 
    void (*Pushcclosure)(lua_State *Llua_CFunction fn, int n) = reinterpret_cast<Lua_Pushcclosure>(0x0084E400);
    void (*Setfield)(lua_State *Lint idx, const chark) = reinterpret_cast<Lua_Setfield>(0x0084E900);

    void RegisterFunc(int callback, const charcommand) {
        
    unsigned char pCodeCave = (unsigned char *)0x00817F90;

        
    DWORD old;
        
    VirtualProtect((LPVOID)pCodeCave5PAGE_EXECUTE_READWRITE, &old);
        *(
    byte *)pCodeCave 0xe9;
        *(
    int *)(pCodeCave 1) = callback - (int)pCodeCave 5;
        
    VirtualProtect((LPVOID)pCodeCave5oldNULL);

        
    Pushcclosure(state, (lua_CFunction)(pCodeCave), 0);
        
    Setfield(stateLUA_GLOBALSINDEXcommand);
    }; 
    Последний раз редактировалось DreamlØlz; 08.06.2017 в 18:23.

  4. #4
    Новичок
    Регистрация
    19.05.2017
    Сообщений
    24
    Поблагодарил(а)
    2
    Получено благодарностей: 0 (сообщений: 0).
    Репутация: 0
    Поэтому в SpellIDs я добавил id всех заклинаний, работает как надо, без нареканий) решение оказалось оч простое

  5. #5
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,201
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399
    Цитата Сообщение от kostyn Посмотреть сообщение
    Поэтому в SpellIDs я добавил id всех заклинаний, работает как надо, без нареканий) решение оказалось оч простое
    Так это придется добавлять все спелы всех классов туда =/

  6. #6
    Новичок
    Регистрация
    19.05.2017
    Сообщений
    24
    Поблагодарил(а)
    2
    Получено благодарностей: 0 (сообщений: 0).
    Репутация: 0
    Да, но если ограничивается все 1-2 классами, то в принципе нормально, хотя метод с инжектированием заинтересовал :)

  7. #7
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,201
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399
    Цитата Сообщение от kostyn Посмотреть сообщение
    Да, но если ограничивается все 1-2 классами, то в принципе нормально, хотя метод с инжектированием заинтересовал :)
    тогда проще 2 массива

    например для пати:
    PHP код:
    local unitToGUID = {}
    local GUIDtoUnit = {}


    local f CreateFrame"frame"
    f:SetScript("OnEvent", function(selfevent, ...)
        -- 
    чистим перед заполнением
        
    for unitguid in nextunitToGUID  do
            
    unitToGUID[unit] = nil
            GUIDtoUnit
    [guid] = nil
        end

        
    for 1do
            
    local unit format("party%d"i)
            if 
    UnitExists(unitthen
                local GUID 
    UnitGUID(unit)
                
    unitToGUID[unit] = GUID
                GUIDtoUnit 
    [GUID] = unit
            end
        end
    end
    )

    f:RegisterEvent"PARTY_MEMBER_CHANGED" 
    А уже от сюда можно делать асоциации по гуиду кастера к пати делая провери на гуид кастера через GUIDtoUnit в комбат лог ивенте. Аналогично как и для PARTY_MEMBER_CHANGED , есть ивенты для таргета, фокуса, арены, рейда и тд. Как минимум не придется руками ничего заполнять.
    Последний раз редактировалось DreamlØlz; 08.06.2017 в 18:50.

  8. #8
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,201
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399
    Цитата Сообщение от decemberx Посмотреть сообщение
    айди есть, в таблицы SpellIDs, значит есть иконка. local spell,rank,icon = GetSpellInfo(spellID)
    если нужны все спеллы, просто фильтр rank можно убрать.


    слишком много там не нужной инфы.
    В одном случае куча ненужной инфы, в другом куча спелов забивать руками и куча лишних итераций =)

Похожие темы

  1. trufigcd 3.3.5
    от Полоумный в разделе Аддоны
    Ответов: 20
    Последнее сообщение: 23.02.2020, 05:12

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •