취미/게임

와우(wow) 리치왕의 분노 (3.3.5) 퀘스트 자동 수락 및 완료 애드온

soulowner 2025. 8. 11. 06:42
반응형

wow\interface\AddOns\ 폴더 안에 AutoQuest 폴더를 만듭니다.

AutoQuest.zip
0.00MB



AutoQuest.toc

## Interface: 30300
## Title: AutoQuest
## Notes: 자동 퀘스트 수락 및 완료
## Author: Soulowner
## Version: 1.0
AutoQuest.lua

 

AutoQuest.lua

-- 딜레이 함수
local function Delay(delay, func)
    local waitFrame = CreateFrame("Frame")
    waitFrame.time = delay
    waitFrame:SetScript("OnUpdate", function(self, elapsed)
        self.time = self.time - elapsed
        if self.time <= 0 then
            func()
            self:SetScript("OnUpdate", nil)
        end
    end)
end

-- 안전한 클릭 함수
local function safeClick(button)
    if button and button:IsShown() and button:IsEnabled() then
        button:Click()
    end
end

-- 보상이 하나일 경우 자동 선택
local function autoSelectSingleReward()
    if GetNumQuestChoices() == 1 then
        local rewardButton = QuestInfoRewardButton1
        if rewardButton and rewardButton:IsShown() then
            QuestInfoItem_OnClick(rewardButton)
        end
    end
end

-- 보상 선택 후 완료 버튼 활성화 감지
local function waitForRewardSelection()
    local elapsedTime = 0
    local maxWait = 10  -- 최대 10초 대기
    local interval = 0

    local watcher = CreateFrame("Frame")
    watcher:SetScript("OnUpdate", function(self, elapsed)
        elapsedTime = elapsedTime + elapsed
        interval = interval + elapsed

        if interval < 0.2 then return end
        interval = 0

        if QuestFrameCompleteQuestButton and QuestFrameCompleteQuestButton:IsShown() and QuestFrameCompleteQuestButton:IsEnabled() then
            safeClick(QuestFrameCompleteQuestButton)
            self:SetScript("OnUpdate", nil)
        elseif elapsedTime >= maxWait then
            print("퀘스트 완료 실패: 보상 선택이 감지되지 않음")
            self:SetScript("OnUpdate", nil)
        end
    end)
end

-- 보상 클릭 후 완료 버튼 자동 클릭을 위한 후킹
hooksecurefunc("QuestInfoItem_OnClick", function()
    Delay(0.2, function()
        if QuestFrameCompleteQuestButton and QuestFrameCompleteQuestButton:IsShown() and QuestFrameCompleteQuestButton:IsEnabled() then
            safeClick(QuestFrameCompleteQuestButton)
        end
    end)
end)

-- 이벤트 처리 프레임 생성
local f = CreateFrame("Frame")
f:RegisterEvent("GOSSIP_SHOW")
f:RegisterEvent("QUEST_DETAIL")
f:RegisterEvent("QUEST_PROGRESS")
f:RegisterEvent("QUEST_COMPLETE")

f:SetScript("OnEvent", function(_, event)
    if event == "GOSSIP_SHOW" then
        local available = GetNumGossipAvailableQuests()
        local active = GetNumGossipActiveQuests()

        -- 단일 퀘스트 자동 선택 (0.5초 지연)
        if available + active == 1 then
            Delay(1.0, function()
                if available == 1 then
                    SelectGossipAvailableQuest(1)
                elseif active == 1 then
                    SelectGossipActiveQuest(1)
                end
            end)
        end

    elseif event == "QUEST_DETAIL" then
        Delay(0.1, function()
            safeClick(QuestFrameAcceptButton)
        end)

    elseif event == "QUEST_PROGRESS" then
        Delay(0.1, function()
            safeClick(QuestFrameCompleteButton)
        end)

    elseif event == "QUEST_COMPLETE" then
        if GetNumQuestChoices() == 1 then
            autoSelectSingleReward()
            Delay(0.2, function()
                safeClick(QuestFrameCompleteQuestButton)
            end)
        else
            waitForRewardSelection()
        end
    end
end)

 

반응형