Jump to content

Stop quest turn in and inject my own code?


Matenia

Recommended Posts

Hey @Droidz,

currently, I'm trying to execute my own code instead of letting wRobot finish the quest (very last step - select item and complete quest).
I've been doing it like this:

EventsLua.AttachEventLua((LuaEventsId) Enum.Parse(typeof(LuaEventsId), "QUEST_COMPLETE"), QuestCompleteHandler);
private static void QuestCompleteHandler(object context)
{
  PluginLog.Log("About to complete quest - INTERCEPT!");
  SelectQuestItem();
}

private static  void SelectQuestItem()
{
  //my logic to turn in quest
  Lua.LuaDoString($@"
                  QuestRewardItem{index}:Click();
                  QuestFrameCompleteQuestButton:Click();
  ");
}

However, it seems wRobot will still be faster in turning in the quest and although I can correctly log which is the best item to choose, wRobot will select another item and finish the quest.
If I run this code in wRotation and manually open the quest dialog, it works 100%.

How can I stop the quester from turning it at that point? I've tried using Products.InPause = true and pausing the bot before selecting the quest item myself, but it doesn't seem to work.

Edited by Matenia
Link to comment
Share on other sites

Hello, try to use ingame lua event like:

f  = CreateFrame('Frame')
f:RegisterAllEvents()
f:SetScript('OnEvent',
    function()
        if event and tostring(event) == 'QUEST_COMPLETE' then
            QuestRewardItem{index}:Click();
            QuestFrameCompleteQuestButton:Click();
        end
    end
)

(use random name for "f" and "'Frame'")

Link to comment
Share on other sites

16 minutes ago, Droidz said:

Hello, try to use ingame lua event like:


f  = CreateFrame('Frame')
f:RegisterAllEvents()
f:SetScript('OnEvent',
    function()
        if event and tostring(event) == 'QUEST_COMPLETE' then
            QuestRewardItem{index}:Click();
            QuestFrameCompleteQuestButton:Click();
        end
    end
)

(use random name for "f" and "'Frame'")

This does not work, because I rely in C# to parse item code from quest items.
I will try to hook QuestFrameCompleteQuestButton.Click and see if I can prevent the original click by wRobot (does wRobot use memory writing or Lua to achieve this?).

Link to comment
Share on other sites

WRobot use lua to turnin quest.

You can try code like: 

        ulong lastTarget = 0;
        wManager.Events.InteractEvents.OnInteractPulse += (target, cancelable) =>
        {
            try
            {
                if (lastTarget == target)
                    return;

                var o = ObjectManager.GetObjectByGuid(target);
                if (o.IsValid && o.Type == WoWObjectType.Unit)
                {
                    var unit = new WoWUnit(o.GetBaseAddress);
                    if (unit.IsValid && unit.NpcMarker == NpcMarker.YellowQuestion)
                    {
                        lastTarget = target;
                        Interact.InteractGameObject(target);
                        // your turnin code here
                    }
                }
            }
            catch { }
        };
    }

or

        ulong lastTarget = 0;
        wManager.Events.InteractEvents.OnInteractPulse += (target, cancelable) =>
        {
            try
            {
                if (lastTarget == target)
                    return;

                if (!Logging.Status.StartsWith("Quester > TurnIn"))
                    return;

                var o = ObjectManager.GetObjectByGuid(target);
                if (o.IsValid && o.Type == WoWObjectType.Unit)
                {
                    var unit = new WoWUnit(o.GetBaseAddress);
                    if (unit.IsValid)
                    {
                        lastTarget = target;
                        cancelable.Cancel = true;
                        Interact.InteractGameObject(target);
                        // your turnin code here
                    }
                }
            }
            catch { }
        };

 

Link to comment
Share on other sites

How does wRobot turn in a quest using Lua? Can you give me an example, please?
I wrote a hook in Lua to prevent wRobot from turning in fast. 

The problem is, it works perfectly if I "click" on the button (by mouse) ingame or call QuestFrameCompleteButton:Click() but it doesn't work when Quest product.

Even calling QuestFrameCompleteQuestButton:Disable() - the bot will STILL turn the quest in.
Edit: I found out wRobot uses GetQuestReward, so it's possible to hook it using this:

_GetQuestReward = GetQuestReward;
                function GetQuestReward(index, force)
                    if(force) then
                        return _GetQuestReward(index);
                    else
                        C_Timer.After(1000, function()
                            DEFAULT_CHAT_FRAME:AddMessage('Delay quest turn in by 1000ms');
                            return _GetQuestReward(index);
                        end);
                    end
                end
Lua.LuaDoString(@"
            local C_Timer = CreateFrame(""Frame"", ""C_Timer"", UIParent);
            C_Timer:Show();
            C_Timer.schedule = {};
            C_Timer:SetScript(""OnUpdate"", function(self, elapsed)
                self = C_Timer;
                elapsed = 1/GetFramerate();

                for timestamp, callback in pairs(self.schedule) do
                    if tonumber(timestamp) <= GetTime() then
                        callback();
                        self.schedule[timestamp] = nil;
                    end
                end
            end);
            
            C_Timer.After = function(duration, callback)
                C_Timer.schedule[tonumber(GetTime() + (duration / 1000))] = callback;
            end

            _OriginalQuestCompleteOnClick = QuestFrameCompleteQuestButton:GetScript(""OnClick"");
            --_OriginalQuestCompleteClick = QuestFrameCompleteQuestButton.Click;
            function hook_QuestComplete(self, button, arg2, arg3)
                self = this;
                if (button == ""FORCE"") then
                    DEFAULT_CHAT_FRAME:AddMessage('Forcing quest acceptance!');
                    --_OriginalQuestCompleteClick(self, button);
                    _OriginalQuestCompleteOnClick(self, button);
                else       
                    C_Timer.After(1000, function()
                        DEFAULT_CHAT_FRAME:AddMessage('Delay quest turn in by 1000ms');
                        --_OriginalQuestCompleteClick(self, button);
                        _OriginalQuestCompleteOnClick(self, button);
                    end);    
                end
            end
            QuestFrameCompleteQuestButton:SetScript(""OnClick"", hook_QuestComplete);
            --QuestFrameCompleteQuestButton.Click = hookQuestComplete;
            DEFAULT_CHAT_FRAME:AddMessage('Quest hook initiated');
        ");

 

Edited by Matenia
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...