Jump to content

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
https://wrobot.eu/forums/topic/8011-stop-quest-turn-in-and-inject-my-own-code/
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'")

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?).

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 { }
        };

 

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

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...