December 15, 20178 yr 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 December 16, 20178 yr by Matenia
December 16, 20178 yr 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'")
December 16, 20178 yr Author 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?).
December 16, 20178 yr 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 { } };
December 16, 20178 yr Author 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 December 16, 20178 yr by Matenia
Create an account or sign in to comment